@asla/yoursql 0.8.2 → 0.8.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.
Files changed (32) hide show
  1. package/dist/client/DbCursor.js +21 -0
  2. package/dist/client/DbPoolConnection.js +56 -0
  3. package/dist/client/DbPoolTransaction.js +98 -0
  4. package/dist/client/DbQuery.js +30 -0
  5. package/dist/client/errors.js +14 -0
  6. package/dist/client/mod.js +5 -0
  7. package/dist/sql_gen/mod.d.ts +3 -1
  8. package/dist/sql_gen/mod.js +19 -0
  9. package/dist/sql_gen/select/DbTable.d.ts +8 -7
  10. package/dist/sql_gen/select/DbTable.js +70 -0
  11. package/dist/sql_gen/select/TableQuery.d.ts +4 -4
  12. package/dist/sql_gen/select/TableQuery.js +68 -0
  13. package/dist/sql_gen/select/_statement.js +60 -0
  14. package/dist/sql_gen/select/chain_base.d.ts +44 -0
  15. package/dist/sql_gen/select/chain_base.js +27 -0
  16. package/dist/sql_gen/select/chain_modify.d.ts +33 -0
  17. package/dist/sql_gen/select/chain_select.d.ts +28 -0
  18. package/dist/sql_gen/select/query_chain_insert.d.ts +7 -5
  19. package/dist/sql_gen/select/query_chain_insert.js +67 -0
  20. package/dist/sql_gen/select/query_chain_select.d.ts +11 -10
  21. package/dist/sql_gen/select/query_chain_select.js +105 -0
  22. package/dist/sql_gen/sql_value/db_type.js +40 -0
  23. package/dist/sql_gen/sql_value/sql_value.d.ts +1 -1
  24. package/dist/sql_gen/sql_value/sql_value.js +304 -0
  25. package/dist/sql_gen/util.js +166 -0
  26. package/dist/sql_gen/your_table/checker.js +82 -0
  27. package/dist/sql_gen/your_table/infer_db_type.js +76 -0
  28. package/dist/sql_gen/your_table/table.js +33 -0
  29. package/package.json +3 -3
  30. package/dist/client.js +0 -209
  31. package/dist/sql_gen/select/query_chain_abstract.d.ts +0 -91
  32. package/dist/sql_gen.js +0 -1061
