@asla/yoursql 0.13.0 → 0.14.0

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 (78) hide show
  1. package/README.md +22 -206
  2. package/dist/sql_gen/SqlStatement.d.ts +0 -1
  3. package/dist/sql_gen/SqlStatement.js +3 -5
  4. package/dist/sql_gen/_statement.d.ts +0 -1
  5. package/dist/sql_gen/_statement.js +10 -13
  6. package/dist/sql_gen/mod.d.ts +0 -1
  7. package/dist/sql_gen/mod.js +10 -19
  8. package/dist/sql_gen/sql_value/SqlValuesDataset.d.ts +28 -0
  9. package/dist/sql_gen/sql_value/SqlValuesDataset.js +51 -0
  10. package/dist/sql_gen/sql_value/ValueSqlTemplate.d.ts +0 -1
  11. package/dist/sql_gen/sql_value/ValueSqlTemplate.js +2 -5
  12. package/dist/sql_gen/sql_value/_to_values.d.ts +0 -1
  13. package/dist/sql_gen/sql_value/_to_values.js +5 -8
  14. package/dist/sql_gen/sql_value/db_type.d.ts +0 -1
  15. package/dist/sql_gen/sql_value/db_type.js +2 -5
  16. package/dist/sql_gen/sql_value/sql_value.d.ts +3 -25
  17. package/dist/sql_gen/sql_value/sql_value.js +7 -60
  18. package/dist/sql_gen/sql_value/type.d.ts +0 -1
  19. package/dist/sql_gen/sql_value/type.js +1 -0
  20. package/dist/sql_gen/statement/_modify.d.ts +0 -1
  21. package/dist/sql_gen/statement/_modify.js +1 -0
  22. package/dist/sql_gen/statement/cte.d.ts +0 -1
  23. package/dist/sql_gen/statement/cte.js +7 -10
  24. package/dist/sql_gen/statement/delete.d.ts +0 -1
  25. package/dist/sql_gen/statement/delete.js +2 -5
  26. package/dist/sql_gen/statement/delete_chain.d.ts +0 -1
  27. package/dist/sql_gen/statement/delete_chain.js +1 -0
  28. package/dist/sql_gen/statement/delete_impl.d.ts +0 -1
  29. package/dist/sql_gen/statement/delete_impl.js +3 -6
  30. package/dist/sql_gen/statement/insert.d.ts +0 -1
  31. package/dist/sql_gen/statement/insert.js +2 -5
  32. package/dist/sql_gen/statement/insert_chain.d.ts +8 -1
  33. package/dist/sql_gen/statement/insert_chain.js +1 -0
  34. package/dist/sql_gen/statement/insert_impl.d.ts +0 -1
  35. package/dist/sql_gen/statement/insert_impl.js +4 -7
  36. package/dist/sql_gen/statement/mod.d.ts +0 -1
  37. package/dist/sql_gen/statement/mod.js +9 -0
  38. package/dist/sql_gen/statement/select.d.ts +0 -1
  39. package/dist/sql_gen/statement/select.js +4 -7
  40. package/dist/sql_gen/statement/select_chain.d.ts +0 -1
  41. package/dist/sql_gen/statement/select_chain.js +1 -0
  42. package/dist/sql_gen/statement/select_impl.d.ts +0 -1
  43. package/dist/sql_gen/statement/select_impl.js +4 -7
  44. package/dist/sql_gen/statement/update.d.ts +0 -1
  45. package/dist/sql_gen/statement/update.js +2 -5
  46. package/dist/sql_gen/statement/update_chain.d.ts +0 -1
  47. package/dist/sql_gen/statement/update_chain.js +1 -0
  48. package/dist/sql_gen/statement/update_impl.d.ts +0 -1
  49. package/dist/sql_gen/statement/update_impl.js +4 -7
  50. package/dist/sql_gen/util.d.ts +0 -1
  51. package/dist/sql_gen/util.js +1 -3
  52. package/dist/sql_gen/your_table/checker.d.ts +0 -1
  53. package/dist/sql_gen/your_table/checker.js +2 -5
  54. package/dist/sql_gen/your_table/infer_db_type.d.ts +0 -1
  55. package/dist/sql_gen/your_table/infer_db_type.js +3 -5
  56. package/dist/sql_gen/your_table/mod.d.ts +0 -1
  57. package/dist/sql_gen/your_table/mod.js +3 -0
  58. package/dist/sql_gen/your_table/table.d.ts +0 -1
  59. package/dist/sql_gen/your_table/table.js +2 -5
  60. package/package.json +31 -34
  61. package/dist/client/DbCursor.d.ts +0 -14
  62. package/dist/client/DbCursor.js +0 -21
  63. package/dist/client/DbPoolConnection.d.ts +0 -5
  64. package/dist/client/DbPoolConnection.js +0 -74
  65. package/dist/client/DbPoolTransaction.d.ts +0 -9
  66. package/dist/client/DbPoolTransaction.js +0 -146
  67. package/dist/client/DbQuery.d.ts +0 -50
  68. package/dist/client/DbQuery.js +0 -42
  69. package/dist/client/DbQueryBase.d.ts +0 -38
  70. package/dist/client/DbQueryBase.js +0 -32
  71. package/dist/client/DbQueryPool.d.ts +0 -39
  72. package/dist/client/DbQueryPool.js +0 -56
  73. package/dist/client/_type.d.ts +0 -2
  74. package/dist/client/errors.d.ts +0 -9
  75. package/dist/client/errors.js +0 -14
  76. package/dist/client/interfaces.d.ts +0 -87
  77. package/dist/client/mod.d.ts +0 -9
  78. package/dist/client/mod.js +0 -7
