@asla/yoursql 0.12.1 → 0.13.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.
@@ -1,6 +1,6 @@
1
1
  import { pgSqlTransformer } from './sql_value/db_type.js';
2
2
  import { SqlValuesCreator } from './sql_value/sql_value.js';
3
- export { SqlExplicitValuesStatement } from './sql_value/sql_value.js';
3
+ export { SqlValuesDataset } from './sql_value/sql_value.js';
4
4
  export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset } from './SqlStatement.js';
5
5
  export { select } from './statement/select.js';
6
6
  export { insertInto } from './statement/insert.js';
@@ -0,0 +1,24 @@
1
+ import { AssertJsType, ColumnToValueConfig, ObjectToValueKeys } from "./type.ts";
2
+ interface ValueToSqlStr {
3
+ toSqlStr(value: any, assertType?: AssertJsType): string;
4
+ }
5
+ export declare function internalObjectToValues(object: Record<string, any>, keys: readonly string[], type: (ColumnToValueConfig | undefined)[], undefinedDefault: string, v: ValueToSqlStr): {
6
+ values: string[];
7
+ types: string[];
8
+ };
9
+ export type ObjectToValueOption = {
10
+ undefinedDefault?: string;
11
+ };
12
+ export declare class AssertError extends TypeError {
13
+ constructor(assertType: string, actual: string);
14
+ }
15
+ export declare function getObjectValueInfo(object: Record<string | number, any>, keys_types: readonly string[] | Record<string, string | undefined> | undefined): {
16
+ keys: string[];
17
+ type: (ColumnToValueConfig | undefined)[];
18
+ };
19
+ export declare function getColumnInfo(objectList: readonly Record<string, any>[], columns?: ObjectToValueKeys<Record<string, any>>): {
20
+ keys: string[];
21
+ asserts: (ColumnToValueConfig | undefined)[];
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=_to_values.d.ts.map
@@ -0,0 +1,91 @@
1
+ import { getObjectListKeys } from '../_statement.js';
2
+
3
+ function internalObjectToValues(object, keys, type, undefinedDefault, v) {
4
+ const values = new Array(keys.length);
5
+ const types = new Array(keys.length);
6
+ let i = 0;
7
+ let key;
8
+ let value;
9
+ let assertType;
10
+ try {
11
+ for (; i < keys.length; i++) {
12
+ key = keys[i];
13
+ value = object[key];
14
+ assertType = type[i];
15
+ if (assertType) {
16
+ values[i] =
17
+ value === undefined ? assertType.sqlDefault || undefinedDefault : v.toSqlStr(value, assertType.assertJsType);
18
+ if (assertType.sqlType) {
19
+ types[i] = assertType.sqlType;
20
+ }
21
+ }
22
+ else {
23
+ values[i] = value === undefined ? undefinedDefault : v.toSqlStr(value);
24
+ }
25
+ }
26
+ }
27
+ catch (error) {
28
+ let message = error instanceof Error ? error.message : String(error);
29
+ throw new Error("字段 '" + key + "' 异常," + message);
30
+ }
31
+ if (values.length === 0)
32
+ throw new Error("object 不能为空");
33
+ return { values, types };
34
+ }
35
+ class AssertError extends TypeError {
36
+ constructor(assertType, actual) {
37
+ super(`Assert ${assertType} type, Actual ${actual} type`);
38
+ }
39
+ }
40
+ function initColumnAssert(keys, keys_types) {
41
+ let key;
42
+ let value;
43
+ let type = new Array(keys.length);
44
+ for (let i = 0; i < keys.length; i++) {
45
+ key = keys[i];
46
+ value = keys_types[key];
47
+ if (typeof value === "string") {
48
+ type[i] = { sqlType: value };
49
+ }
50
+ else {
51
+ type[i] = value;
52
+ }
53
+ }
54
+ return type;
55
+ }
56
+ function getObjectValueInfo(object, keys_types) {
57
+ let type;
58
+ let keys;
59
+ if (keys_types instanceof Array) {
60
+ keys = [...keys_types];
61
+ type = [];
62
+ }
63
+ else if (keys_types) {
64
+ keys = Object.keys(keys_types);
65
+ type = initColumnAssert(keys, keys_types);
66
+ }
67
+ else {
68
+ keys = Object.keys(object).filter((k) => object[k] !== undefined);
69
+ type = [];
70
+ }
71
+ return { keys, type };
72
+ }
73
+ function getColumnInfo(objectList, columns) {
74
+ let keys;
75
+ let asserts;
76
+ if (!columns) {
77
+ keys = Array.from(getObjectListKeys(objectList));
78
+ asserts = [];
79
+ }
80
+ else if (columns instanceof Array) {
81
+ keys = [...columns];
82
+ asserts = [];
83
+ }
84
+ else {
85
+ keys = Object.keys(columns);
86
+ asserts = initColumnAssert(keys, columns);
87
+ }
88
+ return { keys, asserts };
89
+ }
90
+
91
+ export { AssertError, getColumnInfo, getObjectValueInfo, internalObjectToValues };
@@ -51,19 +51,17 @@ export declare class SqlValuesCreator {
51
51
  * @example 返回的文本示例: " (...),(...) "
52
52
  * @param columns - 选择的键。如果指定了 columns, 值为 undefined 的属性将自动填充为 null; 如果未指定 columns,将选择 objectList 所有不是 undefined 项的键的并集
53
53
  */
54
- createImplicitValues<T extends object>(objectList: T, columns?: ObjectToValueKeys<T>): SqlValuesTextData;
55
- createImplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>): SqlValuesTextData;
54
+ createImplicitValues<T extends object>(objectList: T, columns?: ObjectToValueKeys<T>): SqlValuesDataset;
55
+ createImplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>): SqlValuesDataset;
56
56
  /**
57
57
  * 将对象列表转为 SQL 的 VALUES。如果 objectList 中有某个对象的属性值为 undefined,则会被转换为 "NULL"
58
58
  * @example 返回的文本示例: " (...),(...) "
59
59
  * @param columns - 选择的键。
60
60
  */
