@asla/yoursql 0.6.2 → 0.6.4
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 +101 -41
- package/dist/sql_value/sql_value.d.ts +24 -6
- package/package.json +1 -1
package/dist/mod.js
CHANGED
|
@@ -337,21 +337,28 @@ class SqlValuesCreator {
|
|
|
337
337
|
* v() 和 v.toSqlStr() 是等价的
|
|
338
338
|
* ```
|
|
339
339
|
*/
|
|
340
|
-
toSqlStr(value,
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
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
|
-
|
|
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("
|
|
381
|
+
throw new Error("不支持 " + type + " 类型");
|
|
377
382
|
}
|
|
378
383
|
}
|
|
379
|
-
/**
|
|
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,16 +406,20 @@ 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));
|
|
412
|
+
asserts = [];
|
|
396
413
|
}
|
|
397
414
|
else if (keys_types instanceof Array) {
|
|
398
415
|
keys = keys_types;
|
|
416
|
+
asserts = [];
|
|
399
417
|
}
|
|
400
418
|
else {
|
|
401
419
|
keys = Object.keys(keys_types);
|
|
420
|
+
asserts = initColumnAssert(keys, keys_types);
|
|
402
421
|
}
|
|
403
|
-
let str = "(" + this.
|
|
422
|
+
let str = "(" + this._internalObjectToValues(objectList[0], keys, asserts) + ")";
|
|
404
423
|
let i = 1;
|
|
405
424
|
let j;
|
|
406
425
|
let value;
|
|
@@ -412,7 +431,7 @@ class SqlValuesCreator {
|
|
|
412
431
|
j = 0;
|
|
413
432
|
for (; j < keys.length; j++) {
|
|
414
433
|
value = object[keys[j]];
|
|
415
|
-
rows[j] = this.toSqlStr(value);
|
|
434
|
+
rows[j] = this.toSqlStr(value, asserts[j]?.assertJsType);
|
|
416
435
|
}
|
|
417
436
|
str += ",\n(" + rows.join(",") + ")";
|
|
418
437
|
}
|
|
@@ -424,17 +443,38 @@ class SqlValuesCreator {
|
|
|
424
443
|
return str;
|
|
425
444
|
}
|
|
426
445
|
objectToValues(object, keys_types) {
|
|
427
|
-
|
|
446
|
+
let type;
|
|
447
|
+
let keys;
|
|
448
|
+
if (keys_types instanceof Array) {
|
|
449
|
+
keys = keys_types;
|
|
450
|
+
type = [];
|
|
451
|
+
}
|
|
452
|
+
else if (keys_types) {
|
|
453
|
+
keys = Object.keys(keys_types);
|
|
454
|
+
type = initColumnAssert(keys, keys_types);
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
keys = Object.keys(object);
|
|
458
|
+
type = [];
|
|
459
|
+
}
|
|
460
|
+
return this._internalObjectToValues(object, keys, type);
|
|
461
|
+
}
|
|
462
|
+
_internalObjectToValues(object, keys, type) {
|
|
428
463
|
const values = [];
|
|
429
464
|
let i = 0;
|
|
430
465
|
let key;
|
|
431
466
|
let value;
|
|
467
|
+
let assertType;
|
|
432
468
|
try {
|
|
433
469
|
for (; i < keys.length; i++) {
|
|
434
470
|
key = keys[i];
|
|
435
471
|
value = object[key];
|
|
436
|
-
|
|
437
|
-
|
|
472
|
+
assertType = type[i];
|
|
473
|
+
if (assertType) {
|
|
474
|
+
values[i] = this.toSqlStr(value, assertType.assertJsType);
|
|
475
|
+
if (assertType.sqlType)
|
|
476
|
+
values[i] += "::" + assertType.sqlType;
|
|
477
|
+
}
|
|
438
478
|
else
|
|
439
479
|
values[i] = this.toSqlStr(value);
|
|
440
480
|
}
|
|
@@ -462,24 +502,26 @@ class SqlValuesCreator {
|
|
|
462
502
|
const column0 = new Array(insertKeys.length);
|
|
463
503
|
let columnName;
|
|
464
504
|
let item;
|
|
465
|
-
let
|
|
505
|
+
let sqlType;
|
|
506
|
+
let assertJsType;
|
|
466
507
|
let value;
|
|
467
508
|
for (let i = 0; i < insertKeys.length; i++) {
|
|
468
509
|
columnName = insertKeys[i];
|
|
469
510
|
item = valuesTypes[columnName];
|
|
470
511
|
if (typeof item === "string") {
|
|
471
|
-
|
|
512
|
+
sqlType = item;
|
|
472
513
|
defaultValues[i] = "NULL";
|
|
473
514
|
}
|
|
474
515
|
else {
|
|
475
|
-
|
|
516
|
+
sqlType = item.sqlType;
|
|
517
|
+
assertJsType = item.assertJsType;
|
|
476
518
|
defaultValues[i] = item.sqlDefault ?? "NULL";
|
|
477
519
|
}
|
|
478
520
|
value = values[0][columnName];
|
|
479
521
|
if (value === undefined)
|
|
480
|
-
column0[i] = defaultValues[i] + "::" +
|
|
522
|
+
column0[i] = defaultValues[i] + "::" + sqlType;
|
|
481
523
|
else
|
|
482
|
-
column0[i] = this.toSqlStr(value) + "::" +
|
|
524
|
+
column0[i] = this.toSqlStr(value, assertJsType) + "::" + sqlType;
|
|
483
525
|
}
|
|
484
526
|
valuesStr[0] = "(" + column0.join(",") + ")";
|
|
485
527
|
}
|
|
@@ -516,21 +558,26 @@ class YourValuesAs extends SqlSelectable {
|
|
|
516
558
|
}
|
|
517
559
|
}
|
|
518
560
|
_YourValuesAs_asName = new WeakMap(), _YourValuesAs_valuesStr = new WeakMap(), _YourValuesAs_sql = new WeakMap();
|
|
519
|
-
function
|
|
520
|
-
let
|
|
521
|
-
let
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
561
|
+
function initColumnAssert(keys, keys_types) {
|
|
562
|
+
let key;
|
|
563
|
+
let value;
|
|
564
|
+
let type = new Array(keys.length);
|
|
565
|
+
for (let i = 0; i < keys.length; i++) {
|
|
566
|
+
key = keys[i];
|
|
567
|
+
value = keys_types[key];
|
|
568
|
+
if (typeof value === "string") {
|
|
569
|
+
type[i] = { sqlType: value };
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
type[i] = value;
|
|
573
|
+
}
|
|
529
574
|
}
|
|
530
|
-
|
|
531
|
-
|
|
575
|
+
return type;
|
|
576
|
+
}
|
|
577
|
+
class AssertError extends TypeError {
|
|
578
|
+
constructor(assertType, actual) {
|
|
579
|
+
super(`Assert ${assertType} type, Actual ${actual} type`);
|
|
532
580
|
}
|
|
533
|
-
return { type, keys };
|
|
534
581
|
}
|
|
535
582
|
|
|
536
583
|
/** @public PgSql 转换器 */
|
|
@@ -544,17 +591,30 @@ const pgSqlTransformer = new Map([
|
|
|
544
591
|
let type;
|
|
545
592
|
let basicType;
|
|
546
593
|
for (let i = 0; i < value.length; i++) {
|
|
547
|
-
|
|
594
|
+
if (value[i] === null || value[i] === undefined)
|
|
595
|
+
valueStr[i] = this.toSqlStr(value[i]);
|
|
596
|
+
else if (type) {
|
|
597
|
+
valueStr[i] = this.toSqlStr(value[i], type);
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
548
600
|
basicType = typeof value[i];
|
|
549
|
-
if (
|
|
550
|
-
|
|
601
|
+
if (basicType === "object") {
|
|
602
|
+
type = this.getClassType(value[i]);
|
|
603
|
+
}
|
|
604
|
+
else
|
|
605
|
+
type = basicType;
|
|
551
606
|
valueStr[i] = this.toSqlStr(value[i], type);
|
|
552
607
|
}
|
|
553
608
|
}
|
|
554
609
|
return "ARRAY[" + valueStr.join(",") + "]";
|
|
555
610
|
},
|
|
556
611
|
],
|
|
557
|
-
[
|
|
612
|
+
[
|
|
613
|
+
Date,
|
|
614
|
+
function (value) {
|
|
615
|
+
return SqlValuesCreator.string(value.toISOString());
|
|
616
|
+
},
|
|
617
|
+
],
|
|
558
618
|
]);
|
|
559
619
|
|
|
560
620
|
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
|
|
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?:
|
|
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,
|
|
52
|
-
/**
|
|
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
|