package/README.md CHANGED
@@ -1,7 +1,5 @@
1
- [![ESM package][package]][package-url]
2
- [![NPM version][npm]][npm-url]
3
- [![JSR version][jsr]][jsr-url]
4
- [![Install size][size]][size-url]
1
+ [![ESM package][package]][package-url] [![NPM version][npm]][npm-url]
2
+ [![JSR version][jsr]][jsr-url] [![Install size][size]][size-url]
5
3
 
6
4
  [package]: https://img.shields.io/badge/package-ESM-ffe536.svg
7
5
  [package-url]: https://nodejs.org/api/esm.html
@@ -23,7 +21,8 @@ SQL 生成器
23
21
  安全转将 JS 值转换为 SQL 值,避免 SQL 注入
24
22
 
25
23
  `v` 函数能够将 JS 值转换为 SQL 的文本形式。\
26
- 默认情况下,支持 PostgresSQL, 因为不同数据库的值转换有些差异,如果使用其他数据库,可能需要配置对象到字符串的自定义转换器
24
+ 默认情况下,支持 PostgresSQL,
25
+ 因为不同数据库的值转换有些差异,如果使用其他数据库,可能需要配置对象到字符串的自定义转换器
27
26
 
28
27
  ```ts
29
28
  import { v } from "@asla/yoursql";
@@ -41,7 +40,8 @@ const params = { id: 3 };
41
40
  const sql = `SELECT * FROM user WHERE user_id=${v(params.id)}`;
42
41
  ```
43
42
 
44
- 如果传入 String 对象,将保留其字符串值,不会进行任何转换, 这在有些需要原生SQL操作的场景下非常有用
43
+ 如果传入 String 对象,将保留其字符串值,不会进行任何转换,
44
+ 这在有些需要原生SQL操作的场景下非常有用
45
45
 
46
46
  ```ts
47
47
  import { v } from "@asla/yoursql";
@@ -49,7 +49,8 @@ import { v } from "@asla/yoursql";
49
49
  v(new String("1+1")); // "1+1"
50
50
  ```
51
51
 
52
- 你可以自定义对象到字符串的转换, 例如,你想将 Set 转换为 PostgresSql 的 ARRAY[] 输入格式
52
+ 你可以自定义对象到字符串的转换, 例如,你想将 Set 转换为 PostgresSql 的 ARRAY[]
53
+ 输入格式
53
54
 
54
55
  ```ts
55
56
  import { v } from "@asla/yoursql";
@@ -70,42 +71,34 @@ import { v } from "@asla/yoursql";
70
71
  v.toValues([1, "abc", null, undefined, { key: "value" }]); // `1,'abc',NULL,DEFAULT,'{"key":"value"}'`
71
72
  ```
72
73
 
