@juadz/knex 0.5.1 → 0.5.4-beta2
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/.turbo/turbo-build.log +4 -0
- package/build/basic.d.ts +3 -2
- package/build/basic.js +74 -163
- package/build/index.js +1 -1
- package/build/list.js +124 -174
- package/build/list.test.js +55 -109
- package/build/types.d.ts +1 -0
- package/build/types.js +2 -0
- package/package.json +3 -3
- package/src/basic.ts +25 -23
- package/src/list.test.ts +8 -4
- package/src/list.ts +18 -17
- package/tsconfig.json +4 -0
package/build/basic.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import { IDataRecord, IDataRepositoryProvider
|
|
1
|
+
import { IDataRecord, IDataRepositoryProvider } from "@juadz/core";
|
|
2
2
|
import { Knex } from "knex";
|
|
3
|
-
|
|
3
|
+
import { output, ZodObject, ZodRawShape } from "zod";
|
|
4
|
+
export declare function KnexProvider<Shape extends ZodRawShape, Schema extends ZodObject<Shape>, T extends IDataRecord = output<Schema> & IDataRecord>(dataTableName: string, schema: Schema, connection: Knex): IDataRepositoryProvider<T>;
|
package/build/basic.js
CHANGED
|
@@ -1,171 +1,82 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
50
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
51
|
-
if (ar || !(i in from)) {
|
|
52
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
53
|
-
ar[i] = from[i];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
57
|
-
};
|
|
58
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
3
|
exports.KnexProvider = KnexProvider;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
case 3:
|
|
116
|
-
inserted = _a.sent();
|
|
117
|
-
insertedId = inserted[0];
|
|
118
|
-
_a.label = 4;
|
|
119
|
-
case 4: return [4 /*yield*/, get(insertedId)];
|
|
120
|
-
case 5:
|
|
121
|
-
insertedData = _a.sent();
|
|
122
|
-
return [2 /*return*/, insertedData];
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}); };
|
|
126
|
-
var replace = function (id, params_) { return __awaiter(_this, void 0, void 0, function () {
|
|
127
|
-
var params, fields, values, insertedData;
|
|
128
|
-
return __generator(this, function (_a) {
|
|
129
|
-
switch (_a.label) {
|
|
130
|
-
case 0:
|
|
131
|
-
params = __assign({ id: id }, params_);
|
|
132
|
-
fields = [];
|
|
133
|
-
values = [];
|
|
134
|
-
Object.keys(params).forEach(function (f) {
|
|
135
|
-
fields.push("`".concat(f, "`=?"));
|
|
136
|
-
values.push(params[f]);
|
|
137
|
-
});
|
|
138
|
-
return [4 /*yield*/, connection.raw("REPLACE INTO `".concat(tableName, "` SET ").concat(fields.join(", "), " WHERE id=?"), __spreadArray(__spreadArray([], values, true), [
|
|
139
|
-
id, // Ensure the ID is at the end for the WHERE clause
|
|
140
|
-
], false))];
|
|
141
|
-
case 1:
|
|
142
|
-
_a.sent();
|
|
143
|
-
return [4 /*yield*/, get(id)];
|
|
144
|
-
case 2:
|
|
145
|
-
insertedData = _a.sent();
|
|
146
|
-
return [2 /*return*/, insertedData];
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
}); };
|
|
150
|
-
var delete_ = function (id) { return __awaiter(_this, void 0, void 0, function () {
|
|
151
|
-
var result;
|
|
152
|
-
return __generator(this, function (_a) {
|
|
153
|
-
switch (_a.label) {
|
|
154
|
-
case 0: return [4 /*yield*/, connection(tableName).where("id", id).delete()];
|
|
155
|
-
case 1:
|
|
156
|
-
result = _a.sent();
|
|
157
|
-
return [2 /*return*/, result];
|
|
158
|
-
}
|
|
4
|
+
const core_1 = require("@juadz/core");
|
|
5
|
+
const list_1 = require("./list");
|
|
6
|
+
function KnexProvider(dataTableName, schema, connection) {
|
|
7
|
+
// schema.name = schema.name || dataTableName;
|
|
8
|
+
const flags = (0, core_1.flagPaths)(schema);
|
|
9
|
+
const searchableFields = flags.$search || [];
|
|
10
|
+
const filterableFields = flags.$filter || [];
|
|
11
|
+
const sortableFields = flags.$sort || [];
|
|
12
|
+
const get = async (id) => {
|
|
13
|
+
const c = await connection(dataTableName)
|
|
14
|
+
.select("*")
|
|
15
|
+
.where("id", id)
|
|
16
|
+
.first();
|
|
17
|
+
return c;
|
|
18
|
+
};
|
|
19
|
+
const update = async (id, patch) => {
|
|
20
|
+
await connection(dataTableName).where("id", id).update(patch);
|
|
21
|
+
return await get(id);
|
|
22
|
+
};
|
|
23
|
+
const create = async (params_) => {
|
|
24
|
+
const params = {
|
|
25
|
+
...params_,
|
|
26
|
+
};
|
|
27
|
+
let insertedId;
|
|
28
|
+
if (connection.client.config.client === "sqlite3") {
|
|
29
|
+
// SQLite does not support `.returning('id')`
|
|
30
|
+
const inserted = await connection(dataTableName)
|
|
31
|
+
.returning("id")
|
|
32
|
+
.insert({
|
|
33
|
+
...params,
|
|
34
|
+
});
|
|
35
|
+
insertedId = inserted[0].id;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// For other SQL clients that support `.returning('id')`
|
|
39
|
+
const inserted = await connection(dataTableName)
|
|
40
|
+
.returning("id")
|
|
41
|
+
.insert({
|
|
42
|
+
...params,
|
|
43
|
+
});
|
|
44
|
+
insertedId = inserted[0];
|
|
45
|
+
}
|
|
46
|
+
const insertedData = await get(insertedId);
|
|
47
|
+
return insertedData;
|
|
48
|
+
};
|
|
49
|
+
const replace = async (id, params_) => {
|
|
50
|
+
const params = {
|
|
51
|
+
id,
|
|
52
|
+
...params_,
|
|
53
|
+
};
|
|
54
|
+
const fields = [];
|
|
55
|
+
const values = [];
|
|
56
|
+
Object.keys(params).forEach((f) => {
|
|
57
|
+
fields.push(`\`${f}\`=?`);
|
|
58
|
+
values.push(params[f]);
|
|
159
59
|
});
|
|
160
|
-
|
|
161
|
-
|
|
60
|
+
await connection.raw(`REPLACE INTO \`${dataTableName}\` SET ${fields.join(", ")} WHERE id=?`, [
|
|
61
|
+
...values,
|
|
62
|
+
id, // Ensure the ID is at the end for the WHERE clause
|
|
63
|
+
]);
|
|
64
|
+
const insertedData = await get(id);
|
|
65
|
+
return insertedData;
|
|
66
|
+
};
|
|
67
|
+
const delete_ = async (id) => {
|
|
68
|
+
const result = await connection(dataTableName).where("id", id).delete();
|
|
69
|
+
return result;
|
|
70
|
+
};
|
|
71
|
+
const list = (0, list_1.KnexQueryList)(connection, dataTableName, searchableFields, filterableFields, sortableFields);
|
|
162
72
|
return {
|
|
163
|
-
schema
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
73
|
+
schema,
|
|
74
|
+
name: dataTableName,
|
|
75
|
+
get,
|
|
76
|
+
replace,
|
|
77
|
+
update,
|
|
78
|
+
create,
|
|
168
79
|
delete: delete_,
|
|
169
|
-
list
|
|
80
|
+
list,
|
|
170
81
|
};
|
|
171
82
|
}
|
package/build/index.js
CHANGED
|
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
|
|
17
|
+
const basic_1 = require("./basic");
|
|
18
18
|
exports.default = basic_1.KnexProvider;
|
|
19
19
|
__exportStar(require("./list"), exports);
|
package/build/list.js
CHANGED
|
@@ -1,188 +1,138 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
4
|
};
|
|
52
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
6
|
exports.KnexQueryList = KnexQueryList;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
7
|
+
// import dayjs from "dayjs";
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
const debug = (0, debug_1.default)("juadz:knex:list");
|
|
57
10
|
function KnexQueryList(knex, tableName, searchableFields, filterableFields, sortableFields) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
var field = f.field, op = f.op, value = f.value;
|
|
70
|
-
if (field === "_search" && op === "=") {
|
|
71
|
-
query.andWhere(function (query) {
|
|
72
|
-
(searchableFields || []).forEach(function (k) {
|
|
73
|
-
query.orWhere(k, "LIKE", "%".concat("".concat(value).replace(/(["'$%]+)/g, ""), "%"));
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (!filterableFields.includes(field)) {
|
|
79
|
-
debug("Field \"".concat(field, "\" is not filterable"));
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
var values = [];
|
|
83
|
-
if (Array.isArray(value)) {
|
|
84
|
-
values = value;
|
|
85
|
-
}
|
|
86
|
-
switch (op) {
|
|
87
|
-
case "=":
|
|
88
|
-
query.where(field, value);
|
|
89
|
-
return;
|
|
90
|
-
case "!=":
|
|
91
|
-
query.whereNot(field, value);
|
|
92
|
-
return;
|
|
93
|
-
case ">":
|
|
94
|
-
case ">=":
|
|
95
|
-
case "<":
|
|
96
|
-
case "<=":
|
|
97
|
-
query.where(field, op, value);
|
|
98
|
-
return;
|
|
99
|
-
case "in":
|
|
100
|
-
query.whereIn(field, values);
|
|
101
|
-
return;
|
|
102
|
-
case "!in":
|
|
103
|
-
query.whereNotIn(field, values);
|
|
104
|
-
return;
|
|
105
|
-
case "contains":
|
|
106
|
-
query.whereILike(field, "%".concat(value, "%"));
|
|
107
|
-
return;
|
|
108
|
-
case "!contains":
|
|
109
|
-
query.whereRaw("`".concat(field, "` NOT LIKE ?"), [
|
|
110
|
-
"%".concat(value, "%"),
|
|
111
|
-
]);
|
|
112
|
-
return;
|
|
113
|
-
case "between":
|
|
114
|
-
if (query.client.config.client === "sqlite3") {
|
|
115
|
-
query.whereBetween(field, [
|
|
116
|
-
(0, dayjs_1.default)(values[0]).format("YYYY-MM-DD HH:mm:ss"),
|
|
117
|
-
(0, dayjs_1.default)(values[1]).format("YYYY-MM-DD HH:mm:ss"),
|
|
118
|
-
]);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
query.whereBetween(field, [
|
|
122
|
-
values[0],
|
|
123
|
-
values[1],
|
|
124
|
-
]);
|
|
125
|
-
}
|
|
126
|
-
return;
|
|
127
|
-
case "!between":
|
|
128
|
-
query.whereNotBetween(field, [
|
|
129
|
-
values[0],
|
|
130
|
-
values[1],
|
|
131
|
-
]);
|
|
132
|
-
return;
|
|
133
|
-
case "null":
|
|
134
|
-
query.whereNull(field);
|
|
135
|
-
return;
|
|
136
|
-
case "!null":
|
|
137
|
-
query.whereNotNull(field);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
11
|
+
return async (params) => {
|
|
12
|
+
const query = knex(tableName);
|
|
13
|
+
if (params.filter.length > 0) {
|
|
14
|
+
debug("Applying filters:", params.filter);
|
|
15
|
+
query.where((query) => {
|
|
16
|
+
params.filter.forEach((f) => {
|
|
17
|
+
const { field, op, value } = f;
|
|
18
|
+
if (field === "_search" && (op === "=" || op === "contains")) {
|
|
19
|
+
query.andWhere((query) => {
|
|
20
|
+
(searchableFields || []).forEach((k) => {
|
|
21
|
+
query.orWhere(k, "LIKE", `%${`${value}`.replace(/(["'$%]+)/g, "")}%`);
|
|
140
22
|
});
|
|
141
23
|
});
|
|
24
|
+
return;
|
|
142
25
|
}
|
|
143
|
-
|
|
144
|
-
debug("
|
|
26
|
+
if (!filterableFields.includes(field)) {
|
|
27
|
+
debug(`Field "${field}" is not filterable`);
|
|
28
|
+
return;
|
|
145
29
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
var pass = sortableFields.includes(s.field);
|
|
150
|
-
if (!pass) {
|
|
151
|
-
debug("Field \"".concat(s.field, "\" is not sortable"));
|
|
152
|
-
}
|
|
153
|
-
return pass;
|
|
154
|
-
})
|
|
155
|
-
.map(function (s) { return ({
|
|
156
|
-
column: s.field,
|
|
157
|
-
order: s.direction,
|
|
158
|
-
}); });
|
|
159
|
-
if (process.env.NODE_ENV !== "production") {
|
|
160
|
-
sql = query
|
|
161
|
-
.clone()
|
|
162
|
-
.offset(params.range.offset)
|
|
163
|
-
.limit(params.range.limit)
|
|
164
|
-
.orderBy(sorter)
|
|
165
|
-
.toString();
|
|
166
|
-
debug("SQL Query:", sql);
|
|
30
|
+
let values = [];
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
values = value;
|
|
167
33
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
34
|
+
switch (op) {
|
|
35
|
+
case "=":
|
|
36
|
+
query.where(field, value);
|
|
37
|
+
return;
|
|
38
|
+
case "!=":
|
|
39
|
+
query.whereNot(field, value);
|
|
40
|
+
return;
|
|
41
|
+
case ">":
|
|
42
|
+
case ">=":
|
|
43
|
+
case "<":
|
|
44
|
+
case "<=":
|
|
45
|
+
query.where(field, op, value);
|
|
46
|
+
return;
|
|
47
|
+
case "in":
|
|
48
|
+
query.whereIn(field, values);
|
|
49
|
+
return;
|
|
50
|
+
case "!in":
|
|
51
|
+
query.whereNotIn(field, values);
|
|
52
|
+
return;
|
|
53
|
+
case "contains":
|
|
54
|
+
query.whereILike(field, `%${value}%`);
|
|
55
|
+
return;
|
|
56
|
+
case "!contains":
|
|
57
|
+
query.whereRaw(`\`${field}\` NOT LIKE ?`, [
|
|
58
|
+
`%${value}%`,
|
|
59
|
+
]);
|
|
60
|
+
return;
|
|
61
|
+
case "between":
|
|
62
|
+
query.whereBetween(field, [values[0], values[1]]);
|
|
63
|
+
//if (query.client.config.client === "sqlite3") {
|
|
64
|
+
// query.whereBetween(field, [
|
|
65
|
+
// dayjs(values[0]).format(
|
|
66
|
+
// "YYYY-MM-DD HH:mm:ss",
|
|
67
|
+
// ),
|
|
68
|
+
// dayjs(values[1]).format(
|
|
69
|
+
// "YYYY-MM-DD HH:mm:ss",
|
|
70
|
+
// ),
|
|
71
|
+
// ]);
|
|
72
|
+
//} else {
|
|
73
|
+
// query.whereBetween(field, [
|
|
74
|
+
// values[0],
|
|
75
|
+
// values[1],
|
|
76
|
+
// ]);
|
|
77
|
+
//}
|
|
78
|
+
return;
|
|
79
|
+
case "!between":
|
|
80
|
+
query.whereNotBetween(field, [
|
|
81
|
+
values[0],
|
|
82
|
+
values[1],
|
|
83
|
+
]);
|
|
84
|
+
return;
|
|
85
|
+
case "null":
|
|
86
|
+
query.whereNull(field);
|
|
87
|
+
return;
|
|
88
|
+
case "!null":
|
|
89
|
+
query.whereNotNull(field);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
debug("No filters applied");
|
|
97
|
+
}
|
|
98
|
+
let sql = null;
|
|
99
|
+
const sorter = params.sort
|
|
100
|
+
.filter((s) => {
|
|
101
|
+
const pass = sortableFields.includes(s.field);
|
|
102
|
+
if (!pass) {
|
|
103
|
+
debug(`Field "${s.field}" is not sortable`);
|
|
185
104
|
}
|
|
186
|
-
|
|
187
|
-
|
|
105
|
+
return pass;
|
|
106
|
+
})
|
|
107
|
+
.map((s) => ({
|
|
108
|
+
column: s.field,
|
|
109
|
+
order: s.direction,
|
|
110
|
+
}));
|
|
111
|
+
if (process.env.NODE_ENV !== "production") {
|
|
112
|
+
sql = query
|
|
113
|
+
.clone()
|
|
114
|
+
.offset(params.range.offset)
|
|
115
|
+
.limit(params.range.limit)
|
|
116
|
+
.orderBy(sorter)
|
|
117
|
+
.toString();
|
|
118
|
+
debug("SQL Query:", sql);
|
|
119
|
+
}
|
|
120
|
+
const data = await query
|
|
121
|
+
.clone()
|
|
122
|
+
.offset(params.range.offset)
|
|
123
|
+
.limit(params.range.limit)
|
|
124
|
+
.orderBy(sorter);
|
|
125
|
+
debug("Data fetched:", data.length, "rows");
|
|
126
|
+
const totalRow = await query
|
|
127
|
+
.clone()
|
|
128
|
+
.clearSelect()
|
|
129
|
+
.count("* AS T");
|
|
130
|
+
const total = totalRow && totalRow.length ? totalRow[0].T : 0;
|
|
131
|
+
debug("Total rows:", total);
|
|
132
|
+
return {
|
|
133
|
+
total,
|
|
134
|
+
data,
|
|
135
|
+
...(sql ? { sql } : {}),
|
|
136
|
+
};
|
|
137
|
+
};
|
|
188
138
|
}
|
package/build/list.test.js
CHANGED
|
@@ -1,119 +1,65 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
4
|
};
|
|
41
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
beforeAll(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
table.string("last_name");
|
|
60
|
-
table.integer("age");
|
|
61
|
-
table.string("tool");
|
|
62
|
-
})];
|
|
63
|
-
case 1:
|
|
64
|
-
_a.sent();
|
|
65
|
-
return [4 /*yield*/, knex("users").insert([
|
|
66
|
-
{ name: "Peter", last_name: "Parker", age: 11, tool: "ruler" },
|
|
67
|
-
{ name: "Mark", last_name: "Olivier", age: 18, tool: "pencil" },
|
|
68
|
-
{ name: "Andre", last_name: "Hudson", age: 18, tool: "pen" },
|
|
69
|
-
{ name: "Tony", last_name: "Oliver", age: 18, tool: "pen" },
|
|
70
|
-
{ name: "Bruce", last_name: "Pedersen", age: 13, tool: "crayon" },
|
|
71
|
-
])];
|
|
72
|
-
case 2:
|
|
73
|
-
_a.sent();
|
|
74
|
-
return [2 /*return*/];
|
|
75
|
-
}
|
|
6
|
+
const list_1 = require("./list");
|
|
7
|
+
const knex_1 = __importDefault(require("knex"));
|
|
8
|
+
let knex;
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
knex = (0, knex_1.default)({
|
|
11
|
+
client: "sqlite3",
|
|
12
|
+
connection: {
|
|
13
|
+
filename: ":memory:",
|
|
14
|
+
},
|
|
15
|
+
useNullAsDefault: true,
|
|
16
|
+
});
|
|
17
|
+
await knex.schema.createTable("users", (table) => {
|
|
18
|
+
table.increments();
|
|
19
|
+
table.string("name");
|
|
20
|
+
table.string("last_name");
|
|
21
|
+
table.integer("age");
|
|
22
|
+
table.string("tool");
|
|
76
23
|
});
|
|
77
|
-
|
|
78
|
-
|
|
24
|
+
await knex("users").insert([
|
|
25
|
+
{ name: "Peter", last_name: "Parker", age: 11, tool: "ruler" },
|
|
26
|
+
{ name: "Mark", last_name: "Olivier", age: 18, tool: "pencil" },
|
|
27
|
+
{ name: "Andre", last_name: "Hudson", age: 18, tool: "pen" },
|
|
28
|
+
{ name: "Tony", last_name: "Oliver", age: 18, tool: "pen" },
|
|
29
|
+
{ name: "Bruce", last_name: "Pedersen", age: 13, tool: "crayon" },
|
|
30
|
+
]);
|
|
31
|
+
});
|
|
32
|
+
afterAll(() => {
|
|
79
33
|
// The test uses an in-memory SQLite database (:memory:), so /tmp/test.sqlite is never created. Remove or update this cleanup to match the actual test database.
|
|
80
34
|
// unlink('/tmp/test.sqlite', () => {});
|
|
81
35
|
});
|
|
82
|
-
test("KnexQueryList",
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
last_name: "Parker",
|
|
104
|
-
age: 11,
|
|
105
|
-
tool: "ruler",
|
|
106
|
-
});
|
|
107
|
-
expect(result.data[1]).toMatchObject({
|
|
108
|
-
name: "Bruce",
|
|
109
|
-
last_name: "Pedersen",
|
|
110
|
-
age: 13,
|
|
111
|
-
tool: "crayon",
|
|
112
|
-
});
|
|
113
|
-
r = result;
|
|
114
|
-
debug = r.debug;
|
|
115
|
-
expect(debug).toBe("select * from `users` where ((`name` like '%Pe%' or `last_name` like '%Pe%') and `age` between 8 and 17 and `tool` not in ('pencil', 'pen')) order by `age` ASC limit 10");
|
|
116
|
-
return [2 /*return*/];
|
|
117
|
-
}
|
|
36
|
+
test("KnexQueryList", async () => {
|
|
37
|
+
const func = (0, list_1.KnexQueryList)(knex, "users", ["name", "last_name"], ["age", "tool"], ["age"]);
|
|
38
|
+
const result = await func({
|
|
39
|
+
resource: "users",
|
|
40
|
+
range: { offset: 0, limit: 10 },
|
|
41
|
+
sort: [{ field: "age", direction: "ASC" }],
|
|
42
|
+
filter: [
|
|
43
|
+
{ field: "_search", op: "=", value: "Pe" },
|
|
44
|
+
{ field: "age", op: "between", value: [8, 17] },
|
|
45
|
+
{ field: "tool", op: "!in", value: ["pencil", "pen"] },
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
const r = result;
|
|
49
|
+
const { sql: debug } = r;
|
|
50
|
+
expect(debug).toBe("select * from `users` where ((`name` like '%Pe%' or `last_name` like '%Pe%') and `age` between 8 and 17 and `tool` not in ('pencil', 'pen')) order by `age` ASC limit 10");
|
|
51
|
+
expect(result.total).toBe(2);
|
|
52
|
+
expect(result.data[0]).toMatchObject({
|
|
53
|
+
name: "Peter",
|
|
54
|
+
last_name: "Parker",
|
|
55
|
+
age: 11,
|
|
56
|
+
tool: "ruler",
|
|
118
57
|
});
|
|
119
|
-
|
|
58
|
+
expect(result.data[1]).toMatchObject({
|
|
59
|
+
name: "Bruce",
|
|
60
|
+
last_name: "Pedersen",
|
|
61
|
+
age: 13,
|
|
62
|
+
tool: "crayon",
|
|
63
|
+
});
|
|
64
|
+
expect(debug).toBe("select * from `users` where ((`name` like '%Pe%' or `last_name` like '%Pe%') and `age` between 8 and 17 and `tool` not in ('pencil', 'pen')) order by `age` ASC limit 10");
|
|
65
|
+
});
|
package/build/types.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/build/types.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juadz/knex",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4-beta2",
|
|
4
4
|
"description": "Juadz: Rapid restful API development",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"author": "hereblur",
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "github.com/hereblur/juadz
|
|
23
|
+
"url": "github.com/hereblur/juadz.git"
|
|
24
24
|
},
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"devDependencies": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"zod": "^4"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"@juadz/core": "
|
|
51
|
+
"@juadz/core": "0.5.4-beta2",
|
|
52
52
|
"debug": "^4.4.0",
|
|
53
53
|
"zod": "^4"
|
|
54
54
|
},
|
package/src/basic.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { IDataRecord, IDataRepositoryProvider
|
|
1
|
+
import { flagPaths, IDataRecord, IDataRepositoryProvider } from "@juadz/core";
|
|
2
2
|
import { Knex } from "knex";
|
|
3
3
|
import { KnexQueryList } from "./list";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { output, ZodObject, ZodRawShape } from "zod";
|
|
5
|
+
|
|
6
|
+
export function KnexProvider<
|
|
7
|
+
Shape extends ZodRawShape,
|
|
8
|
+
Schema extends ZodObject<Shape>,
|
|
9
|
+
T extends IDataRecord = output<Schema> & IDataRecord,
|
|
10
|
+
>(
|
|
11
|
+
dataTableName: string,
|
|
12
|
+
schema: Schema,
|
|
7
13
|
connection: Knex,
|
|
8
|
-
dataTableName?: string,
|
|
9
14
|
): IDataRepositoryProvider<T> {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
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]);
|
|
15
|
+
// schema.name = schema.name || dataTableName;
|
|
16
|
+
const flags = flagPaths(schema);
|
|
17
|
+
|
|
18
|
+
const searchableFields = flags.$search || [];
|
|
19
|
+
const filterableFields = flags.$filter || [];
|
|
20
|
+
const sortableFields = flags.$sort || [];
|
|
21
21
|
|
|
22
22
|
const get = async (id: string | number) => {
|
|
23
|
-
const c = await connection(
|
|
23
|
+
const c = await connection(dataTableName)
|
|
24
24
|
.select("*")
|
|
25
25
|
.where("id", id)
|
|
26
26
|
.first();
|
|
@@ -29,7 +29,7 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
const update = async (id: string | number, patch: object) => {
|
|
32
|
-
await connection(
|
|
32
|
+
await connection(dataTableName).where("id", id).update(patch);
|
|
33
33
|
|
|
34
34
|
return await get(id);
|
|
35
35
|
};
|
|
@@ -43,7 +43,7 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
43
43
|
|
|
44
44
|
if (connection.client.config.client === "sqlite3") {
|
|
45
45
|
// SQLite does not support `.returning('id')`
|
|
46
|
-
const inserted = await connection(
|
|
46
|
+
const inserted = await connection(dataTableName)
|
|
47
47
|
.returning("id")
|
|
48
48
|
.insert({
|
|
49
49
|
...params,
|
|
@@ -52,7 +52,7 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
52
52
|
insertedId = (inserted[0] as unknown as { id: string | number }).id;
|
|
53
53
|
} else {
|
|
54
54
|
// For other SQL clients that support `.returning('id')`
|
|
55
|
-
const inserted = await connection(
|
|
55
|
+
const inserted = await connection(dataTableName)
|
|
56
56
|
.returning("id")
|
|
57
57
|
.insert({
|
|
58
58
|
...params,
|
|
@@ -79,7 +79,7 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
79
79
|
});
|
|
80
80
|
|
|
81
81
|
await connection.raw(
|
|
82
|
-
`REPLACE INTO \`${
|
|
82
|
+
`REPLACE INTO \`${dataTableName}\` SET ${fields.join(", ")} WHERE id=?`,
|
|
83
83
|
[
|
|
84
84
|
...values,
|
|
85
85
|
id, // Ensure the ID is at the end for the WHERE clause
|
|
@@ -92,14 +92,14 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
92
92
|
};
|
|
93
93
|
|
|
94
94
|
const delete_ = async (id: string | number) => {
|
|
95
|
-
const result = await connection(
|
|
95
|
+
const result = await connection(dataTableName).where("id", id).delete();
|
|
96
96
|
|
|
97
97
|
return result;
|
|
98
98
|
};
|
|
99
99
|
|
|
100
100
|
const list = KnexQueryList(
|
|
101
101
|
connection,
|
|
102
|
-
|
|
102
|
+
dataTableName,
|
|
103
103
|
searchableFields,
|
|
104
104
|
filterableFields,
|
|
105
105
|
sortableFields,
|
|
@@ -107,6 +107,8 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
107
107
|
|
|
108
108
|
return {
|
|
109
109
|
schema,
|
|
110
|
+
name: dataTableName,
|
|
111
|
+
|
|
110
112
|
get,
|
|
111
113
|
replace,
|
|
112
114
|
update,
|
package/src/list.test.ts
CHANGED
|
@@ -42,7 +42,7 @@ test("KnexQueryList", async () => {
|
|
|
42
42
|
const func = KnexQueryList(
|
|
43
43
|
knex,
|
|
44
44
|
"users",
|
|
45
|
-
["name", "
|
|
45
|
+
["name", "last_name"],
|
|
46
46
|
["age", "tool"],
|
|
47
47
|
["age"],
|
|
48
48
|
);
|
|
@@ -57,6 +57,12 @@ test("KnexQueryList", async () => {
|
|
|
57
57
|
{ field: "tool", op: "!in", value: ["pencil", "pen"] },
|
|
58
58
|
],
|
|
59
59
|
});
|
|
60
|
+
const r = result as unknown;
|
|
61
|
+
const { sql: debug } = r as DebugObj;
|
|
62
|
+
|
|
63
|
+
expect(debug).toBe(
|
|
64
|
+
"select * from `users` where ((`name` like '%Pe%' or `last_name` like '%Pe%') and `age` between 8 and 17 and `tool` not in ('pencil', 'pen')) order by `age` ASC limit 10",
|
|
65
|
+
);
|
|
60
66
|
|
|
61
67
|
expect(result.total).toBe(2);
|
|
62
68
|
expect(result.data[0]).toMatchObject({
|
|
@@ -72,13 +78,11 @@ test("KnexQueryList", async () => {
|
|
|
72
78
|
tool: "crayon",
|
|
73
79
|
});
|
|
74
80
|
|
|
75
|
-
const r = result as unknown;
|
|
76
|
-
const { debug } = r as DebugObj;
|
|
77
81
|
expect(debug).toBe(
|
|
78
82
|
"select * from `users` where ((`name` like '%Pe%' or `last_name` like '%Pe%') and `age` between 8 and 17 and `tool` not in ('pencil', 'pen')) order by `age` ASC limit 10",
|
|
79
83
|
);
|
|
80
84
|
});
|
|
81
85
|
|
|
82
86
|
interface DebugObj {
|
|
83
|
-
|
|
87
|
+
sql: string;
|
|
84
88
|
}
|
package/src/list.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { QueryListParam, QueryFilter, QueryListFunction } from "@juadz/core";
|
|
2
2
|
|
|
3
3
|
import { Knex } from "knex";
|
|
4
|
-
import dayjs from "dayjs";
|
|
4
|
+
// import dayjs from "dayjs";
|
|
5
5
|
import Debug from "debug";
|
|
6
6
|
|
|
7
7
|
const debug = Debug("juadz:knex:list");
|
|
@@ -29,7 +29,7 @@ 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 (field === "_search" && op === "=") {
|
|
32
|
+
if (field === "_search" && (op === "=" || op === "contains")) {
|
|
33
33
|
query.andWhere((query: Knex) => {
|
|
34
34
|
(searchableFields || []).forEach((k) => {
|
|
35
35
|
query.orWhere(
|
|
@@ -80,21 +80,22 @@ export function KnexQueryList<T>(
|
|
|
80
80
|
]);
|
|
81
81
|
return;
|
|
82
82
|
case "between":
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
83
|
+
query.whereBetween(field, [values[0], values[1]]);
|
|
84
|
+
//if (query.client.config.client === "sqlite3") {
|
|
85
|
+
// query.whereBetween(field, [
|
|
86
|
+
// dayjs(values[0]).format(
|
|
87
|
+
// "YYYY-MM-DD HH:mm:ss",
|
|
88
|
+
// ),
|
|
89
|
+
// dayjs(values[1]).format(
|
|
90
|
+
// "YYYY-MM-DD HH:mm:ss",
|
|
91
|
+
// ),
|
|
92
|
+
// ]);
|
|
93
|
+
//} else {
|
|
94
|
+
// query.whereBetween(field, [
|
|
95
|
+
// values[0],
|
|
96
|
+
// values[1],
|
|
97
|
+
// ]);
|
|
98
|
+
//}
|
|
98
99
|
|
|
99
100
|
return;
|
|
100
101
|
case "!between":
|
package/tsconfig.json
CHANGED
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"rootDir": "src",
|
|
5
5
|
"outDir": "build",
|
|
6
|
+
"noEmit": false,
|
|
6
7
|
"declaration": true,
|
|
7
8
|
"declarationDir": "build",
|
|
8
9
|
"emitDeclarationOnly": false,
|
|
10
|
+
"paths": {
|
|
11
|
+
"@juadz/core": ["../juadz-core/build/index.d.ts"]
|
|
12
|
+
}
|
|
9
13
|
},
|
|
10
14
|
"include": [
|
|
11
15
|
"src/**/*"
|