@@ -0,0 +1,21 @@
1
+ /** @public */
2
+ class DbCursor {
3
+ // implement
4
+ [Symbol.asyncDispose]() {
5
+ return this.close();
6
+ }
7
+ async *[Symbol.asyncIterator]() {
8
+ let data = await this.read();
9
+ try {
10
+ while (data.length) {
11
+ yield* data;
12
+ data = await this.read();
13
+ }
14
+ }
15
+ finally {
16
+ await this.close();
17
+ }
18
+ }
19
+ }
20
+
21
+ export { DbCursor };
@@ -0,0 +1,56 @@
1
+ import { DbQuery } from './DbQuery.js';
2
+ import { ConnectionNotAvailableError } from './errors.js';
3
+
4
+ /**
5
+
6
+ /**
7
+ * 池连接
8
+ * @public
9
+ */
10
+ class DbPoolConnection extends DbQuery {
11
+ constructor(conn, onRelease) {
12
+ super();
13
+ this.#conn = conn;
14
+ this.#onRelease = onRelease;
15
+ }
16
+ #onRelease;
17
+ //implement
18
+ async begin(mode) {
19
+ await this.query("BEGIN" + (mode ? " TRANSACTION ISOLATION LEVEL " + mode : ""));
20
+ }
21
+ #conn;
22
+ query(sql) {
23
+ if (!this.#conn)
24
+ return Promise.reject(new ConnectionNotAvailableError("Connection already release"));
25
+ return this.#conn.query(sql);
26
+ }
27
+ multipleQuery(sql) {
28
+ if (!this.#conn)
29
+ return Promise.reject(new ConnectionNotAvailableError("Connection already release"));
30
+ return this.#conn.multipleQuery(sql);
31
+ }
32
+ //implement
33
+ async rollback() {
34
+ await this.query("ROLLBACK");
35
+ }
36
+ //implement
37
+ async commit() {
38
+ await this.query("COMMIT");
39
+ }
40
+ get released() {
41
+ return !this.#conn;
42
+ }
43
+ /** 调用 release() 时,如果事务未提交,则抛出异常 */
44
+ release() {
45
+ if (this.#conn) {
46
+ this.#conn = undefined;
47
+ this.#onRelease();
48
+ }
49
+ }
50
+ //implement
51
+ [Symbol.dispose]() {
52
+ return this.release();
53
+ }
54
+ }
55
+
56
+ export { DbPoolConnection };
@@ -0,0 +1,98 @@
1
+ import { DbQuery } from './DbQuery.js';
2
+ import { ParallelQueryError, ConnectionNotAvailableError } from './errors.js';
3
+
4
+ /**
5
+ * @public
6
+ * 池连接事务
7
+ */
8
+ class DbPoolTransaction extends DbQuery {
9
+ mode;
10
+ constructor(connect, mode) {
11
+ super();
12
+ this.mode = mode;
13
+ this.#query = (sql) => {
14
+ return new Promise((resolve, reject) => {
15
+ this.#pending = connect()
16
+ .then((conn) => {
17
+ this.#conn = conn;
18
+ const promise = conn.multipleQuery("BEGIN" + (this.mode ? " TRANSACTION ISOLATION LEVEL " + this.mode : "") + ";\n" + sql);
19
+ this.#pending = promise;
20
+ this.#query = this.#queryAfter;
21
+ return promise;
22
+ })
23
+ .then((res) => {
24
+ this.#pending = undefined;
25
+ resolve(res[1]);
26
+ }, (e) => {
27
+ this.#pending = undefined;
28
+ reject(e);
29
+ if (this.#conn)
30
+ this.#release(this.#conn, e);
31
+ });
32
+ });
33
+ };
34
+ }
35
+ #pending;
36
+ #conn;
37
+ async commit() {
38
+ if (this.#pending)
39
+ throw new ParallelQueryError();
40
+ if (this.#conn) {
41
+ const promise = this.#conn.query("COMMIT");
42
+ this.#release(this.#conn);
43
+ await promise;
44
+ }
45
+ }
46
+ async rollback() {
47
+ if (this.#pending)
48
+ throw new ParallelQueryError();
49
+ if (this.#conn) {
50
+ const promise = this.#conn.query("ROLLBACK");
51
+ this.#release(this.#conn);
52
+ await promise;
53
+ }
54
+ }
55
+ savePoint(savePoint) {
56
+ return this.query("SAVEPOINT" + savePoint).then(() => { });
57
+ }
58
+ rollbackTo(savePoint) {
59
+ return this.query("ROLLBACK TO " + savePoint).then(() => { });
60
+ }
61
+ /** 拿到连接后执行这个 */
62
+ #queryAfter(sql) {
63
+ return this.#conn.query(sql).then((res) => {
64
+ this.#pending = undefined;
65
+ return res;
66
+ }, (e) => {
67
+ this.#pending = undefined;
68
+ this.#release(this.#conn, e);
69
+ throw e;
70
+ });
71
+ }
72
+ #query;
73
+ query(sql) {
74
+ if (this.#pending)
75
+ return Promise.reject(new ParallelQueryError());
76
+ return this.#query(sql.toString());
77
+ }
78
+ multipleQuery(sql) {
79
+ if (this.#pending)
80
+ return Promise.reject(new ParallelQueryError());
81
+ return this.#query(sql.toString());
82
+ }
83
+ #error;
84
+ #release(conn, error = new ConnectionNotAvailableError("Connection already release")) {
85
+ this.#error = error;
86
+ this.#query = () => Promise.reject(this.#error);
87
+ this.#conn = undefined;
88
+ conn.release();
89
+ }
90
+ get released() {
91
+ return !!this.#error;
92
+ }
93
+ [Symbol.asyncDispose]() {
94
+ return this.rollback();
95
+ }
96
+ }
97
+
98
+ export { DbPoolTransaction };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SQL 查询相关操作
3
+ * @public
4
+ */
5
+ class DbQuery {
6
+ /** 单语句查询受影响的行 */
7
+ queryCount(sql) {
8
+ return this.query(sql.toString()).then((res) => {
9
+ if (res.rowCount === null)
10
+ return 0;
11
+ return res.rowCount;
12
+ });
13
+ }
14
+ queryRows(sql) {
15
+ return this.query(sql.toString()).then((res) => res.rows);
16
+ }
17
+ multipleQueryRows(sql) {
18
+ return this.multipleQuery(sql.toString()).then((res) => res.map((item) => item.rows ?? []));
19
+ }
20
+ async queryMap(sql, key) {
21
+ const { rows } = await this.query(sql.toString());
22
+ let map = new Map();
23
+ for (let i = 0; i < rows.length; i++) {
24
+ map.set(rows[i][key], rows[i]);
25
+ }
26
+ return map;
27
+ }
28
+ }
29
+
30
+ export { DbQuery };
@@ -0,0 +1,14 @@
1
+ /** @public */
2
+ class ParallelQueryError extends Error {
3
+ constructor() {
4
+ super("The previous query was not completed and cannot be executed");
5
+ }
6
+ }
7
+ /** @public */
8
+ class ConnectionNotAvailableError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ }
12
+ }
13
+
14
+ export { ConnectionNotAvailableError, ParallelQueryError };
@@ -0,0 +1,5 @@
1
+ export { ConnectionNotAvailableError, ParallelQueryError } from './errors.js';
2
+ export { DbQuery } from './DbQuery.js';
3
+ export { DbCursor } from './DbCursor.js';
4
+ export { DbPoolConnection } from './DbPoolConnection.js';
5
+ export { DbPoolTransaction } from './DbPoolTransaction.js';
@@ -3,7 +3,9 @@ export * from "./sql_value/sql_value.ts";
3
3
  export * from "./select/type.ts";