73
- #### v.objectToValue()
74
+ #### v.createExplicitValues() 和 v.createImplicitValues()
74
75
 
75
- 转换对象为 values 的单个值
76
-
77
- ```ts
78
- import { v } from "@asla/yoursql";
79
- const obj = { a: "a1", b: "b1", c: undefined, d: "d1" };
80
- v.objectToValue(obj); // "'a1','b1',DEFAULT,'d1'"
81
- v.objectToValue(obj, ["b", "a"]); // "'b1','a1'"
82
- v.objectToValue(obj, [{ a: "TEXT", b: {} }]); // 'a1'::TEXT,'b1'"
83
- ```
84
-
85
- #### v.objectListToValues()
86
-
87
- 转换对象数组为 values
76
+ 转换单个对象或对象数组为 VALUES
88
77
 
89
78
  ```ts
90
79
  import { v } from "@asla/yoursql";
91
80
 
92
- const values = [{ a: 1, b: 2 }, { c: 3 }];
81
+ const values = [{ a: 1, b: undefined }, { c: 3 }];
93
82
 
94
83
  // 这将自动选择数组中所有键的并集
95
- v.objectListToValues(values); // "(1,2,null),(null,null,3)"
84
+ v.createExplicitValues(values).text; // "(1,NULL,NULL),(NULL,NULL,3)"
85
+ v.createImplicitValues(values).text; // "(1,DEFAULT,NULL),(NULL,NULL,3)"
96
86
 
97
87
  // 或者你可以指定选择键并指定顺序
98
- const valueStr = v.objectListToValues(values, ["c", "b"]); // "(null,2),(3,3)"
88
+ const valueStr = v.createExplicitValues(values, ["c", "b"]).text; // "(NULL,2),(3,NULL)"
99
89
 
100
90
  const sql = `INSERT INTO user(name, role) VALUES ${valueStr}`;
101
91
  ```
102
92
 
103
- #### v.createValues()
93
+ 可以指定 SQL类型和 JS 类型断言
104
94
 
105
95
  ```ts
106
- const objectList = [{ age: 1, name: "hhh" }, { age: 2, name: "row2" }, { age: 3, name: "row3" }, {}];
96
+ const objectList = [{ age: 1, name: "hhh" }, { age: 2, name: "row2" }, {
97
+ age: 3,
98
+ name: "row3",
99
+ }, {}];
107
100
 
108
- v.createValues("customName", objectList, {
101
+ v.createExplicitValues("customName", objectList, {
109
102
  age: { sqlType: "INT", sqlDefault: "MAXIMUM(1,2)" },
110
103
  name: "TEXT",
111
104
  });
@@ -131,8 +124,8 @@ const s = select({ uid: "u.id", rid: "r.id", example: "u.id||r.id" })
131
124
  .toString();
132
125
  ```
133
126
 
134
- 查看 [select](./docs/select.md) 用法
135
- 查看 [insert/update/delete](./docs/table.md) 用法
127
+ 查看 [select](./docs/select.md) 用法 查看
128
+ [insert/update/delete](./docs/table.md) 用法
136
129
 
137
130
  #### Constructable
138
131
 
@@ -141,180 +134,3 @@ toto
141
134
  #### ConditionParam
142
135
 
143
136
  toto
