@asla/yoursql 0.6.2 → 0.6.3

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/dist/mod.js CHANGED
@@ -337,21 +337,28 @@ class SqlValuesCreator {
337
337
  * v() 和 v.toSqlStr() 是等价的
338
338
  * ```
339
339
  */
340
- toSqlStr(value, assertType) {
341
- let basicType;
342
- if (assertType) {
343
- if (typeof assertType === "function") {
344
- let type = this._map.get(assertType);
345
- if (!type)
340
+ toSqlStr(value, assertJsType) {
341
+ if (value === null)
342
+ return "NULL";
343
+ else if (value === undefined)
344
+ return "DEFAULT";
345
+ let basicType = typeof value;
346
+ if (assertJsType) {
347
+ if (typeof assertJsType === "function") {
348
+ if (basicType !== "object")
349
+ throw new AssertError("object", basicType);
350
+ let type = this._map.get(assertJsType);
351
+ if (!type) {
352
+ if (assertJsType === Object)
353
+ return this.defaultObject(value);
346
354
  throw new Error("类型不存在");
355
+ }
347
356
  return type.call(this, value);
348
357
  }
349
- else {
350
- basicType = assertType;
358
+ else if (basicType !== assertJsType) {
359
+ throw new AssertError(assertJsType, basicType);
351
360
  }
352
361
  }
353
- else
354
- basicType = typeof value;
355
362
  switch (basicType) {
356
363
  case "bigint":
357
364
  return value.toString();
@@ -362,8 +369,6 @@ class SqlValuesCreator {
362
369
  case "boolean":
363
370
  return value.toString();
364
371
  case "object": {
365
- if (value === null)
366
- return "NULL";
367
372
  if (value instanceof String)
368
373
  return value.toString();
369
374
  return this.getObjectType(value).call(this, value);
@@ -373,10 +378,13 @@ class SqlValuesCreator {
373
378
  default:
374
379
  //function、symbol
375
380
  let type = typeof value;
376
- throw new Error("不支持转换 " + type + " 类型");
381
+ throw new Error("不支持 " + type + " 类型");
377
382
  }
378
383
  }
379
- /** 获取值对应的 SqlValueEncoder */
384
+ /**
385
+ * @deprecated 已废弃
386
+ * 获取值对应的 SqlValueEncoder
387
+ */
380
388
  getObjectType(value) {
381
389
  for (const Class of this._map.keys()) {
382
390
  if (value instanceof Class)
@@ -384,6 +392,13 @@ class SqlValuesCreator {
384
392
  }
385
393
  return this.defaultObject;
386
394
  }
395
+ /** 获取值对应已定义的类 */
396
+ getClassType(value) {
397
+ for (const Class of this._map.keys()) {
398
+ if (value instanceof Class)
399
+ return Class;
400
+ }
401
+ }
387
402
  defaultObject(value) {
388
403
  return SqlValuesCreator.string(JSON.stringify(value));
389
404
  }
@@ -391,6 +406,7 @@ class SqlValuesCreator {
391
406
  if (objectList.length <= 0)
392
407
  throw new Error("objectList 不能是空数组");
393
408
  let keys;
409
+ let asserts = {};
394
410
  if (!keys_types) {
395
411
  keys = Array.from(getObjectListKeys(objectList, keepUndefinedKey));
396
412
  }
@@ -399,8 +415,9 @@ class SqlValuesCreator {
399
415
  }
400
416
  else {
401
417
  keys = Object.keys(keys_types);
418
+ asserts = initColumnAssert(keys, keys_types);
402
419
  }
403
- let str = "(" + this.objectToValues(objectList[0], keys_types ?? keys) + ")";
420
+ let str = "(" + this._internalObjectToValues(objectList[0], keys, asserts) + ")";
404
421
  let i = 1;
405
422
  let j;
406
423
  let value;
@@ -424,17 +441,37 @@ class SqlValuesCreator {
424
441
  return str;
425
442
  }
426
443
  objectToValues(object, keys_types) {
427
- const { keys, type } = toKeyType(object, keys_types);
444
+ let type = {};
445
+ let keys;
446
+ if (keys_types instanceof Array) {
447
+ keys = keys_types;
448
+ type = {};
449
+ }
450
+ else if (keys_types) {
451
+ keys = Object.keys(keys_types);
452
+ type = initColumnAssert(keys, keys_types);
453
+ }
454
+ else {
455
+ keys = Object.keys(object);
456
+ }
457
+ return this._internalObjectToValues(object, keys, type);
458
+ }
459
+ _internalObjectToValues(object, keys, type) {
428
460
  const values = [];
429
461
  let i = 0;
430
462
  let key;
431
463
  let value;
464
+ let assertType;
432
465
  try {
433
466
  for (; i < keys.length; i++) {
434
467
  key = keys[i];
435
468
  value = object[key];
436
- if (type[key])
437
- values[i] = this.toSqlStr(value) + "::" + type[key];
469
+ assertType = type[key];
470
+ if (assertType) {
471
+ values[i] = this.toSqlStr(value, assertType.assertJsType);
472
+ if (assertType.sqlType)
473
+ values[i] += "::" + assertType.sqlType;
474
+ }
438
475
  else
439
476
  values[i] = this.toSqlStr(value);
440
477
  }
@@ -462,24 +499,26 @@ class SqlValuesCreator {
462
499
  const column0 = new Array(insertKeys.length);
463
500
  let columnName;
464
501
  let item;
465
- let type;
502
+ let sqlType;
503
+ let assertJsType;
466
504
  let value;
467
505
  for (let i = 0; i < insertKeys.length; i++) {
468
506
  columnName = insertKeys[i];
469
507
  item = valuesTypes[columnName];
470
508
  if (typeof item === "string") {
471
- type = item;
509
+ sqlType = item;
472
510
  defaultValues[i] = "NULL";
473
511
  }
474
512
  else {
475
- type = item.sqlType;
513
+ sqlType = item.sqlType;
514
+ assertJsType = item.assertJsType;
476
515
  defaultValues[i] = item.sqlDefault ?? "NULL";
477
516
  }
478
517
  value = values[0][columnName];
479
518
  if (value === undefined)
480
- column0[i] = defaultValues[i] + "::" + type;
519
+ column0[i] = defaultValues[i] + "::" + sqlType;
481
520
  else
482
- column0[i] = this.toSqlStr(value) + "::" + type;
521
+ column0[i] = this.toSqlStr(value, assertJsType) + "::" + sqlType;
483
522
  }
484
523
  valuesStr[0] = "(" + column0.join(",") + ")";
485
524
  }
@@ -516,21 +555,26 @@ class YourValuesAs extends SqlSelectable {
516
555
  }
517
556
  }
518
557
  _YourValuesAs_asName = new WeakMap(), _YourValuesAs_valuesStr = new WeakMap(), _YourValuesAs_sql = new WeakMap();
519
- function toKeyType(object, keys_types) {
558
+ function initColumnAssert(keys, keys_types) {
559
+ let key;
560
+ let value;
520
561
  let type = {};
521
- let keys;
522
- if (keys_types instanceof Array) {
523
- keys = keys_types;
524
- type = {};
525
- }
526
- else if (keys_types) {
527
- keys = Object.keys(keys_types);
528
- type = keys_types;
562
+ for (let i = 0; i < keys.length; i++) {
563
+ key = keys[i];
564
+ value = keys_types[key];
565
+ if (typeof value === "string") {
566
+ type[key] = { sqlType: value };
567
+ }
568
+ else {
569
+ type[key] = value;
570
+ }
529
571
  }
530
- else {
531
- keys = Object.keys(object);
572
+ return type;
573
+ }
574
+ class AssertError extends TypeError {
575
+ constructor(assertType, actual) {
576
+ super(`Assert ${assertType} type, Actual ${actual} type`);
532
577
  }
533
- return { type, keys };
534
578
  }
535
579
 
536
580
  /** @public PgSql 转换器 */
@@ -544,17 +588,30 @@ const pgSqlTransformer = new Map([
544
588
  let type;
545
589
  let basicType;
546
590
  for (let i = 0; i < value.length; i++) {
547
- {
591
+ if (value[i] === null || value[i] === undefined)
592
+ valueStr[i] = this.toSqlStr(value[i]);
593
+ else if (type) {
594
+ valueStr[i] = this.toSqlStr(value[i], type);
595
+ }
596
+ else {
548
597
  basicType = typeof value[i];
549
- if (value[i] === null || basicType === "undefined")
550
- basicType = undefined;
598
+ if (basicType === "object") {
599
+ type = this.getClassType(value[i]);
600
+ }
601
+ else
602
+ type = basicType;
551
603
  valueStr[i] = this.toSqlStr(value[i], type);
552
604
  }
553
605
  }
554
606
  return "ARRAY[" + valueStr.join(",") + "]";
555
607
  },
556
608
  ],
557
- [Date, (value) => SqlValuesCreator.string(value.toISOString())],
609
+ [
610
+ Date,
611
+ function (value) {
612
+ return SqlValuesCreator.string(value.toISOString());
613
+ },
614
+ ],
558
615
  ]);
559
616
 
560
617
  var _Selection_instances, _a, _Selection_sql, _Selection_join;
@@ -13,14 +13,20 @@ export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
13
13
  /** @public 将 js 值转为 SQl 字符串的函数*/
14
14
  export type SqlValueEncoder<T = any> = (this: SqlValuesCreator, value: T) => string;
15
15
  /** @public 断言类型 */
16
- export type ManualType = "bigint" | "number" | "string" | "boolean" | "object" | (new (...args: any[]) => any);
16
+ export type AssertJsType = "bigint" | "number" | "string" | "boolean" | "object" | (new (...args: any[]) => any);
17
+ /**
18
+ * @deprecated 改用 AssertJsType
19
+ * @public 断言类型
20
+ */
21
+ export type ManualType = AssertJsType;
17
22
  /** @public */
18
23
  export type SqlValueFn = SqlValuesCreator & {
19
24
  /**
20
25
  * 安全将 JS 对象转为 SQL 的字符值的形式,可避免 SQL 注入。
21
26
  * undefined 将被转换为 DEFAULT
27
+ * @param assertType - 如果断言了基本类型,并且值的基本类型与断言的类型不一致,则会抛出异常。 如果不是基本类型,则 value 会被传递给指定的转义器
22
28
  */
23
- (value: any, assertType?: ManualType): string;
29
+ (value: any, assertType?: AssertJsType): string;
24
30
  };
25
31
  /**
26
32
  * SQL value 生成器
@@ -48,9 +54,14 @@ export declare class SqlValuesCreator {
48
54
  * v() 和 v.toSqlStr() 是等价的
49
55
  * ```
50
56
  */
51
- toSqlStr(value: any, assertType?: ManualType): string;
52
- /** 获取值对应的 SqlValueEncoder */
57
+ toSqlStr(value: any, assertJsType?: AssertJsType): string;
58
+ /**
59
+ * @deprecated 已废弃
60
+ * 获取值对应的 SqlValueEncoder
61
+ */
53
62
  getObjectType(value: object): SqlValueEncoder;
63
+ /** 获取值对应已定义的类 */
64
+ getClassType(value: object): undefined | (new (...args: unknown[]) => unknown);
54
65
  protected defaultObject(value: object): string;
55
66
  /**
56
67
  * 将对象列表转为 SQL 的 VALUES。
@@ -58,7 +69,7 @@ export declare class SqlValuesCreator {
58
69
  * @param keys - 选择的键。如果指定了 keys, 值为 undefined 的属性将自动填充为 null; 如果未指定 keys,将选择 objectList 所有不是 undefined 项的键的并集
59
70
  */
60
71
  objectListToValuesList<T extends object>(objectList: T[], keys?: readonly (keyof T)[] | {
61
- [key in keyof T]?: string | undefined;
72
+ [key in keyof T]?: string | undefined | ColumnToValueConfig;
62
73
  }, keepUndefinedKey?: boolean): string;
63
74
  /**
64
75
  * 将对象转为 SQL 的 value
@@ -66,8 +77,9 @@ export declare class SqlValuesCreator {
66
77
  * @param keys - 如果指定了key, object undefined 的属性值将填充为 null,如果不指定,将自获取 object 所有非 undefined 的属性的key
67
78
  */
68
79
  objectToValues<T extends object>(object: T, keys?: readonly (keyof T)[] | {
69
- [key in keyof T]?: string | undefined;
80
+ [key in keyof T]?: string | undefined | ColumnToValueConfig;
70
81
  }): string;
82
+ private _internalObjectToValues;
71
83
  /**
72
84
  * 将数组列表转为 SQL 的一个 value
73
85
  * @example 返回示例: " 'abc', '6', 'now()' "
@@ -88,7 +100,13 @@ export declare class SqlValuesCreator {
88
100
  createValues<T extends {}>(asName: string, values: T[], valuesTypes: Record<string, string | {
89
101
  sqlType: string;
90
102
  sqlDefault?: string;
103
+ assertJsType?: AssertJsType;
91
104
  }>): SqlSelectable<T>;
92
105
  }
106
+ /** @public */
107
+ export type ColumnToValueConfig = {
108
+ sqlType?: string;
109
+ assertJsType?: AssertJsType;
110
+ };
93
111
  export {};
94
112
  //# sourceMappingURL=sql_value.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asla/yoursql",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/mod.d.ts",