4
4
  export * from "./select/DbTable.ts";
5
5
  export * from "./select/query_chain_select.ts";
6
- export * from "./select/query_chain_abstract.ts";
6
+ export * from "./select/chain_base.ts";
7
+ export * from "./select/chain_modify.ts";
8
+ export * from "./select/chain_select.ts";
7
9
  export * from "./select/TableQuery.ts";
8
10
  export * from "./util.ts";
9
11
  export * from "./your_table/mod.ts";
@@ -0,0 +1,19 @@
1
+ import { pgSqlTransformer } from './sql_value/db_type.js';
2
+ import { SqlValuesCreator } from './sql_value/sql_value.js';
3
+ export { SqlRaw } from './sql_value/sql_value.js';
4
+ export { DbTable } from './select/DbTable.js';
5
+ export { Selection, SqlSelectChain } from './select/query_chain_select.js';
6
+ export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset } from './select/chain_base.js';
7
+ export { DbTableQuery } from './select/TableQuery.js';
8
+ export { getObjectListKeys, having, orderBy, selectColumns, where } from './util.js';
9
+ export { TypeChecker } from './your_table/checker.js';
10
+ export { ColumnMeta, CustomDbType, YourTypeMap } from './your_table/infer_db_type.js';
11
+ export { YourTable } from './your_table/table.js';
12
+
13
+ /**
14
+ * 默认的 SqlValuesCreator 实列
15
+ * @public
16
+ */
17
+ const v = SqlValuesCreator.create(pgSqlTransformer);
18
+
19
+ export { SqlValuesCreator, pgSqlTransformer, v };
@@ -1,7 +1,8 @@
1
1
  import { ConditionParam, Constructable } from "../util.ts";
2
2
  import type { TableType } from "./type.ts";
3
3
  import { Selection } from "./query_chain_select.ts";
4
- import { ChainModifyWhere, ChainOnConflict, ChainSelectWhere } from "./query_chain_abstract.ts";
4
+ import { ChainDelete, ChainInsert, ChainUpdate } from "./chain_modify.ts";
5
+ import { ChainSelect } from "./chain_select.ts";
5
6
  /**
6
7
  * 数据库表
7
8
  * @public
@@ -11,13 +12,13 @@ export declare class DbTable<T extends TableType> {
11
12
  constructor(name: string);
12
13
  fromAs(as?: string): Selection;
13
14
  /** 选择单表全部列 */
