@asla/yoursql 0.6.5 → 0.7.1

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.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export * from "./sql_value/db_type.ts";
2
2
  export * from "./sql_value/sql_value.ts";
3
3
  export * from "./select/type.ts";
4
- export * from "./select/select.ts";
4
+ export * from "./select/DbTable.ts";
5
+ export * from "./select/query_link.ts";
5
6
  export * from "./select/selectable.ts";
6
7
  export * from "./select/TableQuery.ts";
7
8
  export * from "./util.ts";
package/dist/mod.js CHANGED
@@ -79,6 +79,45 @@ function condition(conditions, type = "AND") {
79
79
  return;
80
80
  }
81
81
  }
82
+ function createUpdateSetFromObject(set) {
83
+ const updateKey = Object.keys(set);
84
+ let i = 0;
85
+ let key;
86
+ let value;
87
+ let sql;
88
+ for (; i < updateKey.length; i++) {
89
+ key = updateKey[i];
90
+ value = set[key];
91
+ if (value === undefined)
92
+ continue;
93
+ if (typeof value === "string") {
94
+ if (value) {
95
+ sql = "SET\n" + key + "= " + value;
96
+ break;
97
+ }
98
+ }
99
+ else
100
+ throw new TypeError(`key ${key} 类型错误(${typeof value})`);
101
+ }
102
+ if (sql) {
103
+ i++;
104
+ for (; i < updateKey.length; i++) {
105
+ key = updateKey[i];
106
+ value = set[key];
107
+ if (value === undefined)
108
+ continue;
109
+ if (typeof value === "string") {
110
+ if (value)
111
+ sql += "," + key + "= " + value;
112
+ }
113
+ else
114
+ throw new TypeError(`key ${key} 类型错误(${typeof value})`);
115
+ }
116
+ return sql;
117
+ }
118
+ else
119
+ throw new Error("值不能为空");
120
+ }
82
121
 
83
122
  /**
84
123
  * 获取对象数组中的 key 的集合
@@ -249,22 +288,6 @@ var _SqlQueryStatement_sql;
249
288
  */
250
289
  class SqlSelectable {
251
290
  }
