@juadz/knex 0.5.1 → 0.5.2

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 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
@@ -57,24 +57,20 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
57
57
  };
58
58
  Object.defineProperty(exports, "__esModule", { value: true });
59
59
  exports.KnexProvider = KnexProvider;
60
+ var core_1 = require("@juadz/core");
60
61
  var list_1 = require("./list");
61
- function KnexProvider(schema, connection, dataTableName) {
62
+ function KnexProvider(dataTableName, schema, connection) {
62
63
  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]; });
64
+ // schema.name = schema.name || dataTableName;
65
+ var flags = (0, core_1.flagPaths)(schema);
66
+ var searchableFields = flags.$search || [];
67
+ var filterableFields = flags.$filter || [];
68
+ var sortableFields = flags.$sort || [];
73
69
  var get = function (id) { return __awaiter(_this, void 0, void 0, function () {
74
70
  var c;
75
71
  return __generator(this, function (_a) {
76
72
  switch (_a.label) {
77
- case 0: return [4 /*yield*/, connection(tableName)
73
+ case 0: return [4 /*yield*/, connection(dataTableName)
78
74
  .select("*")
79
75
  .where("id", id)
80
76
  .first()];
@@ -87,7 +83,7 @@ function KnexProvider(schema, connection, dataTableName) {
87
83
  var update = function (id, patch) { return __awaiter(_this, void 0, void 0, function () {
88
84
  return __generator(this, function (_a) {
89
85
  switch (_a.label) {
90
- case 0: return [4 /*yield*/, connection(tableName).where("id", id).update(patch)];
86
+ case 0: return [4 /*yield*/, connection(dataTableName).where("id", id).update(patch)];
91
87
  case 1:
92
88
  _a.sent();
93
89
  return [4 /*yield*/, get(id)];
@@ -102,14 +98,14 @@ function KnexProvider(schema, connection, dataTableName) {
102
98
  case 0:
103
99
  params = __assign({}, params_);
104
100
  if (!(connection.client.config.client === "sqlite3")) return [3 /*break*/, 2];
105
- return [4 /*yield*/, connection(tableName)
101
+ return [4 /*yield*/, connection(dataTableName)
106
102
  .returning("id")
107
103
  .insert(__assign({}, params))];
108
104
  case 1:
109
105
  inserted = _a.sent();
110
106
  insertedId = inserted[0].id;
111
107
  return [3 /*break*/, 4];
112
- case 2: return [4 /*yield*/, connection(tableName)
108
+ case 2: return [4 /*yield*/, connection(dataTableName)
113
109
  .returning("id")
114
110
  .insert(__assign({}, params))];
115
111
  case 3:
@@ -135,7 +131,7 @@ function KnexProvider(schema, connection, dataTableName) {
135
131
  fields.push("`".concat(f, "`=?"));
136
132
  values.push(params[f]);
137
133
  });
138
- return [4 /*yield*/, connection.raw("REPLACE INTO `".concat(tableName, "` SET ").concat(fields.join(", "), " WHERE id=?"), __spreadArray(__spreadArray([], values, true), [
134
+ return [4 /*yield*/, connection.raw("REPLACE INTO `".concat(dataTableName, "` SET ").concat(fields.join(", "), " WHERE id=?"), __spreadArray(__spreadArray([], values, true), [
139
135
  id, // Ensure the ID is at the end for the WHERE clause
140
136
  ], false))];
141
137
  case 1:
@@ -151,16 +147,17 @@ function KnexProvider(schema, connection, dataTableName) {
151
147
  var result;
152
148
  return __generator(this, function (_a) {
153
149
  switch (_a.label) {
154
- case 0: return [4 /*yield*/, connection(tableName).where("id", id).delete()];
150
+ case 0: return [4 /*yield*/, connection(dataTableName).where("id", id).delete()];
155
151
  case 1:
156
152
  result = _a.sent();
157
153
  return [2 /*return*/, result];
158
154
  }
159
155
  });
160
156
  }); };
161
- var list = (0, list_1.KnexQueryList)(connection, tableName, searchableFields, filterableFields, sortableFields);
157
+ var list = (0, list_1.KnexQueryList)(connection, dataTableName, searchableFields, filterableFields, sortableFields);
162
158
  return {
163
159
  schema: schema,
160
+ name: dataTableName,
164
161
  get: get,
165
162
  replace: replace,
166
163
  update: update,
package/build/list.js CHANGED
@@ -51,7 +51,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
51
51
  };
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
53
  exports.KnexQueryList = KnexQueryList;
54
- var dayjs_1 = __importDefault(require("dayjs"));
54
+ // import dayjs from "dayjs";
55
55
  var debug_1 = __importDefault(require("debug"));
56
56
  var debug = (0, debug_1.default)("juadz:knex:list");
57
57
  function KnexQueryList(knex, tableName, searchableFields, filterableFields, sortableFields) {
@@ -111,18 +111,22 @@ function KnexQueryList(knex, tableName, searchableFields, filterableFields, sort
111
111
  ]);
112
112
  return;
113
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
- }
114
+ query.whereBetween(field, [values[0], values[1]]);
115
+ //if (query.client.config.client === "sqlite3") {
116
+ // query.whereBetween(field, [
117
+ // dayjs(values[0]).format(
118
+ // "YYYY-MM-DD HH:mm:ss",
119
+ // ),
120
+ // dayjs(values[1]).format(
121
+ // "YYYY-MM-DD HH:mm:ss",
122
+ // ),
123
+ // ]);
124
+ //} else {
125
+ // query.whereBetween(field, [
126
+ // values[0],
127
+ // values[1],
128
+ // ]);
129
+ //}
126
130
  return;
127
131
  case "!between":
128
132
  query.whereNotBetween(field, [
@@ -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", ["name", "lastname"], ["age", "tool"], ["age"]);
87
+ func = (0, list_1.KnexQueryList)(knex, "users", ["name", "last_name"], ["age", "tool"], ["age"]);
88
88
  return [4 /*yield*/, func({
89
89
  resource: "users",
90
90
  range: { offset: 0, limit: 10 },
@@ -97,6 +97,9 @@ test("KnexQueryList", function () { return __awaiter(void 0, void 0, void 0, fun
97
97
  })];
98
98
  case 1:
99
99
  result = _a.sent();
100
+ r = result;
101
+ debug = r.sql;
102
+ 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");
100
103
  expect(result.total).toBe(2);
101
104
  expect(result.data[0]).toMatchObject({
102
105
  name: "Peter",
@@ -110,8 +113,6 @@ test("KnexQueryList", function () { return __awaiter(void 0, void 0, void 0, fun
110
113
  age: 13,
111
114
  tool: "crayon",
112
115
  });
113
- r = result;
114
- debug = r.debug;
115
116
  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
117
  return [2 /*return*/];
117
118
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juadz/knex",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Juadz: Rapid restful API development",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
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");
@@ -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":