@maiyunnet/kebab 3.2.12 → 3.2.14

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/index.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * --- 本文件用来定义每个目录实体地址的常量 ---
6
6
  */
7
7
  /** --- 当前系统版本号 --- */
8
- export declare const VER = "3.2.12";
8
+ export declare const VER = "3.2.14";
9
9
  /** --- 框架根目录,以 / 结尾 --- */
10
10
  export declare const ROOT_PATH: string;
11
11
  export declare const LIB_PATH: string;
package/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * --- 本文件用来定义每个目录实体地址的常量 ---
7
7
  */
8
8
  /** --- 当前系统版本号 --- */
9
- export const VER = '3.2.12';
9
+ export const VER = '3.2.14';
10
10
  // --- 服务端用的路径 ---
11
11
  const imu = decodeURIComponent(import.meta.url).replace('file://', '').replace(/^\/(\w:)/, '$1');
12
12
  /** --- /xxx/xxx --- */
package/lib/net.d.ts CHANGED
@@ -34,11 +34,19 @@ export declare function get(u: string, opt?: IRequestOptions): Promise<lResponse
34
34
  export declare function post(u: string, data: Record<string, kebab.Json> | Buffer | string | stream.Readable, opt?: IRequestOptions): Promise<lResponse.Response>;
35
35
  /**
36
36
  * --- 发起 JSON 请求 ---
37
- * @param u
38
- * @param data
39
- * @param opt
37
+ * @param u 网址
38
+ * @param data 数据
39
+ * @param opt选项
40
40
  */
41
41
  export declare function postJson(u: string, data: kebab.Json[] | Record<string, kebab.Json>, opt?: IRequestOptions): Promise<lResponse.Response>;
42
+ /**
43
+ * --- 发起 JSON 请求并解析 JSON 响应 ---
44
+ * @param url 网址
45
+ * @param data 数据
46
+ * @param init 选项
47
+ * @returns JSON 数据,失败时返回 null
48
+ */
49
+ export declare function postJsonResponseJson(u: string, data: kebab.Json[] | Record<string, kebab.Json>, opt?: IRequestOptions): Promise<any | null>;
42
50
  /**
43
51
  * --- 发起一个请求 ---
44
52
  * @param opt 配置项
package/lib/net.js CHANGED
@@ -57,15 +57,36 @@ export async function post(u, data, opt = {}) {
57
57
  }
58
58
  /**
59
59
  * --- 发起 JSON 请求 ---
60
- * @param u
61
- * @param data
62
- * @param opt
60
+ * @param u 网址
61
+ * @param data 数据
62
+ * @param opt选项
63
63
  */
64
64
  export async function postJson(u, data, opt = {}) {
65
65
  opt.method = 'POST';
66
66
  opt.type = 'json';
67
67
  return request(u, data, opt);
68
68
  }
69
+ /**
70
+ * --- 发起 JSON 请求并解析 JSON 响应 ---
71
+ * @param url 网址
72
+ * @param data 数据
73
+ * @param init 选项
74
+ * @returns JSON 数据,失败时返回 null
75
+ */
76
+ export async function postJsonResponseJson(u, data, opt = {}) {
77
+ opt.method = 'POST';
78
+ opt.type = 'json';
79
+ const res = await request(u, data, opt);
80
+ const rtn = await res.getContent();
81
+ if (!rtn) {
82
+ return null;
83
+ }
84
+ const json = lText.parseJson(rtn.toString());
85
+ if (!json) {
86
+ return null;
87
+ }
88
+ return json;
89
+ }
69
90
  /**
70
91
  * --- 发起一个请求 ---
71
92
  * @param opt 配置项
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maiyunnet/kebab",
3
- "version": "3.2.12",
3
+ "version": "3.2.14",
4
4
  "description": "Simple, easy-to-use, and fully-featured Node.js framework that is ready-to-use out of the box.",
5
5
  "type": "module",
6
6
  "keywords": [
package/sys/mod.d.ts CHANGED
@@ -19,7 +19,7 @@ declare class Rows<T extends Mod> implements CRows<T> {
19
19
  get length(): number;
20
20
  /** --- 通过索引获取一个对象 --- */
21
21
  item(index: number): T;
22
- /** --- 转换为数组对象 --- */
22
+ /** --- 转换为数组对象,获取的是新创建的数组 --- */
23
23
  toArray(): Array<Record<string, any>>;
24
24
  /** --- 根据规则筛掉项,predicate 返回 true 代表保留 --- */
25
25
  filter(predicate: (value: T, index: number) => boolean): Rows<T>;
@@ -127,7 +127,7 @@ export default class Mod {
127
127
  static removeByWhere(db: lDb.Pool | lDb.Transaction, where: string | kebab.Json, opt?: {
128
128
  'raw'?: boolean;
129
129
  'pre'?: sCtr.Ctr | string;
130
- 'index'?: string;
130
+ 'index'?: string | string[];
131
131
  'by'?: [string | string[], 'DESC' | 'ASC'];
132
132
  'limit'?: [number, number?];
133
133
  }): Promise<number | false | null>;
@@ -226,7 +226,7 @@ export default class Mod {
226
226
  'lock'?: boolean;
227
227
  'raw'?: boolean;
228
228
  'pre'?: string;
229
- 'index'?: string;
229
+ 'index'?: string | string[];
230
230
  }): Promise<false | null | (T & Record<string, any>)>;