252
- /**
253
- * 数据库表
254
- * @public
255
- */
256
- class DbTable extends SqlSelectable {
257
- constructor(name) {
258
- super();
259
- this.name = name;
260
- }
261
- toSelect() {
262
- return this.name;
263
- }
264
- toString() {
265
- return this.name;
266
- }
267
- }
268
291
  /**
269
292
  * SELECT 以及 UPDATE、DELETE、INSERT INTO 带结果的 SQL 语句
270
293
  * @public
@@ -371,7 +394,10 @@ class SqlValuesCreator {
371
394
  case "object": {
372
395
  if (value instanceof String)
373
396
  return value.toString();
374
- return this.getObjectType(value).call(this, value);
397
+ const Class = this.getClassType(value);
398
+ if (Class)
399
+ return this._map.get(Class).call(this, value);
400
+ return this.defaultObject(value);
375
401
  }
376
402
  case "undefined":
377
403
  return "DEFAULT";
@@ -643,10 +669,21 @@ class AfterSelectImpl extends SqlQueryStatement {
643
669
  }
644
670
  limit(limit, offset) {
645
671
  let sql = this.toString();
646
- if (limit)
647
- sql += "\nLIMIT " + limit;
648
- if (offset)
649
- sql += "\nOFFSET " + offset;
672
+ let type;
673
+ if (limit) {
674
+ type = typeof limit;
675
+ if (type === "number" || type === "bigint")
676
+ sql += "\nLIMIT " + limit;
677
+ else
678
+ throw new TypeError("limit 必须是个整数:" + limit);
679
+ }
680
+ if (offset) {
681
+ type = typeof offset;
682
+ if (type === "number" || type === "bigint")
683
+ sql += "\nOFFSET " + offset;
684
+ else
685
+ throw new TypeError("offset 必须是个整数:" + limit);
686
+ }
650
687
  return new SqlQueryStatement(sql);
651
688
  }
652
689
  }
@@ -708,93 +745,170 @@ _a = Selection, _Selection_sql = new WeakMap(), _Selection_instances = new WeakS
708
745
  return new _a(sql);
709
746
  };
710
747
 
711
- /** @public */
712
- class DbTableQuery extends DbTable {
713
- constructor(name, statement) {
714
- super(name);
715
- this.statement = statement;
748
+ var _AfterInsert_sql;
749
+ class AfterUpdateOrReturn extends SqlQueryStatement {
750
+ returning(returns) {
751
+ if (typeof returns === "function")
752
+ returns = returns();
753
+ let columnsStr;
754
+ if (returns === "*") {
755
+ columnsStr = "*";
756
+ }
757
+ else {
758
+ const res = selectColumnsOrTable(returns);
759
+ columnsStr = res.sqlColumns;
760
+ }
761
+ let sql = this.toString() + "\nRETURNING " + columnsStr;
762
+ return new SqlQueryStatement(sql);
763
+ }
764
+ onConflict(onConflict) {
765
+ if (typeof onConflict === "function")
766
+ onConflict = onConflict();
767
+ if (typeof onConflict !== "string")
768
+ onConflict = onConflict.join(",");
769
+ let sql = this.toString() + `\nON CONFLICT (${onConflict})`;
770
+ return new AfterInsert(sql);
771
+ }
772
+ where(where$1) {
773
+ const sql = where(where$1);
774
+ return new AfterUpdateOrReturn(this.toString() + sql);
775
+ }
776
+ }
777
+ class AfterInsert {
778
+ constructor(sql) {
779
+ _AfterInsert_sql.set(this, void 0);
780
+ __classPrivateFieldSet(this, _AfterInsert_sql, sql, "f");
781
+ }
782
+ doUpdate(set) {
783
+ if (typeof set === "function")
784
+ set = set();
785
+ let sql = this.toString();
786
+ if (typeof set === "object") {
787
+ sql += "\nDO UPDATE ";
788
+ sql += createUpdateSetFromObject(set);
789
+ }
790
+ else if (set)
791
+ sql += "DO UPDATE SET\n" + set;
792
+ else
793
+ sql += "DO NOTHING";
794
+ return new AfterUpdateOrReturn(sql);
795
+ }
796
+ doNotThing() {
797
+ return new AfterUpdateOrReturn(__classPrivateFieldGet(this, _AfterInsert_sql, "f") + " DO NOTHING");
798
+ }
799
+ toString() {
800
+ return __classPrivateFieldGet(this, _AfterInsert_sql, "f");
801
+ }
802
+ }
803
+ _AfterInsert_sql = new WeakMap();
804
+
805
+ /**
806
+ * 数据库表
807
+ * @public
808
+ */
809
+ class DbTable extends SqlSelectable {
810
+ constructor(name) {
811
+ super();
812
+ this.name = name;
716
813
  }
717
814
  fromAs(as) {
718
- return new Selection(this, as);
815
+ return new Selection(this.name, as);
719
816
  }
720
817
  select(columns, as) {
721
818
  return this.fromAs(as).select(columns);
722
819
  }
723
- insert(values, columns_option, option) {
820
+ /**
821
+ * INSERT 语句,需要注意 SQL 注入
822
+ * @example
823
+ * ```ts
824
+ * table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
825
+ * ```
826
+ */
827
+ insert(columns, values) {
828
+ if (typeof columns !== "string" || !columns)
829
+ throw new TypeError("columns 必须是有效的 string 类型");
830
+ if (typeof values === "function")
831
+ values = values();
832
+ if (typeof values !== "string")
833
+ throw new TypeError("values 必须是 string 或 function 类型");
834
+ let sql = `INSERT INTO ${this.name}(${columns})\n${values}`;
835
+ return new AfterUpdateOrReturn(sql);
836
+ }
837
+ /**
838
+ * UPDATE 语句,需要注意 SQL 注入
839
+ * @example
840
+ * ```ts
841
+ * table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
842
+ * table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
843
+ * ```
844
+ */
845
+ update(values) {
724
846
  if (typeof values === "function")
725
847
  values = values();
726
- let columnStr;
727
- let valuesStr;
728
- if (typeof values === "string") {
729
- valuesStr = values;
730
- if (typeof columns_option === "string")
731
- columnStr = columns_option;
732
- else if (columns_option instanceof Array) {
733
- if (columns_option.length === 0)
734
- throw new Error("插入列为空");
735
- columnStr = columns_option.join(",");
848
+ switch (typeof values) {
849
+ case "object": {
850
+ let sql = createUpdateSetFromObject(values);
851
+ return new AfterUpdateOrReturn("UPDATE " + this.name + " " + sql);
736
852
  }
737
- else
738
- throw new Error(" values string 类型时,必须指定 columns");
853
+ case "string":
854
+ return new AfterUpdateOrReturn("UPDATE " + this.name + " SET\n" + values);
855
+ default:
856
+ throw new TypeError("参数 values 错误");
857
+ }
858
+ }
859
+ delete(option = {}) {
860
+ let sql = "DELETE FROM " + this.name;
861
+ sql += where(option.where);
862
+ return new AfterUpdateOrReturn(sql);
863
+ }
864
+ toSelect() {
865
+ return this.name;
866
+ }
867
+ toString() {
868
+ return this.name;
869
+ }
870
+ }
871
+
872
+ /** @public */
873
+ class DbTableQuery extends DbTable {
874
+ constructor(name, statement) {
875
+ super(name);
876
+ this.statement = statement;
877
+ }
878
+ insert(values_column, _values) {
879
+ if (_values)
880
+ return super.insert(values_column, _values);
881
+ let values = values_column;
882
+ if (typeof values === "function")
883
+ values = values();
884
+ if (typeof values !== "object")
885
+ throw new TypeError("values 类型错误");
886
+ let valuesStr;
887
+ let insertCol;
888
+ if (values instanceof Array) {
889
+ if (values.length === 0)
890
+ throw new Error("值不能为空");
891
+ insertCol = Array.from(getObjectListKeys(values));
892
+ valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
739
893
  }
740
894
  else {
741
- let insertCol;
742
- option = columns_option;
743
- if (typeof values === "object") {
744
- if (values instanceof Array) {
745
- if (values.length === 0)
746
- throw new Error("值不能为空");
747
- insertCol = Array.from(getObjectListKeys(values));
748
- valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
749
- }
750
- else if (values instanceof SqlQueryStatement) {
751
- // todo 验证 values.columns 和 this.columns 是否匹配
752
- valuesStr = values.toString();
753
- insertCol = values.columns;
754
- }
755
- else {
756
- insertCol = Object.keys(values);
757
- valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
758
- }
759
- }
760
- else
761
- throw new Error("values 应该是 Array 或 TableQuery 类型");
762
- if (insertCol.length === 0)
763
- throw new Error("插入列不能为空");
764
- columnStr = insertCol.join(",");
895
+ insertCol = Object.keys(values);
896
+ valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
765
897
  }
898
+ if (insertCol.length === 0)
899
+ throw new Error("插入列不能为空");
900
+ const columnStr = insertCol.join(",");
766
901
  let sql = `INSERT INTO ${this.name} (${columnStr})\n${valuesStr}`;
767
- if (option) {
768
- let { updateValues, conflict, where: inputWhere } = option;
769
- if (conflict) {
770
- if (typeof conflict !== "string")
771
- conflict = conflict.join(",");
772
- sql += `\nON CONFLICT (${conflict})`;
773
- if (typeof updateValues === "function")
774
- updateValues = updateValues();
775
- if (updateValues) {
776
- const updateKey = Object.entries(updateValues);
777
- sql += `\nDO UPDATE SET\n${updateKey.map(([key, v = "EXCLUDED." + key]) => key + " = " + v).join(",\n")}`;
778
- }
779
- else
780
- sql += "DO NOTHING";
781
- sql += where(inputWhere);
782
- }
783
- }
784
- return sql;
785
- }
786
- insertWithResult(values, returns, columns, option) {
787
- let sql = this.insert(values, columns, option);
788
- return genRetuningSql(sql, returns);
902
+ return new AfterUpdateOrReturn(sql);
789
903
  }
790
904
  /**
905
+ * UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
791
906
  * @example
792
907
  * ```ts
793
- * table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
794
- * table.update({age:3, name:"hi"}) // "UPDATE table SET age=3, name='hi'"
908
+ * table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
795
909
  * ```
796
910
  */
797
- update(values, option = {}) {
911
+ updateFrom(values) {
798
912
  if (typeof values === "function")
799
913
  values = values();
800
914
  let setStr;
@@ -806,41 +920,15 @@ class DbTableQuery extends DbTable {
806
920
  for (const [k, v] of updateKey) {
807
921
  if (v === undefined)
808
922
  continue;
809
- setList.push(k + " = " + this.statement.toSqlStr(v));
923
+ setList.push(k + "= " + this.statement.toSqlStr(v));
810
924
  }
811
925
  setStr = setList.join(",\n");
812
926
  }
813
927
  if (!setStr)
814
928
  throw new Error("值不能为空");
815
- let sql = `UPDATE ${this.name}\nSET ${setStr}`;
816
- sql += where(option.where);
817
- return sql;
818
- }
819
- updateWithResult(values, returns, option) {
820
- let sql = this.update(values, option);
821
- return genRetuningSql(sql, returns);
822
- }
823
- delete(option = {}) {
824
- let sql = "DELETE FROM " + this.name;
825
- sql += where(option.where);
826
- return sql;
827
- }
828
- deleteWithResult(returns = "*", option) {
829
- let sql = this.delete(option);
830
- return genRetuningSql(sql, returns);
831
- }
832
- }
833
- function genRetuningSql(sql, returns) {
834
- let columnsStr;
835
- if (returns === "*") {
836
- columnsStr = "*";
837
- }
838
- else {
839
- const res = selectColumnsOrTable(returns);
840
- columnsStr = res.sqlColumns;
929
+ let sql = `UPDATE ${this.name} SET\n${setStr}`;
930
+ return new AfterUpdateOrReturn(sql);
841
931
  }
842
- sql += "\nRETURNING " + columnsStr;
843
- return new SqlQueryStatement(sql);
844
932
  }
845
933
 
846
934
  /**
@@ -0,0 +1,48 @@
1
+ import { SqlSelectable } from "./selectable.ts";
2
+ import { ConditionParam, Constructable } from "../util.ts";
3
+ import type { TableType } from "./type.ts";
4
+ import { CurrentModifyWhere, CurrentOnConflict, CurrentWhere, Selection } from "./query_link.ts";
5
+ /**
6
+ * 数据库表
7
+ * @public
8
+ */
9
+ export declare class DbTable<T extends TableType> extends SqlSelectable<T> {
10
+ readonly name: string;
11
+ constructor(name: string);
12
+ fromAs(as?: string): Selection;
13
+ /** 选择单表全部列 */
14
+ select(columns: "*", as?: string): CurrentWhere<T>;
15
+ /** 选择单表 */
16
+ select(columns: Constructable<Record<string, boolean | string> | string>, as?: string): CurrentWhere<Record<string, any>>;
17
+ /** 选择单表 */
18
+ select<R extends {}>(columns: Constructable<{
19
+ [key in keyof R]: boolean | string;
20
+ } | string>, as?: string): CurrentWhere<R>;
21
+ /**
22
+ * INSERT 语句,需要注意 SQL 注入
23
+ * @example
24
+ * ```ts
25
+ * table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
26
+ * ```
27
+ */
28
+ insert(columns: string, values: Constructable<string>): CurrentOnConflict<T>;
29
+ /**
30
+ * UPDATE 语句,需要注意 SQL 注入
31
+ * @example
32
+ * ```ts
33
+ * table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
34
+ * table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
35
+ * ```
36
+ */
37
+ update(values: Constructable<{
38
+ [key in keyof T]?: string;
39
+ } | string>): CurrentModifyWhere<T>;
40
+ delete(option?: DeleteOption): CurrentModifyWhere<T>;
41
+ toSelect(): string;
42
+ toString(): string;
43
+ }
44
+ /** @public */
45
+ export interface DeleteOption {
46
+ where?: Constructable<ConditionParam | void>;
47
+ }
48
+ //# sourceMappingURL=DbTable.d.ts.map
@@ -1,28 +1,12 @@
1
1
  import { SqlValuesCreator } from "../sql_value/sql_value.ts";
2
- import { ColumnsSelected, SelectColumns, UpdateRowValue, TableType } from "./type.ts";
3
- import { CurrentWhere, Selection } from "./select.ts";
4
- import { DbTable, SqlQueryStatement } from "./selectable.ts";
5
- import { ConditionParam, Constructable } from "../util.ts";
2
+ import { UpdateRowValue, TableType } from "./type.ts";
3
+ import { Constructable } from "../util.ts";
4
+ import { DbTable } from "./DbTable.ts";
5
+ import type { CurrentModifyWhere, CurrentOnConflict } from "./query_link.ts";
6
6
  /** @public */
7
7
  export declare class DbTableQuery<T extends TableType = Record<string, any>, C extends TableType = Partial<T>> extends DbTable<T> {
8
8
  private statement;
9
9
  constructor(name: string, statement: SqlValuesCreator);
10
- fromAs(as?: string): Selection;
11
- /** 选择单表全部列 */
12
- select(columns: "*", as?: string): CurrentWhere<T>;
13
- /**
14
- * 选择单表
15
- * @param columns - 对象选择
16
- */
17
- select<R extends {
18
- [key in keyof T]?: boolean;
19
- }>(columns: Constructable<R>, as?: string): CurrentWhere<{
20
- [key in keyof R]: key extends keyof T ? T[key] : unknown;
21
- }>;
22
- /** 选择单表- 所有类型 */
23
- select<R extends {}>(columns: Constructable<{
24
- [key in keyof R]?: key extends keyof T ? string | boolean : string;
25
- } | string>, as?: string): CurrentWhere<R>;
26
10
  /**
27
11
  * @example
28
12
  * ```ts
@@ -30,42 +14,15 @@ export declare class DbTableQuery<T extends TableType = Record<string, any>, C e
30
14
  * table.insert([{age:18, name:"hi"}, {age:17, name:"hh"}]) // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
31
15
  * ```
32
16
  */
33
- insert(values: Constructable<C | C[]>, option?: InsertOption<T>): string;
34
- /**
35
- * @example
36
- * ```ts
37
- * table.insert("VALUES (18, 'hi'), (17, 'hh')", ["age","name"]) // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
38
- * ```
39
- */
40
- insert(values: Constructable<string>, columns: string[], option?: InsertOption<T>): string;
41
- insertWithResult<R extends ColumnsSelected<T>>(values: Constructable<C | C[]>, returns: R, option?: InsertOption<T>): SqlQueryStatement<SelectColumns<T, R>>;
42
- insertWithResult<R extends ColumnsSelected<T>>(values: Constructable<string>, returns: R, columns: string | string[], option?: InsertOption<T>): SqlQueryStatement<SelectColumns<T, R>>;
17
+ insert(values: Constructable<UpdateRowValue<C> | UpdateRowValue<C>[]>): CurrentOnConflict<T>;
18
+ insert(columns: string, values: Constructable<string>): CurrentOnConflict<T>;
43
19
  /**
20
+ * UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
44
21
  * @example
45
22
  * ```ts
46
- * table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
47
- * table.update({age:3, name:"hi"}) // "UPDATE table SET age=3, name='hi'"
23
+ * table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
48
24
  * ```
49
25
  */
50
- update(values: Constructable<UpdateRowValue<T> | string>, option?: UpdateOption): string;
51
- updateWithResult<R extends ColumnsSelected<T>>(values: Constructable<UpdateRowValue<T>>, returns: R, option?: UpdateOption): SqlQueryStatement<SelectColumns<T, R>>;
52
- delete(option?: DeleteOption): string;
53
- deleteWithResult<R extends ColumnsSelected<T>>(returns?: ColumnsSelected<T> | "*", option?: DeleteOption): SqlQueryStatement<SelectColumns<T, R>>;
54
- }
55
- /** @public */
56
- export interface InsertOption<T extends object> {
57
- conflict?: (keyof T)[] | string;
58
- updateValues?: Constructable<{
59
- [key in keyof T]?: undefined | String | T[key];
60
- } | string | void>;
61
- where?: Constructable<ConditionParam | void>;
62
- }
63
- /** @public */
64
- export interface UpdateOption {
65
- where?: Constructable<ConditionParam | void>;
66
- }
67
- /** @public */
68
- export interface DeleteOption {
69
- where?: Constructable<ConditionParam | void>;
26
+ updateFrom(values: Constructable<UpdateRowValue<T>>): CurrentModifyWhere<T>;
70
27
  }
71
28
  //# sourceMappingURL=TableQuery.d.ts.map
@@ -8,5 +8,6 @@ type ConditionParam = string | string[];
8
8
  * 生成条件语句
9
9
  */
10
10
  export declare function condition(conditions?: Constructable<ConditionParam | void>, type?: "AND" | "OR"): string;
11
+ export declare function createUpdateSetFromObject(set: Record<string, string | undefined>): string;
11
12
  export {};
12
13
  //# sourceMappingURL=_statement.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { ConditionParam, Constructable } from "../util.ts";
2
+ import { CurrentModifyWhere, CurrentOnConflict, CurrentOnConflictDo, CurrentReturn } from "./query_link.ts";
3
+ import { SqlQueryStatement } from "./selectable.ts";
4
+ import { ColumnsSelected, TableType } from "./type.ts";
5
+ export declare class AfterUpdateOrReturn<T extends TableType = {}> extends SqlQueryStatement<{}> implements CurrentOnConflict<T>, CurrentModifyWhere<T> {
6
+ returning<R extends {}>(returns: Constructable<ColumnsSelected<any> | "*">): SqlQueryStatement<R>;
7
+ onConflict(onConflict: Constructable<readonly string[] | string>): CurrentOnConflictDo<T>;
8
+ where(where: Constructable<ConditionParam | void>): CurrentReturn<T>;
9
+ }
10
+ export declare class AfterInsert<T extends TableType = {}> implements CurrentOnConflictDo<T> {
11
+ #private;
12
+ constructor(sql: string);
13
+ doUpdate(set?: Constructable<string | {
14
+ [key: string]: string | undefined;
15
+ }>): CurrentModifyWhere<T>;
16
+ doNotThing(): CurrentReturn<T>;
17
+ toString(): string;
18
+ }
19
+ //# sourceMappingURL=_update_impl.d.ts.map
@@ -1,9 +1,9 @@
1
1
  import { SqlSelectable, SqlQueryStatement } from "./selectable.ts";
2
2
  import { OrderByParam, ConditionParam, SelectParam, Constructable } from "../util.ts";
3
- import type { TableType } from "./type.ts";
3
+ import type { ColumnsSelected, TableType } from "./type.ts";
4
4
  /** @public */
5
5
  export interface CurrentLimit<T extends TableType> extends SqlQueryStatement<T> {
6
- limit(limit?: number, offset?: number): SqlQueryStatement<T>;
6
+ limit(limit?: number | bigint, offset?: number | bigint): SqlQueryStatement<T>;
7
7
  }
8
8
  /** @public */
9
9
  export interface CurrentOrderBy<T extends TableType> extends CurrentLimit<T> {
@@ -35,7 +35,7 @@ export declare class Selection {
35
35
  crossJoin(selectable: Constructable<SqlSelectable<any> | string>, as?: string | undefined): Selection;
36
36
  from(selectable: Constructable<SqlSelectable<any> | string>, as?: string): Selection;
37
37
  /** 选择全部列 */
38
- select<T extends TableType = TableType>(columns: "*"): CurrentWhere<T>;
38
+ select<T extends TableType = Record<string, any>>(columns: "*"): CurrentWhere<T>;
39
39
  /**
40
40
  * 自定义SQL选择语句
41
41
  * @example
@@ -43,7 +43,7 @@ export declare class Selection {
43
43
  * selection.select("t.age, count(*) AS c") // SELECT t.age,count(*) AS c FROM ...
44
44
  * ```
45
45
  */
46
- select<T extends TableType = TableType>(columns: Constructable<string>): CurrentWhere<T>;
46
+ select(columns: Constructable<SelectParam>): CurrentWhere<Record<string, any>>;
47
47
  /**
48
48
  * 通过 object 选择 列
49
49
  * @example
@@ -53,7 +53,31 @@ export declare class Selection {
53
53
  */
54
54
  select<T extends TableType>(columns: Constructable<{
55
55
  [key in keyof T]: string | boolean;
56
- }>): CurrentWhere<T>;
57
- select(columns: Constructable<SelectParam>): CurrentWhere<TableType>;
56
+ } | string>): CurrentWhere<T>;
58
57
  }
59
- //# sourceMappingURL=select.d.ts.map
58
+ /** @public */
59
+ export interface CurrentReturn<T extends TableType = {}> extends SqlQueryStatement<{}> {
60
+ returning(columns: "*"): SqlQueryStatement<T>;
61
+ returning(columns: Constructable<ColumnsSelected<T> | string>): SqlQueryStatement<Record<string, any>>;
62
+ returning<R extends TableType>(columns: Constructable<ColumnsSelected<R> | string>): SqlQueryStatement<R>;
63
+ }
64
+ /** @public */
65
+ export type CurrentModifyWhere<T extends TableType = {}> = CurrentReturn<T> & {
66
+ where(where: Constructable<ConditionParam | void>): CurrentReturn<T>;
67
+ };
68
+ /** @public */
69
+ export type CurrentOnConflictDo<T extends TableType = {}> = {
70
+ doNotThing(): CurrentReturn<T>;
71
+ /**
72
+ * 需要注意 SQL 注入
73
+ */
74
+ doUpdate(set: Constructable<string | {
75
+ [key in keyof T]?: string;
76
+ }>): CurrentModifyWhere<T>;
77
+ toString(): string;
78
+ };
79
+ /** @public */
80
+ export type CurrentOnConflict<T extends TableType = {}> = CurrentReturn<T> & {
81
+ onConflict(option: Constructable<readonly (keyof T)[] | string>): CurrentOnConflictDo<T>;
82
+ };
83
+ //# sourceMappingURL=query_link.d.ts.map
@@ -22,16 +22,6 @@ export declare abstract class SqlSelectable<T extends TableType> {
22
22
  /** 保留以推断类型 */
23
23
  protected [SQL_SELECTABLE]: T;
24
24
  }
25
- /**
26
- * 数据库表
27
- * @public
28
- */
29
- export declare class DbTable<T extends TableType> extends SqlSelectable<T> {
30
- readonly name: string;
31
- constructor(name: string);
32
- toSelect(): string;
33
- toString(): string;
34
- }
35
25
  /**
36
26
  * SELECT 以及 UPDATE、DELETE、INSERT INTO 带结果的 SQL 语句
37
27
  * @public
@@ -26,12 +26,12 @@ export type OrderValue = "ASC" | "DESC";
26
26
  */
27
27
  export type ColumnsSelected<T extends TableType> = {
28
28
  [key in keyof T]?: boolean | string;
29
- } | "*";
29
+ };
30
30
  /**
31
31
  * 从一个表格选择列,生成新的表格类型
32
32
  * @public
33
33
  */
34
- export type SelectColumns<T extends TableType, R extends ColumnsSelected<T>> = R extends "*" ? T : R extends {
34
+ export type SelectColumns<T extends TableType, R extends ColumnsSelected<T>> = R extends {
35
35
  [key in keyof T]?: boolean | string;
36
36
  } ? {
37
37
  [key in keyof T as R[key] extends true ? key : StringOnly<R[key]>]: T[key];
@@ -14,11 +14,6 @@ export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
14
14
  export type SqlValueEncoder<T = any> = (this: SqlValuesCreator, value: T) => string;
15
15
  /** @public 断言类型 */
16
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;
22
17
  /** @public */
23
18
  export type SqlValueFn = SqlValuesCreator & {
24
19
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asla/yoursql",
3
- "version": "0.6.5",
3
+ "version": "0.7.1",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/mod.d.ts",