14
- select(columns: "*", as?: string): ChainSelectWhere<T>;
15
+ select(columns: "*", as?: string): ChainSelect<T>;
15
16
  /** 选择单表 */
16
- select(columns: Constructable<Record<string, boolean | string> | string>, as?: string): ChainSelectWhere<Record<string, any>>;
17
+ select(columns: Constructable<Record<string, boolean | string> | string>, as?: string): ChainSelect<Record<string, any>>;
17
18
  /** 选择单表 */
18
19
  select<R extends {}>(columns: Constructable<{
19
20
  [key in keyof R]: boolean | string;
20
- } | string>, as?: string): ChainSelectWhere<R>;
21
+ } | string>, as?: string): ChainSelect<R>;
21
22
  /**
22
23
  * INSERT 语句,需要注意 SQL 注入
23
24
  * @example
@@ -25,7 +26,7 @@ export declare class DbTable<T extends TableType> {
25
26
  * table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
26
27
  * ```
27
28
  */
28
- insert(columns: string, values: Constructable<string>): ChainOnConflict<T>;
29
+ insert(columns: string, values: Constructable<string>): ChainInsert<T>;
29
30
  /**
30
31
  * UPDATE 语句,需要注意 SQL 注入
31
32
  * @example
@@ -36,8 +37,8 @@ export declare class DbTable<T extends TableType> {
36
37
  */
37
38
  update(values: Constructable<{
38
39
  [key in keyof T]?: string;
39
- } | string>): ChainModifyWhere<T>;
40
- delete(option?: DeleteOption): ChainModifyWhere<T>;
40
+ } | string>): ChainUpdate<T>;
41
+ delete(option?: DeleteOption): ChainDelete<T>;
41
42
  toSelect(): string;
42
43
  }
43
44
  /** @public */
@@ -0,0 +1,70 @@
1
+ import { where } from '../util.js';
2
+ import { Selection } from './query_chain_select.js';
3
+ import { SqlChainModify } from './query_chain_insert.js';
4
+ import { createUpdateSetFromObject } from './_statement.js';
5
+
6
+ /**
7
+ * 数据库表
8
+ * @public
9
+ */
10
+ class DbTable {
11
+ name;
12
+ constructor(name) {
13
+ this.name = name;
14
+ }
15
+ fromAs(as) {
16
+ return new Selection(this.name, as);
17
+ }
18
+ select(columns, as) {
19
+ return this.fromAs(as).select(columns);
20
+ }
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, values) {
29
+ if (typeof columns !== "string" || !columns)
30
+ throw new TypeError("columns 必须是有效的 string 类型");
31
+ if (typeof values === "function")
32
+ values = values();
33
+ if (typeof values !== "string")
34
+ throw new TypeError("values 必须是 string 或 function 类型");
35
+ let sql = `INSERT INTO ${this.name}(${columns})\n${values}`;
36
+ return new SqlChainModify(sql);
37
+ }
38
+ /**
39
+ * UPDATE 语句,需要注意 SQL 注入
40
+ * @example
41
+ * ```ts
42
+ * table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
43
+ * table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
44
+ * ```
45
+ */
46
+ update(values) {
47
+ if (typeof values === "function")
48
+ values = values();
49
+ switch (typeof values) {
50
+ case "object": {
51
+ let sql = createUpdateSetFromObject(values);
52
+ return new SqlChainModify("UPDATE " + this.name + " " + sql);
53
+ }
54
+ case "string":
55
+ return new SqlChainModify("UPDATE " + this.name + " SET\n" + values);
56
+ default:
57
+ throw new TypeError("参数 values 错误");
58
+ }
59
+ }
60
+ delete(option = {}) {
61
+ let sql = "DELETE FROM " + this.name;
62
+ sql += where(option.where);
63
+ return new SqlChainModify(sql);
64
+ }
65
+ toSelect() {
66
+ return this.name;
67
+ }
68
+ }
69
+
70
+ export { DbTable };
@@ -2,7 +2,7 @@ import { SqlValuesCreator } from "../sql_value/sql_value.ts";
2
2
  import { UpdateRowValue, TableType } from "./type.ts";