61
- createExplicitValues<T extends object>(objectList: T, columns?: ObjectToValueKeys<T>): SqlExplicitValuesStatement;
62
- createExplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>): SqlExplicitValuesStatement;
61
+ createExplicitValues<T extends object>(objectList: T, columns?: ObjectToValueKeys<T>): SqlValuesDataset;
62
+ createExplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>): SqlValuesDataset;
63
63
  private _objectListToValues;
64
64
  private _objectToValue;
65
- private _getObjectValueInfo;
66
- private _internalObjectToValues;
67
65
  /**
68
66
  * 将数组列表转为 SQL 的一个 value
69
67
  * @example
@@ -74,15 +72,26 @@ export declare class SqlValuesCreator {
74
72
  toValues(values: readonly any[]): string;
75
73
  }
76
74
  /** @public */
77
- export type SqlValuesTextData = {
78
- columns: string[];
79
- text: string;
80
- };
81
- /** @public */
82
- export declare class SqlExplicitValuesStatement {
75
+ export declare class SqlValuesDataset {
76
+ #private;
83
77
  columns: readonly string[];
84
- readonly text: string;
85
- constructor(columns: readonly string[], text: 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
+ */
86
95
  toSelect(name: string): string;
87
96
  }
88
97
  //# sourceMappingURL=sql_value.d.ts.map
@@ -1,5 +1,5 @@
1
- import { getObjectListKeys } from '../_statement.js';
2
1
  import { TemplateSqlStatement } from './ValueSqlTemplate.js';
2
+ import { AssertError, getColumnInfo, internalObjectToValues, getObjectValueInfo } from './_to_values.js';
3
3
 
4
4
  /**
5
5
  * SQL value 生成器
@@ -122,7 +122,7 @@ class SqlValuesCreator {
122
122
  else {
123
123
  res = this._objectToValue(objectList, columns, { undefinedDefault: "DEFAULT" });
124
124
  }
125
- return { columns: [...res.columns], text: res.text };
125
+ return res;
126
126
  }
127
127
  createExplicitValues(objectList, columns) {
128
128
  if (objectList instanceof Array) {
@@ -135,100 +135,39 @@ class SqlValuesCreator {
135
135
  _objectListToValues(objectList, columns, option = {}) {
136
136
  if (objectList.length <= 0)
137
137
  throw new Error("objectList 不能是空数组");
138
- let keys;
139
- let asserts;
140
- if (!columns) {
141
- keys = Array.from(getObjectListKeys(objectList));
142
- asserts = [];
143
- }
144
- else if (columns instanceof Array) {
145
- keys = [...columns];
146
- asserts = [];
147
- }
148
- else {
149
- keys = Object.keys(columns);
150
- asserts = initColumnAssert(keys, columns);
151
- }
138
+ const { keys, asserts } = getColumnInfo(objectList, columns);
152
139
  const undefinedDefault = option.undefinedDefault || "DEFAULT";
153
- let str = "(" + this._internalObjectToValues(objectList[0], keys, asserts, undefinedDefault) + ")";
154
- let i = 1;
140
+ let firstRow = internalObjectToValues(objectList[0], keys, asserts, undefinedDefault, this);
155
141
  let j;
156
142
  let value;
157
- let rows;
143
+ const rows = new Array(objectList.length - 1);
158
144
  let assert;
145
+ let i = 1;
159
146
  try {
160
147
  for (; i < objectList.length; i++) {
161
148
  const object = objectList[i];
162
- rows = [];
149
+ const columns = [];
163
150
  j = 0;
164
151
  for (; j < keys.length; j++) {
165
152
  value = object[keys[j]];
166
153
  assert = asserts[j];
167
- rows[j] =
154
+ columns[j] =
168
155
  value === undefined ? assert?.sqlDefault || undefinedDefault : this.toSqlStr(value, assert?.assertJsType);
169
156
  }
170
- str += ",\n(" + rows.join(",") + ")";
157
+ rows[i - 1] = "(" + columns.join(",") + ")";
171
158
  }
172
159
  }
173
160
  catch (error) {
174
161
  let message = error instanceof Error ? error.message : String(error);
175
162
  throw new Error("第 " + i + " 项,字段 '" + keys[j] + "' 异常," + message);
176
163
  }
177
- return new SqlExplicitValuesStatement(keys, str);
164
+ return new SqlValuesDataset(keys, firstRow.types, firstRow.values, rows);
178
165
  }
179
166
  _objectToValue(object, keys_types, option = {}) {
180
- const { keys, type } = this._getObjectValueInfo(object, keys_types);
167
+ const { keys, type } = getObjectValueInfo(object, keys_types);
181
168
  const undefinedDefault = option.undefinedDefault || "DEFAULT";
182
- const text = this._internalObjectToValues(object, keys, type, undefinedDefault);
183
- return new SqlExplicitValuesStatement(keys, `(${text})`);
184
- }
185
- _getObjectValueInfo(object, keys_types) {
186
- let type;
187
- let keys;
188
- if (keys_types instanceof Array) {
189
- keys = [...keys_types];
190
- type = [];
191
- }
192
- else if (keys_types) {
193
- keys = Object.keys(keys_types);
194
- type = initColumnAssert(keys, keys_types);
195
- }
196
- else {
197
- keys = Object.keys(object).filter((k) => object[k] !== undefined);
198
- type = [];
199
- }
200
- return { keys, type };
201
- }
202
- _internalObjectToValues(object, keys, type, undefinedDefault) {
203
- const values = [];
204
- let i = 0;
205
- let key;
206
- let value;
207
- let assertType;
208
- try {
209
- for (; i < keys.length; i++) {
210
- key = keys[i];
211
- value = object[key];
212
- assertType = type[i];
213
- if (assertType) {
214
- values[i] =
215
- value === undefined
216
- ? assertType.sqlDefault || undefinedDefault
217
- : this.toSqlStr(value, assertType.assertJsType);
218
- if (assertType.sqlType)
219
- values[i] += "::" + assertType.sqlType;
220
- }
221
- else
222
- values[i] = value === undefined ? undefinedDefault : this.toSqlStr(value);
223
- }
224
- }
225
- catch (error) {
226
- let message = error instanceof Error ? error.message : String(error);
227
- throw new Error("字段 '" + key + "' 异常," + message);
228
- }
229
- if (values.length === 0)
230
- throw new Error("object 不能为空");
231
- return values.join(",");
169
+ const res = internalObjectToValues(object, keys, type, undefinedDefault, this);
170
+ return new SqlValuesDataset(keys, res.types, res.values, []);
232
171
  }
233
172
  /**
234
173
  * 将数组列表转为 SQL 的一个 value
@@ -243,38 +182,57 @@ class SqlValuesCreator {
243
182
  return values.map((v) => this.toSqlStr(v)).join(",");
244
183
  }
245
184
  }
246
- class AssertError extends TypeError {
247
- constructor(assertType, actual) {
248
- super(`Assert ${assertType} type, Actual ${actual} type`);
249
- }
250
- }
251
- function initColumnAssert(keys, keys_types) {
252
- let key;
253
- let value;
254
- let type = new Array(keys.length);
255
- for (let i = 0; i < keys.length; i++) {
256
- key = keys[i];
257
- value = keys_types[key];
258
- if (typeof value === "string") {
259
- type[i] = { sqlType: value };
260
- }
261
- else {
262
- type[i] = value;
263
- }
264
- }
265
- return type;
266
- }
267
185
  /** @public */
268
- class SqlExplicitValuesStatement {
186
+ class SqlValuesDataset {
269
187
  columns;
270
- text;
271
- constructor(columns, text) {
188
+ columnsSqlType;
189
+ constructor(columns, columnsSqlType, firstValues, nextRows) {
272
190
  this.columns = columns;
273
- this.text = text;
191
+ this.columnsSqlType = columnsSqlType;
192
+ this.#firstValues = firstValues;
193
+ this.#rows = nextRows;
194
+ }
195
+ #rows;
196
+ #firstValues;
197
+ #text;
198
+ get text() {
199
+ if (!this.#text) {
200
+ this.#text = this.#genText();
201
+ }
202
+ return this.#text;
203
+ }
204
+ #genText() {
205
+ const { columnsSqlType } = this;
206
+ const firstValues = this.#firstValues;
207
+ let firstRow = new Array(firstValues.length);
208
+ for (let i = 0; i < firstValues.length; i++) {
209
+ firstRow[i] = firstValues[i];
210
+ if (columnsSqlType[i])
211
+ firstRow[i] += "::" + columnsSqlType[i];
212
+ }
213
+ const base = "(" + firstRow.join(",") + ")";
214
+ if (this.#rows.length === 0) {
215
+ return base;
216
+ }
217
+ return "(" + firstRow.join(",") + "),\n" + this.#rows.join(",\n");
274
218
  }
219
+ /**
220
+ * @example
221
+ * ```ts
222
+ * const t = v.createImplicitValues(
223
+ * [
224
+ * { id: 1, name: "name1" },
225
+ * { id: 2, name: "name2" },
226
+ * ],
227
+ * { id: "INT", name: "VARCHAR" },
228
+ * );
229
+ * // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
230
+ * t.toSelect("t1(id,name)")
231
+ * ```
232
+ */
275
233
  toSelect(name) {
276
234
  return `(VALUES\n${this.text})\nAS ${name}(${this.columns.join(",")})`;
277
235
  }
278
236
  }
279
237
 
280
- export { SqlExplicitValuesStatement, SqlValuesCreator, TemplateSqlStatement as ValueSqlTemplate };
238
+ export { SqlValuesCreator, SqlValuesDataset, TemplateSqlStatement as ValueSqlTemplate };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asla/yoursql",
3
- "version": "0.12.1",
3
+ "version": "0.13.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/mod.d.ts",