144
-
145
- ### client 抽象类
146
-
147
- yoursql 还导出了一些抽象类,实现抽象类后可以方便的进行数据查询
148
-
149
- ```ts
150
- import {
151
- type DbQueryPool,
152
- type DbTransaction,
153
- type DbConnection,
154
- DbQuery,
155
- DbCursor,
156
- DbPoolConnection,
157
- DbPoolTransaction,
158
- } from "@asla/yoursql/client";
159
- ```
160
-
161
- #### DbQuery 抽象类
162
-
163
- ```ts
164
- class YourQuery extends DbQuery {
165
- query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>> {
166
- // implement
167
- }
168
- multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T> {
169
- // implement
170
- }
171
- }
172
- const db: DbQuery = new YourQuery();
173
- ```
174
-
175
- ```ts
176
- declare const db: DbQuery;
177
-
178
- type Row = { name: string; age: number };
179
- const sqlText = "SELECT * FROM user";
180
-
181
- const rows: Row[] = await db.queryRows<Row>(sqlText);
182
- const count: number = await db.queryCount(sqlText);
183
- const rows: Map<string, Row> = await db.queryMap<Row>(sqlText, "name");
184
- ```
185
-
186
- #### DbQueryPool 接口
187
-
188
- ```ts
189
- class YourPool extends DbQuery implements DbQuery {
190
- // implement
191
- }
192
- const pool: DbQueryPool = new YourPool();
193
- ```
194
-
195
- ##### 普通查询
196
-
197
- ```ts
198
- const conn = await pool.connect();
199
- try {
200
- await conn.queryRows(sqlText);
201
- } finally {
202
- conn.release();
203
- }
204
- ```
205
-
206
- 或者,使用 `using` 语法更优雅
207
-
208
- ```ts
209
- using conn = await pool.connect();
210
- await conn.queryRows(sqlText);
211
- ```
212
-
213
- ##### 事务查询
214
-
215
- ```ts
216
- const conn = pool.begin();
217
- try {
218
- await conn.queryRows(sqlText);
219
- await conn.queryRows(sqlText);
220
- await conn.commit();
221
- } catch (e) {
222
- await conn.rollback();
223
- throw e;
224
- }
225
- ```
226
-
227
- 或者,使用 `using` 语法更优雅
228
-
229
- ```ts
230
- await using conn = pool.begin();
231
-
232
- await conn.queryRows(sqlText);
233
- await conn.queryRows(sqlText);
234
- await conn.commit();
235
- ```
236
-
237
- ##### 游标查询
238
-
239
- ```ts
240
- const cursor = await pool.cursor(sqlText);
241
-
242
- let rows = await cursor.read(20);
243
- while (rows.length) {
244
- console.log(rows);
245
- rows = await cursor.read(20);
246
- if (conditions) {
247
- await cursor.close(); // 提前关闭游标
248
- break;
249
- }
250
- }
251
- ```
252
-
253
- 或者使用 `for await of` 更优雅
254
-
255
- ```ts
256
- const cursor = await pool.cursor(sqlText);
257
- for await (const element of cursor) {
258
- console.log(element);
259
- if (conditions) break; //提前关闭游标
260
- }
261
- ```
262
-
263
- ### 扩展查询链
264
-
265
- ```ts
266
- import { v, SqlStatement, SqlStatementDataset, SqlValuesCreator } from "@asla/yoursql";
267
- import type { DbCursor, QueryResult, QueryRowsResult } from "@asla/yoursql/client";
268
-
269
- declare const pool: DbQueryPool = new YourPool(); // 你需要实现一个 DbQueryPool
270
-
271
- export interface QueryableSql {
272
- query(): Promise<QueryResult>;
273
- queryCount(): Promise<number>;
274
- }
275
- export interface QueryableDataSql<T> extends QueryableSql {
276
- queryRows(): Promise<T[]>;
277
- queryMap<K>(key: string): Promise<Map<K, T>>;
278
- cursor(): Promise<DbCursor<T>>;
279
- }
280
- declare module "@asla/yoursql" {
281
- interface SqlStatement extends QueryableSql {}
282
- interface SqlStatementDataset<T> extends QueryableDataSql<T> {}
283
- }
284
- const base: QueryableSql = {
285
- queryCount(): Promise<number> {
286
- return dbPool.queryCount(this.toString());
287
- },
288
- query(): Promise<QueryRowsResult<any>> {
289
- return dbPool.query<any>(this);
290
- },
291
- };
292
- const obj: QueryableDataSql<any> = {
293
- ...base,
294
- cursor(): Promise<DbCursor<any>> {
295
- return dbPool.cursor(this.toString());
296
- },
297
- queryMap<K>(key: string): Promise<Map<K, any>> {
298
- return dbPool.queryMap(this.toString(), key);
299
- },
300
- queryRows(): Promise<any[]> {
301
- return dbPool.queryRows(this.toString());
302
- },
303
- };
304
-
305
- Object.assign(SqlStatement.prototype, base);
306
- Object.assign(SqlStatementDataset.prototype, obj);
307
- ```
308
-
309
- 现在,以及扩展了 SqlStatement 和 SqlStatementDataset 类的原型链,你可以从 select 等语句直接调用查询方法了
310
-
311
- ```ts
312
- import { Selection, v } from "@asla/yoursql";
313
-
314
- const searchName = "Bob";
315
- const rows = await Selection.from("user", "u")
316
- .innerJoin("role", "r", "u.id=r.user_id")
317
- .select({ uid: "u.id", rid: "r.id", example: "u.id||r.id" })
318
- .where(`u.name LIKE %${v(searchName)}%`)
319
- .queryRows();
320
- ```
@@ -58,4 +58,3 @@ export interface SqlTextTemplate {
58
58
  readonly textTemplate: string;
59
59
  readonly textArgs: readonly string[];
60
60
  }