3
3
  import { Constructable } from "../util.ts";
4
4
  import { DbTable } from "./DbTable.ts";
5
- import { ChainModifyWhere, ChainOnConflict } from "./query_chain_abstract.ts";
5
+ import { ChainInsert, ChainUpdate } from "./chain_modify.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;
@@ -14,8 +14,8 @@ export declare class DbTableQuery<T extends TableType = Record<string, any>, C e
14
14
  * table.insert([{age:18, name:"hi"}, {age:17, name:"hh"}]) // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
15
15
  * ```
16
16
  */
17
- insert(values: Constructable<UpdateRowValue<C> | UpdateRowValue<C>[]>): ChainOnConflict<T>;
18
- insert(columns: string, values: Constructable<string>): ChainOnConflict<T>;
17
+ insert(values: Constructable<UpdateRowValue<C> | UpdateRowValue<C>[]>): ChainInsert<T>;
18
+ insert(columns: string, values: Constructable<string>): ChainInsert<T>;
19
19
  /**
20
20
  * UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
21
21
  * @example
@@ -23,6 +23,6 @@ export declare class DbTableQuery<T extends TableType = Record<string, any>, C e
23
23
  * table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
24
24
  * ```
25
25
  */
26
- updateFrom(values: Constructable<UpdateRowValue<T>>): ChainModifyWhere<T>;
26
+ updateFrom(values: Constructable<UpdateRowValue<T>>): ChainUpdate<T>;
27
27
  }
28
28
  //# sourceMappingURL=TableQuery.d.ts.map
