@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.
@@ -0,0 +1,4 @@
1
+
2
+ yarn run v1.22.22
3
+ $ tsc
4
+ Done in 3.38s.
package/build/basic.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import { IDataRecord, IDataRepositoryProvider, Schema } from "@juadz/core";
1
+ import { IDataRecord, IDataRepositoryProvider } from "@juadz/core";
2
2
  import { Knex } from "knex";
3
- export declare function KnexProvider<T extends IDataRecord>(schema: Schema<T>, connection: Knex, dataTableName?: string): IDataRepositoryProvider<T>;
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
- var list_1 = require("./list");
61
- function KnexProvider(schema, connection, dataTableName) {
62
- var _this = this;
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]; });
73
- var get = function (id) { return __awaiter(_this, void 0, void 0, function () {
74
- var c;
75
- return __generator(this, function (_a) {
76
- switch (_a.label) {
77
- case 0: return [4 /*yield*/, connection(tableName)
78
- .select("*")
79
- .where("id", id)
80
- .first()];
81
- case 1:
82
- c = _a.sent();
83
- return [2 /*return*/, c];
84
- }
85
- });
86
- }); };
87
- var update = function (id, patch) { return __awaiter(_this, void 0, void 0, function () {
88
- return __generator(this, function (_a) {
89
- switch (_a.label) {
90
- case 0: return [4 /*yield*/, connection(tableName).where("id", id).update(patch)];
91
- case 1:
92
- _a.sent();
93
- return [4 /*yield*/, get(id)];
94
- case 2: return [2 /*return*/, _a.sent()];
95
- }
96
- });
97
- }); };
98
- var create = function (params_) { return __awaiter(_this, void 0, void 0, function () {
99
- var params, insertedId, inserted, inserted, insertedData;
100
- return __generator(this, function (_a) {
101
- switch (_a.label) {
102
- case 0:
103
- params = __assign({}, params_);
104
- if (!(connection.client.config.client === "sqlite3")) return [3 /*break*/, 2];
105
- return [4 /*yield*/, connection(tableName)
106
- .returning("id")
107
- .insert(__assign({}, params))];
108
- case 1:
109
- inserted = _a.sent();
110
- insertedId = inserted[0].id;
111
- return [3 /*break*/, 4];
112
- case 2: return [4 /*yield*/, connection(tableName)
113
- .returning("id")
114
- .insert(__assign({}, params))];
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
- var list = (0, list_1.KnexQueryList)(connection, tableName, searchableFields, filterableFields, sortableFields);
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: schema,
164
- get: get,
165
- replace: replace,
166
- update: update,
167
- create: create,
73
+ schema,
74
+ name: dataTableName,
75
+ get,
76
+ replace,
77
+ update,
78
+ create,
168
79
  delete: delete_,
169
- list: 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
- var basic_1 = require("./basic");
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
- var dayjs_1 = __importDefault(require("dayjs"));
55
- var debug_1 = __importDefault(require("debug"));
56
- var debug = (0, debug_1.default)("juadz:knex:list");
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
- var _this = this;
59
- return function (params) { return __awaiter(_this, void 0, void 0, function () {
60
- var query, sql, sorter, data, totalRow, total;
61
- return __generator(this, function (_a) {
62
- switch (_a.label) {
63
- case 0:
64
- query = knex(tableName);
65
- if (params.filter.length > 0) {
66
- debug("Applying filters:", params.filter);
67
- query.where(function (query) {
68
- params.filter.forEach(function (f) {
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
- else {
144
- debug("No filters applied");
26
+ if (!filterableFields.includes(field)) {
27
+ debug(`Field "${field}" is not filterable`);
28
+ return;
145
29
  }
146
- sql = null;
147
- sorter = params.sort
148
- .filter(function (s) {
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
- return [4 /*yield*/, query
169
- .clone()
170
- .offset(params.range.offset)
171
- .limit(params.range.limit)
172
- .orderBy(sorter)];
173
- case 1:
174
- data = _a.sent();
175
- debug("Data fetched:", data.length, "rows");
176
- return [4 /*yield*/, query
177
- .clone()
178
- .clearSelect()
179
- .count("* AS T")];
180
- case 2:
181
- totalRow = _a.sent();
182
- total = totalRow && totalRow.length ? totalRow[0].T : 0;
183
- debug("Total rows:", total);
184
- return [2 /*return*/, __assign({ total: total, data: data }, (sql ? { sql: sql } : {}))];
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
  }
@@ -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
- var list_1 = require("./list");
43
- var knex_1 = __importDefault(require("knex"));
44
- var knex;
45
- beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
46
- return __generator(this, function (_a) {
47
- switch (_a.label) {
48
- case 0:
49
- knex = (0, knex_1.default)({
50
- client: "sqlite3",
51
- connection: {
52
- filename: ":memory:",
53
- },
54
- useNullAsDefault: true,
55
- });
56
- return [4 /*yield*/, knex.schema.createTable("users", function (table) {
57
- table.increments();
58
- table.string("name");
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
- afterAll(function () {
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", function () { return __awaiter(void 0, void 0, void 0, function () {
83
- var func, result, r, debug;
84
- return __generator(this, function (_a) {
85
- switch (_a.label) {
86
- case 0:
87
- func = (0, list_1.KnexQueryList)(knex, "users", ["name", "lastname"], ["age", "tool"], ["age"]);
88
- return [4 /*yield*/, func({
89
- resource: "users",
90
- range: { offset: 0, limit: 10 },
91
- sort: [{ field: "age", direction: "ASC" }],
92
- filter: [
93
- { field: "_search", op: "=", value: "Pe" },
94
- { field: "age", op: "between", value: [8, 17] },
95
- { field: "tool", op: "!in", value: ["pencil", "pen"] },
96
- ],
97
- })];
98
- case 1:
99
- result = _a.sent();
100
- expect(result.total).toBe(2);
101
- expect(result.data[0]).toMatchObject({
102
- name: "Peter",
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
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juadz/knex",
3
- "version": "0.5.1",
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-core.git"
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": "^0.5.0",
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, Schema } from "@juadz/core";
1
+ import { flagPaths, IDataRecord, IDataRepositoryProvider } from "@juadz/core";
2
2
  import { Knex } from "knex";
3
3
  import { KnexQueryList } from "./list";
4
-
5
- export function KnexProvider<T extends IDataRecord>(
6
- schema: Schema<T>,
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
- 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]);
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(tableName)
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(tableName).where("id", id).update(patch);
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(tableName)
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(tableName)
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 \`${tableName}\` SET ${fields.join(", ")} WHERE id=?`,
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(tableName).where("id", id).delete();
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
- tableName,
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", "lastname"],
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
- debug: string;
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
- if (query.client.config.client === "sqlite3") {
84
- query.whereBetween(field, [
85
- dayjs(values[0]).format(
86
- "YYYY-MM-DD HH:mm:ss",
87
- ),
88
- dayjs(values[1]).format(
89
- "YYYY-MM-DD HH:mm:ss",
90
- ),
91
- ]);
92
- } else {
93
- query.whereBetween(field, [
94
- values[0],
95
- values[1],
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/**/*"