@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.
package/dist/sql_gen/mod.js
CHANGED
|
@@ -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 {
|
|
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>):
|
|
55
|
-
createImplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>):
|
|
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>):
|
|
62
|
-
createExplicitValues<T extends object>(objectList: T[], columns?: ObjectToValueKeys<T>):
|
|
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
|
|
78
|
-
|
|
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
|
|
85
|
-
constructor(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
|
+
*/
|
|
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
|
|
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
|
-
|
|
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
|
|
154
|
-
let i = 1;
|
|
140
|
+
let firstRow = internalObjectToValues(objectList[0], keys, asserts, undefinedDefault, this);
|
|
155
141
|
let j;
|
|
156
142
|
let value;
|
|
157
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
+
columns[j] =
|
|
168
155
|
value === undefined ? assert?.sqlDefault || undefinedDefault : this.toSqlStr(value, assert?.assertJsType);
|
|
169
156
|
}
|
|
170
|
-
|
|
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
|
|
164
|
+
return new SqlValuesDataset(keys, firstRow.types, firstRow.values, rows);
|
|
178
165
|
}
|
|
179
166
|
_objectToValue(object, keys_types, option = {}) {
|
|
180
|
-
const { keys, type } =
|
|
167
|
+
const { keys, type } = getObjectValueInfo(object, keys_types);
|
|
181
168
|
const undefinedDefault = option.undefinedDefault || "DEFAULT";
|
|
182
|
-
const
|
|
183
|
-
return new
|
|
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
|
|
186
|
+
class SqlValuesDataset {
|
|
269
187
|
columns;
|
|
270
|
-
|
|
271
|
-
constructor(columns,
|
|
188
|
+
columnsSqlType;
|
|
189
|
+
constructor(columns, columnsSqlType, firstValues, nextRows) {
|
|
272
190
|
this.columns = columns;
|
|
273
|
-
this.
|
|
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 {
|
|
238
|
+
export { SqlValuesCreator, SqlValuesDataset, TemplateSqlStatement as ValueSqlTemplate };
|