@@ -0,0 +1,68 @@
1
+ import { getObjectListKeys } from '../util.js';
2
+ import { SqlChainModify } from './query_chain_insert.js';
3
+ import { DbTable } from './DbTable.js';
4
+
5
+ /** @public */
6
+ class DbTableQuery extends DbTable {
7
+ statement;
8
+ constructor(name, statement) {
9
+ super(name);
10
+ this.statement = statement;
11
+ }
12
+ insert(values_column, _values) {
13
+ if (_values)
14
+ return super.insert(values_column, _values);
15
+ let values = values_column;
16
+ if (typeof values === "function")
17
+ values = values();
18
+ if (typeof values !== "object")
19
+ throw new TypeError("values 类型错误");
20
+ let valuesStr;
21
+ let insertCol;
22
+ if (values instanceof Array) {
23
+ if (values.length === 0)
24
+ throw new Error("值不能为空");
25
+ insertCol = Array.from(getObjectListKeys(values));
26
+ valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
27
+ }
28
+ else {
29
+ insertCol = Object.keys(values);
30
+ valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
31
+ }
32
+ if (insertCol.length === 0)
33
+ throw new Error("插入列不能为空");
34
+ const columnStr = insertCol.join(",");
35
+ let sql = `INSERT INTO ${this.name} (${columnStr})\n${valuesStr}`;
36
+ return new SqlChainModify(sql);
37
+ }
38
+ /**
39
+ * UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
40
+ * @example
41
+ * ```ts
42
+ * table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
43
+ * ```
44
+ */
45
+ updateFrom(values) {
46
+ if (typeof values === "function")
47
+ values = values();
48
+ let setStr;
49
+ if (typeof values === "string")
50
+ setStr = values;
51
+ else {
52
+ const updateKey = Object.entries(values);
53
+ let setList = [];
54
+ for (const [k, v] of updateKey) {
55
+ if (v === undefined)
56
+ continue;
57
+ setList.push(k + "= " + this.statement.toSqlStr(v));
58
+ }
59
+ setStr = setList.join(",\n");
60
+ }
61
+ if (!setStr)
62
+ throw new Error("值不能为空");
63
+ let sql = `UPDATE ${this.name} SET\n${setStr}`;
64
+ return new SqlChainModify(sql);
65
+ }
66
+ }
67
+
68
+ export { DbTableQuery };
@@ -0,0 +1,60 @@
1
+ function condition(conditions, type = "AND") {
2
+ if (typeof conditions === "function")
3
+ conditions = conditions();
4
+ if (!conditions)
5
+ return;
6
+ if (typeof conditions === "string")
7
+ return conditions;
8
+ else {
9
+ if (conditions.length) {
10
+ let sql = "";
11
+ type = " " + type + " ";
12
+ sql += conditions[0];
13
+ for (let i = 1; i < conditions.length; i++)
14
+ sql += type + conditions[i];
15
+ return sql;
16
+ }
17
+ return;
18
+ }
19
+ }
20
+ function createUpdateSetFromObject(set) {
21
+ const updateKey = Object.keys(set);
22
+ let i = 0;
23
+ let key;
24
+ let value;
25
+ let sql;
26
+ for (; i < updateKey.length; i++) {
27
+ key = updateKey[i];
28
+ value = set[key];
29
+ if (value === undefined)
30
+ continue;
31
+ if (typeof value === "string") {
32
+ if (value) {
33
+ sql = "SET\n" + key + "= " + value;
34
+ break;
35
+ }
36
+ }
37
+ else
38
+ throw new TypeError(`key ${key} 类型错误(${typeof value})`);
39
+ }
40
+ if (sql) {
41
+ i++;
42
+ for (; i < updateKey.length; i++) {
43
+ key = updateKey[i];
44
+ value = set[key];
45
+ if (value === undefined)
46
+ continue;
47
+ if (typeof value === "string") {
48
+ if (value)
49
+ sql += "," + key + "= " + value;
50
+ }
51
+ else
52
+ throw new TypeError(`key ${key} 类型错误(${typeof value})`);
53
+ }
54
+ return sql;
55
+ }
56
+ else
57
+ throw new Error("值不能为空");
58
+ }
59
+
60
+ export { condition, createUpdateSetFromObject };
@@ -0,0 +1,44 @@
1
+ /** @public */
2
+ export declare abstract class SqlStatement {
3
+ /** 获取 SQL 语句 */
4
+ abstract toString(): string;
5
+ }
6
+ /**
7
+ * 可选择项。可以是 table、查询结果等,它能被 select 语句选择
8
+ * @example
9
+ * ```ts
10
+ * declare const item: SqlStatementDataset
11
+ * await query(`select * from ${item.toSelect()}`)
12
+ *
13
+ * ```
14
+ * @public
15
+ */
16
+ export interface SqlSelectable {
17
+ /**
18
+ * 转成子选择语句, 你可以使用 select form xxx 选择
19
+ * 如果是 table 则是 table name
20
+ * 如果是 选择语句,则是 (xxx)
21
+ */
22
+ toSelect(): string;
23
+ }
24
+ /** @public */
25
+ export declare abstract class SqlStatementDataset<T> extends SqlStatement implements SqlSelectable {
26
+ /**
27
+ * 转成子选择语句, 你可以使用 select form xxx 选择
28
+ * 如果是 table 则是 table name
29
+ * 如果是 选择语句,则是 (xxx)
30
+ */
31
+ toSelect(): string;
32
+ }
33
+ /** @public */
34
+ export declare class SqlTextStatementDataset<T> extends SqlStatementDataset<T> {
35
+ readonly sql: string;
36
+ constructor(sql: string);
37
+ toString(): string;
38
+ }
39
+ /**
40
+ * 推断查询结果的类型
41
+ * @public
42
+ */
43
+ export type InferQueryResult<T> = T extends SqlStatementDataset<infer P> ? P : never;
44
+ //# sourceMappingURL=chain_base.d.ts.map
@@ -0,0 +1,27 @@
1
+ /** @public */
2
+ class SqlStatement {
3
+ }
4
+ /** @public */
5
+ class SqlStatementDataset extends SqlStatement {
6
+ /**
7
+ * 转成子选择语句, 你可以使用 select form xxx 选择
8
+ * 如果是 table 则是 table name
9
+ * 如果是 选择语句,则是 (xxx)
10
+ */
11
+ toSelect() {
12
+ return "(" + this.toString() + ")";
13
+ }
14
+ }
15
+ /** @public */
16
+ class SqlTextStatementDataset extends SqlStatementDataset {
17
+ sql;
18
+ constructor(sql) {
19
+ super();
20
+ this.sql = sql;
21
+ }
22
+ toString() {
23
+ return this.sql;
24
+ }
25
+ }
26
+
27
+ export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset };
@@ -0,0 +1,33 @@
1
+ import { ConditionParam, Constructable, SelectParam } from "../util.ts";
2
+ import { TableType } from "./type.ts";
3
+ import { SqlStatement, SqlStatementDataset } from "./chain_base.ts";
4
+ /** @public */
5
+ export interface ChainModifyReturning<T extends TableType = {}> extends SqlStatement {
6
+ returning(columns: "*"): SqlStatementDataset<T>;
7
+ returning(columns: Constructable<SelectParam>): SqlStatementDataset<Record<string, any>>;
8
+ returning<R extends TableType>(columns: Constructable<SelectParam>): SqlStatementDataset<R>;
9
+ }
10
+ /** @public */
11
+ export interface ChainAfterConflictDo<T extends TableType = {}> {
12
+ doNotThing(): ChainModifyReturning<T>;
13
+ /**
14
+ * 需要注意 SQL 注入
15
+ */
16
+ doUpdate(set: Constructable<string | {
17
+ [key in keyof T]?: string;
18
+ }>): ChainModifyReturning<T>;
19
+ toString(): string;
20
+ }
21
+ /** @public */
22
+ export interface ChainInsert<T extends TableType = {}> extends ChainModifyReturning<T> {
23
+ onConflict(option: Constructable<readonly (keyof T)[] | string>): ChainAfterConflictDo<T>;
24
+ }
25
+ /** @public */
26
+ export interface ChainUpdate<T extends TableType = {}> extends ChainModifyReturning<T> {
27
+ where(where: Constructable<ConditionParam | void>): ChainModifyReturning<T>;
28
+ }
29
+ /** @public */
30
+ export interface ChainDelete<T extends TableType = {}> extends ChainModifyReturning<T> {
31
+ where(where: Constructable<ConditionParam | void>): ChainModifyReturning<T>;
32
+ }
33
+ //# sourceMappingURL=chain_modify.d.ts.map
@@ -0,0 +1,28 @@
1
+ import { ConditionParam, Constructable, OrderByParam } from "../util.ts";
2
+ import { SqlStatementDataset } from "./chain_base.ts";
3
+ import { TableType } from "./type.ts";
4
+ /** @public */
5
+ export interface ChainSelect<T extends TableType> extends ChainSelectAfterWhere<T> {
6
+ where(param: Constructable<ConditionParam | void>): ChainSelectAfterWhere<T>;
7
+ }
8
+ /** @public */
9
+ export interface ChainSelectAfterWhere<T extends TableType> extends ChainSelectAfterHaving<T> {
10
+ groupBy(columns: string | string[]): ChainSelectAfterGroupBy<T>;
11
+ }
12
+ /** @public */
13
+ export interface ChainSelectAfterGroupBy<T extends TableType> extends ChainSelectAfterHaving<T> {
14
+ orderBy(param: Constructable<OrderByParam | void>): ChainSelectAfterOrderBy<T>;
15
+ having(param: Constructable<ConditionParam | void>): ChainSelectAfterHaving<T>;
16
+ }
17
+ /** @public */
18
+ export interface ChainSelectAfterHaving<T extends TableType> extends ChainSelectAfterOrderBy<T> {
19
+ orderBy(param: Constructable<OrderByParam | void>): ChainSelectAfterOrderBy<T>;
20
+ }
21
+ /** @public */
22
+ export interface ChainSelectAfterOrderBy<T extends TableType> extends SqlStatementDataset<T> {
23
+ limit(limit?: number | bigint, offset?: number | bigint): ChainSelectAfterLimit<T>;
24
+ }
25
+ /** @public */
26
+ export interface ChainSelectAfterLimit<T extends TableType> extends SqlStatementDataset<T> {
27
+ }
28
+ //# sourceMappingURL=chain_select.d.ts.map