231
231
  static one(db: lDb.Pool | lDb.Transaction, s: string | kebab.Json, opt: {
232
232
  'ctr'?: sCtr.Ctr;
@@ -272,7 +272,7 @@ export default class Mod {
272
272
  'index'?: string;
273
273
  }): Promise<any[] | false>;
274
274
  /**
275
- * --- 将 key val 组成的数据列表转换为原生对象模式 ---
275
+ * --- 将 key val 组成的数据列表转换为原生对象模式,获取的是新创建的数组 ---
276
276
  * @param obj 要转换的 kv 数据列表
277
277
  */
278
278
  static toArrayByRecord<T extends Mod>(obj: Record<string, T>): Record<string, Record<string, any>>;
@@ -453,7 +453,7 @@ export default class Mod {
453
453
  */
454
454
  format(sql?: string, data?: any[]): string;
455
455
  /**
456
- * --- 获取值对象 ---
456
+ * --- 获取值对象,获取的是新创建的数组 ---
457
457
  */
458
458
  toArray<TC extends abstract new (...args: any) => any>(): TOnlyProperties<InstanceType<TC>> & Record<string, any>;
459
459
  /**
@@ -481,7 +481,7 @@ export declare class CRows<T> implements Iterable<T> {
481
481
  get length(): number;
482
482
  /** --- 通过索引获取一个对象 --- */
483
483
  item(index: number): T;
484
- /** --- 转换为数组对象 --- */
484
+ /** --- 转换为数组对象,获取的是新创建的数组 --- */
485
485
  toArray(): Array<Record<string, kebab.DbValue>>;
486
486
  [Symbol.iterator](): Iterator<T>;
487
487
  }
package/sys/mod.js CHANGED
@@ -22,7 +22,7 @@ class Rows {
22
22
  item(index) {
23
23
  return this._items[index];
24
24
  }
25
- /** --- 转换为数组对象 --- */
25
+ /** --- 转换为数组对象,获取的是新创建的数组 --- */
26
26
  toArray() {
27
27
  const arr = [];
28
28
  for (const item of this._items) {
@@ -55,7 +55,7 @@ class Rows {
55
55
  next: () => {
56
56
  if (index < this._items.length) {
57
57
  return {
58
- value: this._items[index++],
58
+ value: this._items[++index],
59
59
  done: false
60
60
  };
61
61
  }
@@ -226,12 +226,9 @@ class Mod {
226
226
  */
227
227
  static async removeByWhere(db, where, opt = {}) {
228
228
  const tim = lTime.stamp();
229
- const sq = lSql.get(opt.pre);
229
+ const indexs = opt.index ? (typeof opt.index === 'string' ? [opt.index] : [...new Set(opt.index)]) : [''];
230
230
  if (this._$soft && !opt.raw) {
231
231
  // --- 软删除 ---
232
- sq.update(this._$table + (opt.index ? ('_' + opt.index) : ''), [{
233
- 'time_remove': tim
234
- }]);
235
232
  if (typeof where === 'string') {
236
233
  where = '(' + where + ') AND `time_remove` = 0';
237
234
  }
@@ -244,26 +241,36 @@ class Mod {
244
241
  where['time_remove'] = 0;
245
242
  }
246
243
  }
247
- else {
248
- // --- 真删除 ---
249
- sq.delete(this._$table + (opt.index ? ('_' + opt.index) : ''));
250
- }
251
- sq.where(where);
252
- if (opt.by) {
253
- sq.by(opt.by[0], opt.by[1]);
254
- }
255
- if (opt.limit) {
256
- sq.limit(opt.limit[0], opt.limit[1]);
257
- }
258
- const r = await db.execute(sq.getSql(), sq.getData());
259
- if (r.packet === null) {
260
- lCore.log(opt.pre instanceof sCtr.Ctr ? opt.pre : {}, '[removeByWhere, mod] ' + lText.stringifyJson(r.error?.message ?? '').slice(1, -1).replace(/"/g, '""'), '-error');
261
- return false;
262
- }
263
- if (r.packet.affectedRows > 0) {
264
- return r.packet.affectedRows;
244
+ let ar = 0;
245
+ for (const index of indexs) {
246
+ const sq = lSql.get(opt.pre);
247
+ if (this._$soft && !opt.raw) {
248
+ // --- 软删除 ---
249
+ sq.update(this._$table + (index ? ('_' + index) : ''), [{
250
+ 'time_remove': tim,
251
+ }]);
252
+ }
253
+ else {
254
+ // --- 真删除 ---
255
+ sq.delete(this._$table + (index ? ('_' + index) : ''));
256
+ }
257
+ sq.where(where);
258
+ if (opt.by) {
259
+ sq.by(opt.by[0], opt.by[1]);
260
+ }
261
+ if (opt.limit) {
262
+ sq.limit(opt.limit[0], opt.limit[1]);
263
+ }
264
+ const r = await db.execute(sq.getSql(), sq.getData());
265
+ if (r.packet === null) {
266
+ lCore.log(opt.pre instanceof sCtr.Ctr ? opt.pre : {}, '[removeByWhere, mod] ' + lText.stringifyJson(r.error?.message ?? '').slice(1, -1).replace(/"/g, '""'), '-error');
267
+ return false;
268
+ }
269
+ if (r.packet.affectedRows > 0) {
270
+ ar += r.packet.affectedRows;
271
+ }
265
272
  }
266
- return null;
273
+ return ar ? ar : null;
267
274
  }
268
275
  /**
269
276
  * --- 根据条件移除条目(仅获取 SQL 对象) ---
@@ -312,12 +319,7 @@ class Mod {
312
319
  * @param opt 选项
313
320
  */
314
321
  static async updateByWhere(db, data, where, opt = {}) {
315
- if (typeof opt.index === 'string') {
316
- opt.index = [opt.index];
317
- }
318
- else {
319
- opt.index ??= [''];
320
- }
322
+ const indexs = opt.index ? (typeof opt.index === 'string' ? [opt.index] : [...new Set(opt.index)]) : [''];
321
323
  if (this._$soft && !opt.raw) {
322
324
  if (typeof where === 'string') {
323
325
  where = '(' + where + ') AND `time_remove` = 0';
@@ -332,7 +334,7 @@ class Mod {
332
334
  }
333
335
  }
334
336
  let ar = 0;
335
- for (const index of opt.index) {
337
+ for (const index of indexs) {
336
338
  const sq = lSql.get(opt.pre);
337
339
  sq.update(this._$table + (index ? ('_' + index) : ''), data);
338
340
  sq.where(where);
@@ -448,7 +450,7 @@ class Mod {
448
450
  [this._$primary]: val
449
451
  }],
450
452
  'raw': opt.raw,
451
- 'index': opt.index
453
+ 'index': opt.index,
452
454
  }).first(opt.lock);
453
455
  }
454
456
  /**
@@ -459,6 +461,7 @@ class Mod {
459
461
  */
460
462
  static async one(db, s, opt = {}) {
461
463
  if (!opt.index) {
464
+ // --- 无 index ---
462
465
  const o = new this({
463
466
  'select': opt.select,
464
467
  'db': db,
@@ -472,8 +475,8 @@ class Mod {
472
475
  }
473
476
  return opt.array ? o.firstArray() : o.first();
474
477
  }
475
- opt.index = typeof opt.index === 'string' ? [opt.index] : [...new Set(opt.index)];
476
- for (const item of opt.index) {
478
+ const indexs = (typeof opt.index === 'string') ? [opt.index] : [...new Set(opt.index)];
479
+ for (const item of indexs) {
477
480
  const row = new this({
478
481
  'select': opt.select,
479
482
  'db': db,
@@ -481,7 +484,7 @@ class Mod {
481
484
  'pre': opt.pre,
482
485
  'where': s,
483
486
  'raw': opt.raw,
484
- 'index': item
487
+ 'index': item,
485
488
  });
486
489
  if (opt.by) {
487
490
  row.by(opt.by[0], opt.by[1]);
@@ -544,7 +547,7 @@ class Mod {
544
547
  return primarys;
545
548
  }
546
549
  /**
547
- * --- 将 key val 组成的数据列表转换为原生对象模式 ---
550
+ * --- 将 key val 组成的数据列表转换为原生对象模式,获取的是新创建的数组 ---
548
551
  * @param obj 要转换的 kv 数据列表
549
552
  */
550
553
  static toArrayByRecord(obj) {
@@ -638,6 +641,8 @@ class Mod {
638
641
  // --- 确实重复了 ---
639
642
  continue;
640
643
  }
644
+ // --- 1062 非 index 冲突,那需要用户自行处理(可能不允许重复的邮箱) ---
645
+ return false;
641
646
  }
642
647
  // --- 未处理的错误 ---
643
648
  lCore.log(this._ctr ?? {}, '[create0, mod] [' + table + '] ' + lText.stringifyJson(r.error?.message ?? '').slice(1, -1).replace(/"/g, '""'), '-error');
@@ -1393,10 +1398,10 @@ class Mod {
1393
1398
  return this._sql.format(sql, data);
1394
1399
  }
1395
1400
  /**
1396
- * --- 获取值对象 ---
1401
+ * --- 获取值对象,获取的是新创建的数组 ---
1397
1402
  */
1398
1403
  toArray() {
1399
- return this._data;
1404
+ return { ...this._data };
1400
1405
  }
1401
1406
  /**
1402
1407
  * --- 获取当前设置要提交的数据 ---