61
- //# sourceMappingURL=SqlStatement.d.ts.map
@@ -1,12 +1,12 @@
1
1
  /** @public */
2
- class SqlStatement {
2
+ export class SqlStatement {
3
3
  /** 获取 SQL 语句 */
4
4
  toString() {
5
5
  return this.genSql();
6
6
  }
7
7
  }
8
8
  /** @public */
9
- class SqlStatementDataset extends SqlStatement {
9
+ export class SqlStatementDataset extends SqlStatement {
10
10
  /**
11
11
  * 转成子选择语句, 你可以使用 select form xxx 选择
12
12
  * 如果是 table 则是 table name
@@ -26,7 +26,7 @@ class SqlStatementDataset extends SqlStatement {
26
26
  }
27
27
  }
28
28
  /** @public */
29
- class SqlTextStatementDataset extends SqlStatementDataset {
29
+ export class SqlTextStatementDataset extends SqlStatementDataset {
30
30
  sql;
31
31
  constructor(sql) {
32
32
  super();
@@ -36,5 +36,3 @@ class SqlTextStatementDataset extends SqlStatementDataset {
36
36
  return this.sql;
37
37
  }
38
38
  }
39
-
40
- export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset };
@@ -26,4 +26,3 @@ export declare function whereToString(conditions?: Constructable<ConditionParam
26
26
  export declare function createUpdateSetFromObject(set: Record<string, string | undefined>, prefix?: string): string;
27
27
  export declare function selectableToString(selectable: Constructable<SqlSelectable | string>, as?: string): string;
28
28
  export declare function returningToString(returns: Constructable<SelectParam | "*">): string;
29
- //# sourceMappingURL=_statement.d.ts.map
@@ -1,10 +1,9 @@
1
- import { selectColumns } from './util.js';
2
-
1
+ import { selectColumns } from "./util.js";
3
2
  /**
4
3
  * 获取对象数组中的 key 的集合
5
4
  * @param keepUndefinedKey - 是否保留值为 undefined 的 key
6
5
  */
7
- function getObjectListKeys(objectList, keepUndefinedKey) {
6
+ export function getObjectListKeys(objectList, keepUndefinedKey) {
8
7
  let keys = new Set();
9
8
  for (let i = 0; i < objectList.length; i++) {
10
9
  let obj = objectList[i];
@@ -14,14 +13,14 @@ function getObjectListKeys(objectList, keepUndefinedKey) {
14
13
  k = hasKeys[j];
15
14
  if (typeof k !== "string")
16
15
  continue;
17
- if (obj[k] === undefined)
16
+ if (!keepUndefinedKey && obj[k] === undefined)
18
17
  continue;
19
18
  keys.add(k);
20
19
  }
21
20
  }
22
21
  return keys;
23
22
  }
24
- function condition(conditions, type = "AND") {
23
+ export function condition(conditions, type = "AND") {
25
24
  if (typeof conditions === "function")
26
25
  conditions = conditions();
27
26
  if (!conditions)
@@ -53,13 +52,13 @@ function condition(conditions, type = "AND") {
53
52
  * where(undefined) // ""
54
53
  * ```
55
54
  */
56
- function whereToString(conditions, type) {
55
+ export function whereToString(conditions, type) {
57
56
  const sql = condition(conditions, type);
58
57
  if (sql)
59
58
  return "\nWHERE " + sql;
60
59
  return "";
61
60
  }
62
- function createUpdateSetFromObject(set, prefix) {
61
+ export function createUpdateSetFromObject(set, prefix) {
63
62
  const updateKey = Object.keys(set);
64
63
  let i = 0;
65
64
  let key;
@@ -68,7 +67,7 @@ function createUpdateSetFromObject(set, prefix) {
68
67
  let sql;
69
68
  for (; i < updateKey.length; i++) {
70
69
  key = updateKey[i];
71
- sqlKey = key;
70
+ sqlKey = prefix ? `${prefix}.${key}` : key;
72
71
  value = set[key];
73
72
  if (value === undefined)
74
73
  continue;
@@ -85,7 +84,7 @@ function createUpdateSetFromObject(set, prefix) {
85
84
  i++;
86
85
  for (; i < updateKey.length; i++) {
87
86
  key = updateKey[i];
88
- sqlKey = key;
87
+ sqlKey = prefix ? `${prefix}.${key}` : key;
89
88
  value = set[key];
90
89
  if (value === undefined)
91
90
  continue;
@@ -101,7 +100,7 @@ function createUpdateSetFromObject(set, prefix) {
101
100
  else
102
101
  throw new Error("值不能为空");
103
102
  }
104
- function selectableToString(selectable, as) {
103
+ export function selectableToString(selectable, as) {
105
104
  if (typeof selectable === "function")
106
105
  selectable = selectable();
107
106
  let sql = typeof selectable === "string" ? selectable : selectable.toSelect();
@@ -111,7 +110,7 @@ function selectableToString(selectable, as) {
111
110
  sql += " AS " + as;
112
111
  return sql;
113
112
  }
114
- function returningToString(returns) {
113
+ export function returningToString(returns) {
115
114
  if (typeof returns === "function")
116
115
  returns = returns();
117
116
  let columnsStr;
@@ -123,5 +122,3 @@ function returningToString(returns) {
123
122
  }
124
123
  return "\nRETURNING " + columnsStr;
125
124
  }
126
-
127
- export { condition, createUpdateSetFromObject, getObjectListKeys, returningToString, selectableToString, whereToString };
@@ -11,4 +11,3 @@ import { SqlValueFn } from "./sql_value/sql_value.ts";
11
11
  * @public
12
12
  */
13
13
  export declare const v: SqlValueFn;
14
- //# sourceMappingURL=mod.d.ts.map
@@ -1,23 +1,14 @@
1
- import { pgSqlTransformer } from './sql_value/db_type.js';
2
- import { SqlValuesCreator } from './sql_value/sql_value.js';
3
- export { SqlValuesDataset } from './sql_value/sql_value.js';
4
- export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset } from './SqlStatement.js';
5
- export { select } from './statement/select.js';
6
- export { insertInto } from './statement/insert.js';
7
- export { update } from './statement/update.js';
8
- export { deleteFrom } from './statement/delete.js';
9
- export { withAs, withRecursiveAs } from './statement/cte.js';
10
- export { selectColumns } from './util.js';
11
- export { TypeChecker } from './your_table/checker.js';
12
- export { ColumnMeta, CustomDbType, YourTypeMap } from './your_table/infer_db_type.js';
13
- export { YourTable } from './your_table/table.js';
14
- export { TemplateSqlStatement as ValueSqlTemplate } from './sql_value/ValueSqlTemplate.js';
15
- export { orderBy } from './statement/select_impl.js';
16
-
1
+ export * from "./sql_value/db_type.js";
2
+ export * from "./sql_value/sql_value.js";
3
+ export * from "./sql_value/type.js";
4
+ export * from "./SqlStatement.js";
5
+ export * from "./statement/mod.js";
6
+ export * from "./util.js";
7
+ export * from "./your_table/mod.js";
8
+ import { SqlValuesCreator } from "./sql_value/sql_value.js";
9
+ import { pgSqlTransformer } from "./sql_value/db_type.js";
17
10
  /**
18
11
  * 默认的 SqlValuesCreator 实列
19
12
  * @public
20
13
  */
21
- const v = SqlValuesCreator.create(pgSqlTransformer);
22
-
23
- export { SqlValuesCreator, pgSqlTransformer, v };
14
+ export const v = SqlValuesCreator.create(pgSqlTransformer);
@@ -0,0 +1,28 @@
1
+ /** @public */
2
+ export interface SqlValuesDataset {
3
+ readonly columns: readonly string[];
4
+ readonly text: string;
5
+ toSelect(name: string): string;
6
+ }
7
+ export declare class ExplicitSqlValues implements SqlValuesDataset {
8
+ #private;
9
+ columns: readonly string[];
10
+ readonly columnsSqlType: readonly string[];
11
+ constructor(columns: readonly string[], columnsSqlType: readonly string[], firstValues: string[], nextRows: string[]);
12
+ get text(): string;
13
+ /**
14
+ * @example
15
+ * ```ts
16
+ * const t = v.createImplicitValues(
17
+ * [
18
+ * { id: 1, name: "name1" },
19
+ * { id: 2, name: "name2" },
20
+ * ],
21
+ * { id: "INT", name: "VARCHAR" },
22
+ * );
23
+ * // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
24
+ * t.toSelect("t1(id,name)")
25
+ * ```
26
+ */
27
+ toSelect(name: string): string;
28
+ }
@@ -0,0 +1,51 @@
1
+ export class ExplicitSqlValues {
2
+ columns;
3
+ columnsSqlType;
4
+ constructor(columns, columnsSqlType, firstValues, nextRows) {
5
+ this.columns = columns;
6
+ this.columnsSqlType = columnsSqlType;
7
+ this.#firstValues = firstValues;
8
+ this.#rows = nextRows;
9
+ }
10
+ #rows;
11
+ #firstValues;
12
+ #text;
13
+ get text() {
14
+ if (!this.#text) {
15
+ this.#text = this.#genText();
16
+ }
17
+ return this.#text;
18
+ }
19
+ #genText() {
20
+ const { columnsSqlType } = this;
21
+ const firstValues = this.#firstValues;
22
+ let firstRow = new Array(firstValues.length);
23
+ for (let i = 0; i < firstValues.length; i++) {
24
+ firstRow[i] = firstValues[i];
25
+ if (columnsSqlType[i])
26
+ firstRow[i] += "::" + columnsSqlType[i];
27
+ }
28
+ const base = "(" + firstRow.join(",") + ")";
29
+ if (this.#rows.length === 0) {
30
+ return base;
31
+ }
32
+ return "(" + firstRow.join(",") + "),\n" + this.#rows.join(",\n");
33
+ }
34
+ /**
35
+ * @example
36
+ * ```ts
37
+ * const t = v.createImplicitValues(
38
+ * [
39
+ * { id: 1, name: "name1" },
40
+ * { id: 2, name: "name2" },
41
+ * ],
42
+ * { id: "INT", name: "VARCHAR" },
43
+ * );
44
+ * // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
45
+ * t.toSelect("t1(id,name)")
46
+ * ```
47
+ */
48
+ toSelect(name) {
49
+ return `(VALUES\n${this.text})\nAS ${name}(${this.columns.join(",")})`;
50
+ }
51
+ }
@@ -11,4 +11,3 @@ export declare class TemplateSqlStatement extends SqlStatement implements SqlTem
11
11
  toTextArgs(): string[];
12
12
  genSql(): string;
13
13
  }
14
- //# sourceMappingURL=ValueSqlTemplate.d.ts.map
@@ -1,7 +1,6 @@
1
- import { SqlStatement } from '../SqlStatement.js';
2
-
1
+ import { SqlStatement } from "../SqlStatement.js";
3
2
  /** @alpha */
4
- class TemplateSqlStatement extends SqlStatement {
3
+ export class TemplateSqlStatement extends SqlStatement {
5
4
  v;
6
5
  templates;
7
6
  args;
@@ -45,5 +44,3 @@ class TemplateSqlStatement extends SqlStatement {
45
44
  return sql;
46
45
  }
47
46
  }
48
-
49
- export { TemplateSqlStatement };
@@ -21,4 +21,3 @@ export declare function getColumnInfo(objectList: readonly Record<string, any>[]
21
21
  asserts: (ColumnToValueConfig | undefined)[];
22
22
  };
23
23
  export {};
24
- //# sourceMappingURL=_to_values.d.ts.map
@@ -1,6 +1,5 @@
1
- import { getObjectListKeys } from '../_statement.js';
2
-
3
- function internalObjectToValues(object, keys, type, undefinedDefault, v) {
1
+ import { getObjectListKeys } from "../_statement.js";
2
+ export function internalObjectToValues(object, keys, type, undefinedDefault, v) {
4
3
  const values = new Array(keys.length);
5
4
  const types = new Array(keys.length);
6
5
  let i = 0;
@@ -32,7 +31,7 @@ function internalObjectToValues(object, keys, type, undefinedDefault, v) {
32
31
  throw new Error("object 不能为空");
33
32
  return { values, types };
34
33
  }
35
- class AssertError extends TypeError {
34
+ export class AssertError extends TypeError {
36
35
  constructor(assertType, actual) {
37
36
  super(`Assert ${assertType} type, Actual ${actual} type`);
38
37
  }
@@ -53,7 +52,7 @@ function initColumnAssert(keys, keys_types) {
53
52
  }
54
53
  return type;
55
54
  }
56
- function getObjectValueInfo(object, keys_types) {
55
+ export function getObjectValueInfo(object, keys_types) {
57
56
  let type;
58
57
  let keys;
59
58
  if (keys_types instanceof Array) {
@@ -70,7 +69,7 @@ function getObjectValueInfo(object, keys_types) {
70
69
  }
71
70
  return { keys, type };
72
71
  }
73
- function getColumnInfo(objectList, columns) {
72
+ export function getColumnInfo(objectList, columns) {
74
73
  let keys;
75
74
  let asserts;
76
75
  if (!columns) {
@@ -87,5 +86,3 @@ function getColumnInfo(objectList, columns) {
87
86
  }
88
87
  return { keys, asserts };
89
88
  }
90
-
91
- export { AssertError, getColumnInfo, getObjectValueInfo, internalObjectToValues };
@@ -1,4 +1,3 @@
1
1
  import { JsObjectMapSql } from "./sql_value.ts";
2
2
  /** @public PgSql 转换器 */
3
3
  export declare const pgSqlTransformer: JsObjectMapSql;
4
- //# sourceMappingURL=db_type.d.ts.map
@@ -1,7 +1,6 @@
1
- import { SqlValuesCreator } from './sql_value.js';
2
-
1
+ import { SqlValuesCreator } from "./sql_value.js";
3
2
  /** @public PgSql 转换器 */
4
- const pgSqlTransformer = new Map([
3
+ export const pgSqlTransformer = new Map([
5
4
  [
6
5
  Array,
7
6
  function encodePgArray(value) {
@@ -36,5 +35,3 @@ const pgSqlTransformer = new Map([
36
35
  },
37
36
  ],
38
37
  ]);
39
-
40
- export { pgSqlTransformer };
@@ -1,6 +1,8 @@
1
+ import { SqlValuesDataset } from "./SqlValuesDataset.ts";
1
2
  import { TemplateSqlStatement } from "./ValueSqlTemplate.ts";
2
3
  import { AssertJsType, ObjectToValueKeys } from "./type.ts";
3
- export { TemplateSqlStatement as ValueSqlTemplate } from "./ValueSqlTemplate.ts";
4
+ export { TemplateSqlStatement } from "./ValueSqlTemplate.ts";
5
+ export type { SqlValuesDataset } from "./SqlValuesDataset.ts";
4
6
  /** @public js 对象到编码函数的映射*/
5
7
  export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
6
8
  /** @public 将 js 值转为 SQl 字符串的函数*/
@@ -71,27 +73,3 @@ export declare class SqlValuesCreator {
71
73
  */
72
74
  toValues(values: readonly any[]): string;
73
75
  }
74
- /** @public */
75
- export declare class SqlValuesDataset {
76
- #private;
77
- columns: readonly string[];
78
- readonly columnsSqlType: readonly string[];
79
- constructor(columns: readonly string[], columnsSqlType: readonly string[], firstValues: string[], nextRows: string[]);
80
- get text(): string;
81
- /**
82
- * @example
83
- * ```ts
84
- * const t = v.createImplicitValues(
85
- * [
86
- * { id: 1, name: "name1" },
87
- * { id: 2, name: "name2" },
88
- * ],
89
- * { id: "INT", name: "VARCHAR" },
90
- * );
91
- * // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
92
- * t.toSelect("t1(id,name)")
93
- * ```
94
- */
95
- toSelect(name: string): string;
96
- }
97
- //# sourceMappingURL=sql_value.d.ts.map