@asla/yoursql 0.8.1 → 0.8.2
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/client/DbCursor.d.ts +14 -0
- package/dist/client/DbPoolConnection.d.ts +29 -0
- package/dist/client/DbPoolTransaction.d.ts +29 -0
- package/dist/client/DbQuery.d.ts +68 -0
- package/dist/client/errors.d.ts +9 -0
- package/dist/client/interfaces.d.ts +66 -0
- package/dist/client/mod.d.ts +7 -0
- package/dist/client.js +209 -0
- package/dist/{mod.js → sql_gen.js} +48 -68
- package/package.json +5 -2
- /package/dist/{mod.d.ts → sql_gen/mod.d.ts} +0 -0
- /package/dist/{select → sql_gen/select}/DbTable.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/TableQuery.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/_statement.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_abstract.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_insert.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_select.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/type.d.ts +0 -0
- /package/dist/{sql_value → sql_gen/sql_value}/db_type.d.ts +0 -0
- /package/dist/{sql_value → sql_gen/sql_value}/sql_value.d.ts +0 -0
- /package/dist/{util.d.ts → sql_gen/util.d.ts} +0 -0
- /package/dist/{your_table → sql_gen/your_table}/checker.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/infer_db_type.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/mod.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/table.d.ts +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export interface DbCursorOption {
|
|
3
|
+
defaultSize?: number;
|
|
4
|
+
}
|
|
5
|
+
/** @public */
|
|
6
|
+
export declare abstract class DbCursor<T> {
|
|
7
|
+
/** 读取游标,如果读取结束,返回空数组 */
|
|
8
|
+
abstract read(maxSize?: number): Promise<T[]>;
|
|
9
|
+
/** 提前关闭游标,如果多次调用,会被忽略 */
|
|
10
|
+
abstract close(): Promise<void>;
|
|
11
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
12
|
+
[Symbol.asyncIterator](): AsyncGenerator<T, undefined, void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DbCursor.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
+
import { DbQuery } from "./DbQuery.ts";
|
|
3
|
+
import type { MultipleQueryResult, QueryRowsResult } from "./DbQuery.ts";
|
|
4
|
+
import type { DbConnection, TransactionMode } from "./interfaces.ts";
|
|
5
|
+
/**
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 池连接
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export declare class DbPoolConnection extends DbQuery {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(conn: DbConnection, onRelease: () => void);
|
|
14
|
+
begin(mode?: TransactionMode): Promise<void>;
|
|
15
|
+
query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
16
|
+
query<T = any>(sql: {
|
|
17
|
+
toString(): string;
|
|
18
|
+
}): Promise<QueryRowsResult<T>>;
|
|
19
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: {
|
|
20
|
+
toString(): string;
|
|
21
|
+
}): Promise<T>;
|
|
22
|
+
rollback(): Promise<void>;
|
|
23
|
+
commit(): Promise<void>;
|
|
24
|
+
get released(): boolean;
|
|
25
|
+
/** 调用 release() 时,如果事务未提交,则抛出异常 */
|
|
26
|
+
release(): void;
|
|
27
|
+
[Symbol.dispose](): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=DbPoolConnection.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
+
import { DbQuery } from "./DbQuery.ts";
|
|
3
|
+
import type { MultipleQueryResult, QueryRowsResult } from "./DbQuery.ts";
|
|
4
|
+
import type { DbPoolConnection } from "./DbPoolConnection.ts";
|
|
5
|
+
import type { DbTransaction, TransactionMode } from "./interfaces.ts";
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
* 池连接事务
|
|
9
|
+
*/
|
|
10
|
+
export declare class DbPoolTransaction extends DbQuery implements DbTransaction {
|
|
11
|
+
#private;
|
|
12
|
+
readonly mode?: TransactionMode | undefined;
|
|
13
|
+
constructor(connect: () => Promise<DbPoolConnection>, mode?: TransactionMode | undefined);
|
|
14
|
+
commit(): Promise<void>;
|
|
15
|
+
rollback(): Promise<void>;
|
|
16
|
+
savePoint(savePoint: string): Promise<void>;
|
|
17
|
+
rollbackTo(savePoint: string): Promise<void>;
|
|
18
|
+
query<T extends object = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
19
|
+
query<T extends object = any>(sql: {
|
|
20
|
+
toString(): string;
|
|
21
|
+
}): Promise<QueryRowsResult<T>>;
|
|
22
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlStatementDataset<T>): Promise<T>;
|
|
23
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: {
|
|
24
|
+
toString(): string;
|
|
25
|
+
}): Promise<T>;
|
|
26
|
+
get released(): boolean;
|
|
27
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=DbPoolTransaction.d.ts.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
+
/** @public */
|
|
3
|
+
export interface SingleQueryResult {
|
|
4
|
+
rowCount: number;
|
|
5
|
+
rows?: any[];
|
|
6
|
+
}
|
|
7
|
+
/** @public */
|
|
8
|
+
export interface QueryRowsResult<T = any> extends SingleQueryResult {
|
|
9
|
+
rowCount: number;
|
|
10
|
+
rows: T[];
|
|
11
|
+
}
|
|
12
|
+
/** @public */
|
|
13
|
+
export type MultipleQueryResult = SingleQueryResult[];
|
|
14
|
+
/** @public */
|
|
15
|
+
export type QueryResult = MultipleQueryResult | SingleQueryResult;
|
|
16
|
+
/**
|
|
17
|
+
* SQL 查询相关操作
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export declare abstract class DbQuery {
|
|
21
|
+
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
22
|
+
abstract query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
23
|
+
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
24
|
+
abstract query<T = any>(sql: {
|
|
25
|
+
toString(): string;
|
|
26
|
+
}): Promise<QueryRowsResult<T>>;
|
|
27
|
+
/** 多语句查询 */
|
|
28
|
+
abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlStatementDataset<T>): Promise<T>;
|
|
29
|
+
/** 多语句查询 */
|
|
30
|
+
abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: {
|
|
31
|
+
toString(): string;
|
|
32
|
+
}): Promise<T>;
|
|
33
|
+
/** 单语句查询受影响的行 */
|
|
34
|
+
queryCount(sql: string | {
|
|
35
|
+
toString(): string;
|
|
36
|
+
}): Promise<number>;
|
|
37
|
+
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
38
|
+
queryRows<T = any>(sql: SqlStatementDataset<T>): Promise<T[]>;
|
|
39
|
+
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
40
|
+
queryRows<T = any>(sql: {
|
|
41
|
+
toString(): string;
|
|
42
|
+
}): Promise<T[]>;
|
|
43
|
+
/**
|
|
44
|
+
* 查询行
|
|
45
|
+
* 不应查询单条语句,否则返回错误值
|
|
46
|
+
*/
|
|
47
|
+
multipleQueryRows<T extends any[] = any[]>(sql: SqlStatementDataset<T>): Promise<T[]>;
|
|
48
|
+
/**
|
|
49
|
+
* 查询行
|
|
50
|
+
* 不应查询条语句,否则返回错误值
|
|
51
|
+
*/
|
|
52
|
+
multipleQueryRows<T extends any[] = any[]>(sql: {
|
|
53
|
+
toString(): string;
|
|
54
|
+
}): Promise<T[]>;
|
|
55
|
+
/**
|
|
56
|
+
* 指定某一列为key,返回 key 到 row 的映射
|
|
57
|
+
* 单语句查询,不应查询条语句,否则返回错误值
|
|
58
|
+
*/
|
|
59
|
+
queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: SqlStatementDataset<T>, key: K): Promise<Map<T[K], T>>;
|
|
60
|
+
/**
|
|
61
|
+
* 指定某一列为key,返回 key 到 row 的映射
|
|
62
|
+
* 单语句查询,不应查询条语句,否则返回错误值
|
|
63
|
+
*/
|
|
64
|
+
queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: {
|
|
65
|
+
toString(): string;
|
|
66
|
+
}, key: K): Promise<Map<T[K], T>>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=DbQuery.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
+
import { DbQuery } from "./DbQuery.ts";
|
|
3
|
+
import { DbPoolConnection } from "./DbPoolConnection.ts";
|
|
4
|
+
import { DbCursor, DbCursorOption } from "./DbCursor.ts";
|
|
5
|
+
/**
|
|
6
|
+
* 数据库连接
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export interface DbConnection extends DbQuery, AsyncDisposable {
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** @public */
|
|
13
|
+
export type TransactionMode = "SERIALIZABLE" | "REPEATABLE READ" | "READ COMMITTED" | "READ UNCOMMITTED";
|
|
14
|
+
/**
|
|
15
|
+
* SQL 事务查询操作
|
|
16
|
+
*
|
|
17
|
+
* 使用 `await using` 语法离开作用域时,如果没有 `commit()` 或 `rollback(`) , 则调用 `rollback()`
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* async function doSomeTransaction(){
|
|
21
|
+
* await using transaction = pool.begin()
|
|
22
|
+
* await transaction.query("SELECT * FROM user")
|
|
23
|
+
* throw new Error("error")
|
|
24
|
+
* }
|
|
25
|
+
* try{
|
|
26
|
+
* await doSomeTransaction()
|
|
27
|
+
* }catch(e){
|
|
28
|
+
* console.error(e)
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
* 下面的写法会造成连接池泄露
|
|
32
|
+
* ```ts
|
|
33
|
+
* async function doSomeTransaction(){
|
|
34
|
+
* const transaction = pool.begin()
|
|
35
|
+
* await transaction.query("SELECT * FROM user")
|
|
36
|
+
* }
|
|
37
|
+
* await doSomeTransaction() // 离开作用域后连接不会被回收
|
|
38
|
+
* console.warn("连接未被回收!")
|
|
39
|
+
*
|
|
40
|
+
* ```
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
export interface DbTransaction extends DbQuery, AsyncDisposable {
|
|
44
|
+
/** 回滚,并释放连接 */
|
|
45
|
+
rollback(): Promise<void>;
|
|
46
|
+
/** 回滚到保存点 */
|
|
47
|
+
rollbackTo(savePoint: string): Promise<void>;
|
|
48
|
+
savePoint(savePoint: string): Promise<void>;
|
|
49
|
+
/** 提交,并释放连接 */
|
|
50
|
+
commit(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @public
|
|
54
|
+
* 池链接查询
|
|
55
|
+
*/
|
|
56
|
+
export interface DbQueryPool extends DbQuery {
|
|
57
|
+
connect(): Promise<DbPoolConnection>;
|
|
58
|
+
idleCount: number;
|
|
59
|
+
totalCount: number;
|
|
60
|
+
begin(mode?: TransactionMode): DbTransaction;
|
|
61
|
+
cursor<T extends {}>(sql: SqlStatementDataset<T>): Promise<DbCursor<T>>;
|
|
62
|
+
cursor<T>(sql: {
|
|
63
|
+
toString(): string;
|
|
64
|
+
}, option?: DbCursorOption): Promise<DbCursor<T>>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* SQL 查询相关操作
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
class DbQuery {
|
|
19
|
+
/** 单语句查询受影响的行 */
|
|
20
|
+
queryCount(sql) {
|
|
21
|
+
return this.query(sql.toString()).then((res) => {
|
|
22
|
+
if (res.rowCount === null)
|
|
23
|
+
return 0;
|
|
24
|
+
return res.rowCount;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
queryRows(sql) {
|
|
28
|
+
return this.query(sql.toString()).then((res) => res.rows);
|
|
29
|
+
}
|
|
30
|
+
multipleQueryRows(sql) {
|
|
31
|
+
return this.multipleQuery(sql.toString()).then((res) => res.map((item) => item.rows ?? []));
|
|
32
|
+
}
|
|
33
|
+
async queryMap(sql, key) {
|
|
34
|
+
const { rows } = await this.query(sql.toString());
|
|
35
|
+
let map = new Map();
|
|
36
|
+
for (let i = 0; i < rows.length; i++) {
|
|
37
|
+
map.set(rows[i][key], rows[i]);
|
|
38
|
+
}
|
|
39
|
+
return map;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** @public */
|
|
44
|
+
class DbCursor {
|
|
45
|
+
// implement
|
|
46
|
+
[Symbol.asyncDispose]() {
|
|
47
|
+
return this.close();
|
|
48
|
+
}
|
|
49
|
+
async *[Symbol.asyncIterator]() {
|
|
50
|
+
let data = await this.read();
|
|
51
|
+
try {
|
|
52
|
+
while (data.length) {
|
|
53
|
+
yield* data;
|
|
54
|
+
data = await this.read();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await this.close();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 池连接
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
class DbPoolConnection extends DbQuery {
|
|
70
|
+
constructor(conn, onRelease) {
|
|
71
|
+
super();
|
|
72
|
+
this.#conn = conn;
|
|
73
|
+
this.#onRelease = onRelease;
|
|
74
|
+
}
|
|
75
|
+
#onRelease;
|
|
76
|
+
//implement
|
|
77
|
+
async begin(mode) {
|
|
78
|
+
await this.query("BEGIN" + (mode ? " TRANSACTION ISOLATION LEVEL " + mode : ""));
|
|
79
|
+
}
|
|
80
|
+
#conn;
|
|
81
|
+
query(sql) {
|
|
82
|
+
if (!this.#conn)
|
|
83
|
+
return Promise.reject(new ConnectionNotAvailableError("Connection already release"));
|
|
84
|
+
return this.#conn.query(sql);
|
|
85
|
+
}
|
|
86
|
+
multipleQuery(sql) {
|
|
87
|
+
if (!this.#conn)
|
|
88
|
+
return Promise.reject(new ConnectionNotAvailableError("Connection already release"));
|
|
89
|
+
return this.#conn.multipleQuery(sql);
|
|
90
|
+
}
|
|
91
|
+
//implement
|
|
92
|
+
async rollback() {
|
|
93
|
+
await this.query("ROLLBACK");
|
|
94
|
+
}
|
|
95
|
+
//implement
|
|
96
|
+
async commit() {
|
|
97
|
+
await this.query("COMMIT");
|
|
98
|
+
}
|
|
99
|
+
get released() {
|
|
100
|
+
return !this.#conn;
|
|
101
|
+
}
|
|
102
|
+
/** 调用 release() 时,如果事务未提交,则抛出异常 */
|
|
103
|
+
release() {
|
|
104
|
+
if (this.#conn) {
|
|
105
|
+
this.#conn = undefined;
|
|
106
|
+
this.#onRelease();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//implement
|
|
110
|
+
[Symbol.dispose]() {
|
|
111
|
+
return this.release();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @public
|
|
117
|
+
* 池连接事务
|
|
118
|
+
*/
|
|
119
|
+
class DbPoolTransaction extends DbQuery {
|
|
120
|
+
mode;
|
|
121
|
+
constructor(connect, mode) {
|
|
122
|
+
super();
|
|
123
|
+
this.mode = mode;
|
|
124
|
+
this.#query = (sql) => {
|
|
125
|
+
return new Promise((resolve, reject) => {
|
|
126
|
+
this.#pending = connect()
|
|
127
|
+
.then((conn) => {
|
|
128
|
+
this.#conn = conn;
|
|
129
|
+
const promise = conn.multipleQuery("BEGIN" + (this.mode ? " TRANSACTION ISOLATION LEVEL " + this.mode : "") + ";\n" + sql);
|
|
130
|
+
this.#pending = promise;
|
|
131
|
+
this.#query = this.#queryAfter;
|
|
132
|
+
return promise;
|
|
133
|
+
})
|
|
134
|
+
.then((res) => {
|
|
135
|
+
this.#pending = undefined;
|
|
136
|
+
resolve(res[1]);
|
|
137
|
+
}, (e) => {
|
|
138
|
+
this.#pending = undefined;
|
|
139
|
+
reject(e);
|
|
140
|
+
if (this.#conn)
|
|
141
|
+
this.#release(this.#conn, e);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
#pending;
|
|
147
|
+
#conn;
|
|
148
|
+
async commit() {
|
|
149
|
+
if (this.#pending)
|
|
150
|
+
throw new ParallelQueryError();
|
|
151
|
+
if (this.#conn) {
|
|
152
|
+
const promise = this.#conn.query("COMMIT");
|
|
153
|
+
this.#release(this.#conn);
|
|
154
|
+
await promise;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async rollback() {
|
|
158
|
+
if (this.#pending)
|
|
159
|
+
throw new ParallelQueryError();
|
|
160
|
+
if (this.#conn) {
|
|
161
|
+
const promise = this.#conn.query("ROLLBACK");
|
|
162
|
+
this.#release(this.#conn);
|
|
163
|
+
await promise;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
savePoint(savePoint) {
|
|
167
|
+
return this.query("SAVEPOINT" + savePoint).then(() => { });
|
|
168
|
+
}
|
|
169
|
+
rollbackTo(savePoint) {
|
|
170
|
+
return this.query("ROLLBACK TO " + savePoint).then(() => { });
|
|
171
|
+
}
|
|
172
|
+
/** 拿到连接后执行这个 */
|
|
173
|
+
#queryAfter(sql) {
|
|
174
|
+
return this.#conn.query(sql).then((res) => {
|
|
175
|
+
this.#pending = undefined;
|
|
176
|
+
return res;
|
|
177
|
+
}, (e) => {
|
|
178
|
+
this.#pending = undefined;
|
|
179
|
+
this.#release(this.#conn, e);
|
|
180
|
+
throw e;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
#query;
|
|
184
|
+
query(sql) {
|
|
185
|
+
if (this.#pending)
|
|
186
|
+
return Promise.reject(new ParallelQueryError());
|
|
187
|
+
return this.#query(sql.toString());
|
|
188
|
+
}
|
|
189
|
+
multipleQuery(sql) {
|
|
190
|
+
if (this.#pending)
|
|
191
|
+
return Promise.reject(new ParallelQueryError());
|
|
192
|
+
return this.#query(sql.toString());
|
|
193
|
+
}
|
|
194
|
+
#error;
|
|
195
|
+
#release(conn, error = new ConnectionNotAvailableError("Connection already release")) {
|
|
196
|
+
this.#error = error;
|
|
197
|
+
this.#query = () => Promise.reject(this.#error);
|
|
198
|
+
this.#conn = undefined;
|
|
199
|
+
conn.release();
|
|
200
|
+
}
|
|
201
|
+
get released() {
|
|
202
|
+
return !!this.#error;
|
|
203
|
+
}
|
|
204
|
+
[Symbol.asyncDispose]() {
|
|
205
|
+
return this.rollback();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export { ConnectionNotAvailableError, DbCursor, DbPoolConnection, DbPoolTransaction, DbQuery, ParallelQueryError };
|
|
@@ -1,38 +1,3 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
Copyright (c) Microsoft Corporation.
|
|
3
|
-
|
|
4
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
-
purpose with or without fee is hereby granted.
|
|
6
|
-
|
|
7
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
-
***************************************************************************** */
|
|
15
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
19
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
20
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
21
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
25
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
26
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
27
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
28
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
32
|
-
var e = new Error(message);
|
|
33
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
1
|
function condition(conditions, type = "AND") {
|
|
37
2
|
if (typeof conditions === "function")
|
|
38
3
|
conditions = conditions();
|
|
@@ -271,6 +236,7 @@ class SqlStatementDataset extends SqlStatement {
|
|
|
271
236
|
}
|
|
272
237
|
/** @public */
|
|
273
238
|
class SqlTextStatementDataset extends SqlStatementDataset {
|
|
239
|
+
sql;
|
|
274
240
|
constructor(sql) {
|
|
275
241
|
super();
|
|
276
242
|
this.sql = sql;
|
|
@@ -280,7 +246,6 @@ class SqlTextStatementDataset extends SqlStatementDataset {
|
|
|
280
246
|
}
|
|
281
247
|
}
|
|
282
248
|
|
|
283
|
-
var _YourValuesAs_asName, _YourValuesAs_valuesStr, _YourValuesAs_sql;
|
|
284
249
|
/**
|
|
285
250
|
* SQL 原始字符类。可以使用 String 类代替,这只是为了推断类型
|
|
286
251
|
* @public
|
|
@@ -326,6 +291,7 @@ class SqlValuesCreator {
|
|
|
326
291
|
}
|
|
327
292
|
}
|
|
328
293
|
}
|
|
294
|
+
_map;
|
|
329
295
|
/**
|
|
330
296
|
* 将 JS 对象转为 SQL 的字符值的形式 。 undefined 将被转换为 DEFAULT
|
|
331
297
|
* ```ts
|
|
@@ -544,21 +510,20 @@ class SqlValuesCreator {
|
|
|
544
510
|
class YourValuesAs extends SqlStatementDataset {
|
|
545
511
|
constructor(columns, asName, valuesStr) {
|
|
546
512
|
super();
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
__classPrivateFieldSet(this, _YourValuesAs_asName, asName, "f");
|
|
551
|
-
__classPrivateFieldSet(this, _YourValuesAs_valuesStr, valuesStr, "f");
|
|
552
|
-
__classPrivateFieldSet(this, _YourValuesAs_sql, `(VALUES\n${__classPrivateFieldGet(this, _YourValuesAs_valuesStr, "f")})\nAS ${__classPrivateFieldGet(this, _YourValuesAs_asName, "f")}(${columns.join(",")})`, "f");
|
|
513
|
+
this.#asName = asName;
|
|
514
|
+
this.#valuesStr = valuesStr;
|
|
515
|
+
this.#sql = `(VALUES\n${this.#valuesStr})\nAS ${this.#asName}(${columns.join(",")})`;
|
|
553
516
|
}
|
|
517
|
+
#asName;
|
|
518
|
+
#valuesStr;
|
|
519
|
+
#sql;
|
|
554
520
|
toSelect() {
|
|
555
|
-
return
|
|
521
|
+
return this.#sql;
|
|
556
522
|
}
|
|
557
523
|
toString() {
|
|
558
|
-
return
|
|
524
|
+
return this.#sql;
|
|
559
525
|
}
|
|
560
526
|
}
|
|
561
|
-
_YourValuesAs_asName = new WeakMap(), _YourValuesAs_valuesStr = new WeakMap(), _YourValuesAs_sql = new WeakMap();
|
|
562
527
|
function initColumnAssert(keys, keys_types) {
|
|
563
528
|
let key;
|
|
564
529
|
let value;
|
|
@@ -618,7 +583,7 @@ const pgSqlTransformer = new Map([
|
|
|
618
583
|
],
|
|
619
584
|
]);
|
|
620
585
|
|
|
621
|
-
var
|
|
586
|
+
var _a;
|
|
622
587
|
/**
|
|
623
588
|
* @public ChainSelectWhere 的默认实现
|
|
624
589
|
*/
|
|
@@ -673,34 +638,40 @@ class Selection {
|
|
|
673
638
|
static from(selectable, as) {
|
|
674
639
|
return new this(selectable, as);
|
|
675
640
|
}
|
|
641
|
+
#sql;
|
|
676
642
|
constructor(selectable, as) {
|
|
677
|
-
|
|
678
|
-
_Selection_sql.set(this, void 0);
|
|
679
|
-
__classPrivateFieldSet(this, _Selection_sql, fromAs(selectable, as), "f");
|
|
643
|
+
this.#sql = fromAs(selectable, as);
|
|
680
644
|
}
|
|
681
645
|
toString() {
|
|
682
|
-
return "FROM " +
|
|
646
|
+
return "FROM " + this.#sql;
|
|
647
|
+
}
|
|
648
|
+
#join(type, selectable, as, on) {
|
|
649
|
+
let sql = this.#sql + "\n" + type + " " + fromAs(selectable, as);
|
|
650
|
+
if (on) {
|
|
651
|
+
sql += " ON " + condition(on);
|
|
652
|
+
}
|
|
653
|
+
return new _a(sql);
|
|
683
654
|
}
|
|
684
655
|
fullJoin(selectable, as, on) {
|
|
685
|
-
return
|
|
656
|
+
return this.#join("FULL JOIN", selectable, as, on);
|
|
686
657
|
}
|
|
687
658
|
innerJoin(selectable, as, on) {
|
|
688
|
-
return
|
|
659
|
+
return this.#join("INNER JOIN", selectable, as, on);
|
|
689
660
|
}
|
|
690
661
|
leftJoin(selectable, as, on) {
|
|
691
|
-
return
|
|
662
|
+
return this.#join("LEFT JOIN", selectable, as, on);
|
|
692
663
|
}
|
|
693
664
|
rightJoin(selectable, as, on) {
|
|
694
|
-
return
|
|
665
|
+
return this.#join("RIGHT JOIN", selectable, as, on);
|
|
695
666
|
}
|
|
696
667
|
naturalJoin(selectable, as) {
|
|
697
|
-
return
|
|
668
|
+
return this.#join("NATURAL JOIN", selectable, as);
|
|
698
669
|
}
|
|
699
670
|
crossJoin(selectable, as) {
|
|
700
|
-
return
|
|
671
|
+
return this.#join("CROSS JOIN", selectable, as);
|
|
701
672
|
}
|
|
702
673
|
from(selectable, as) {
|
|
703
|
-
return new _a(
|
|
674
|
+
return new _a(this.#sql + "," + fromAs(selectable, as));
|
|
704
675
|
}
|
|
705
676
|
select(columnsIn) {
|
|
706
677
|
if (typeof columnsIn === "function")
|
|
@@ -710,15 +681,10 @@ class Selection {
|
|
|
710
681
|
return new SqlSelectChain(sql);
|
|
711
682
|
}
|
|
712
683
|
}
|
|
713
|
-
_a = Selection
|
|
714
|
-
let sql = __classPrivateFieldGet(this, _Selection_sql, "f") + "\n" + type + " " + fromAs(selectable, as);
|
|
715
|
-
if (on) {
|
|
716
|
-
sql += " ON " + condition(on);
|
|
717
|
-
}
|
|
718
|
-
return new _a(sql);
|
|
719
|
-
};
|
|
684
|
+
_a = Selection;
|
|
720
685
|
|
|
721
686
|
class SqlChainModify extends SqlStatement {
|
|
687
|
+
sql;
|
|
722
688
|
constructor(sql) {
|
|
723
689
|
super();
|
|
724
690
|
this.sql = sql;
|
|
@@ -753,6 +719,7 @@ class SqlChainModify extends SqlStatement {
|
|
|
753
719
|
}
|
|
754
720
|
}
|
|
755
721
|
class SqlInsertConflictBranch {
|
|
722
|
+
sql;
|
|
756
723
|
constructor(sql) {
|
|
757
724
|
this.sql = sql;
|
|
758
725
|
}
|
|
@@ -780,6 +747,7 @@ class SqlInsertConflictBranch {
|
|
|
780
747
|
* @public
|
|
781
748
|
*/
|
|
782
749
|
class DbTable {
|
|
750
|
+
name;
|
|
783
751
|
constructor(name) {
|
|
784
752
|
this.name = name;
|
|
785
753
|
}
|
|
@@ -840,6 +808,7 @@ class DbTable {
|
|
|
840
808
|
|
|
841
809
|
/** @public */
|
|
842
810
|
class DbTableQuery extends DbTable {
|
|
811
|
+
statement;
|
|
843
812
|
constructor(name, statement) {
|
|
844
813
|
super(name);
|
|
845
814
|
this.statement = statement;
|
|
@@ -905,6 +874,11 @@ class DbTableQuery extends DbTable {
|
|
|
905
874
|
* @public
|
|
906
875
|
*/
|
|
907
876
|
class ColumnMeta {
|
|
877
|
+
type;
|
|
878
|
+
sqlType;
|
|
879
|
+
notNull;
|
|
880
|
+
isArray;
|
|
881
|
+
sqlDefault;
|
|
908
882
|
constructor(type,
|
|
909
883
|
/** 数据库原始数据类型 */
|
|
910
884
|
sqlType,
|
|
@@ -932,6 +906,7 @@ class ColumnMeta {
|
|
|
932
906
|
* @public
|
|
933
907
|
*/
|
|
934
908
|
class YourTypeMap {
|
|
909
|
+
typeMap;
|
|
935
910
|
static create(rawTypeMap) {
|
|
936
911
|
return new this(rawTypeMap);
|
|
937
912
|
}
|
|
@@ -957,18 +932,21 @@ function baseType(v) {
|
|
|
957
932
|
* @public
|
|
958
933
|
*/
|
|
959
934
|
class CustomDbType {
|
|
935
|
+
is;
|
|
936
|
+
name;
|
|
937
|
+
static bigint = new CustomDbType(baseType, "bigint");
|
|
938
|
+
static number = new CustomDbType(baseType, "number");
|
|
939
|
+
static string = new CustomDbType(baseType, "string");
|
|
940
|
+
static boolean = new CustomDbType(baseType, "boolean");
|
|
960
941
|
constructor(is, name) {
|
|
961
942
|
this.is = is;
|
|
962
943
|
this.name = name;
|
|
963
944
|
}
|
|
964
945
|
}
|
|
965
|
-
CustomDbType.bigint = new CustomDbType(baseType, "bigint");
|
|
966
|
-
CustomDbType.number = new CustomDbType(baseType, "number");
|
|
967
|
-
CustomDbType.string = new CustomDbType(baseType, "string");
|
|
968
|
-
CustomDbType.boolean = new CustomDbType(baseType, "boolean");
|
|
969
946
|
|
|
970
947
|
/** @public */
|
|
971
948
|
class TypeChecker {
|
|
949
|
+
map;
|
|
972
950
|
constructor(map) {
|
|
973
951
|
this.map = map;
|
|
974
952
|
}
|
|
@@ -1050,11 +1028,13 @@ function getErrStr(expect, actual) {
|
|
|
1050
1028
|
* @public
|
|
1051
1029
|
*/
|
|
1052
1030
|
class YourTable extends DbTableQuery {
|
|
1031
|
+
define;
|
|
1053
1032
|
constructor(name, define, sqlValue) {
|
|
1054
1033
|
super(name, sqlValue);
|
|
1055
1034
|
this.define = define;
|
|
1056
1035
|
this.columns = Object.keys(define);
|
|
1057
1036
|
}
|
|
1037
|
+
columns;
|
|
1058
1038
|
getColumnMeta(name) {
|
|
1059
1039
|
return Reflect.get(this.define, name);
|
|
1060
1040
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asla/yoursql",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/mod.d.ts",
|
|
7
|
+
"packageManager": "pnpm@10.4.0",
|
|
7
8
|
"scripts": {
|
|
8
9
|
"ci:test": "vitest run",
|
|
9
10
|
"ci:build": "pnpm rollup -c build/rollup.config.js",
|
|
@@ -16,6 +17,7 @@
|
|
|
16
17
|
"devDependencies": {
|
|
17
18
|
"@microsoft/api-extractor": "^7.47.9",
|
|
18
19
|
"@rollup/plugin-typescript": "^12.1.0",
|
|
20
|
+
"prettier": "^3.5.3",
|
|
19
21
|
"rollup": "^4.22.4",
|
|
20
22
|
"tslib": "^2.7.0",
|
|
21
23
|
"typescript": "^5.6.2",
|
|
@@ -27,7 +29,8 @@
|
|
|
27
29
|
"url": "https://github.com/asnowc/yoursql"
|
|
28
30
|
},
|
|
29
31
|
"exports": {
|
|
30
|
-
".": "./dist/
|
|
32
|
+
".": "./dist/sql_gen.js",
|
|
33
|
+
"./client": "./dist/client.js"
|
|
31
34
|
},
|
|
32
35
|
"files": [
|
|
33
36
|
"dist/**/*.js",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|