taon-type-sql 21.0.22 → 21.0.23
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/browser/package.json +1 -1
- package/browser-prod/package.json +1 -1
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/package.json +1 -1
- package/lib-prod/build-info._auto-generated_.js +14 -0
- package/lib-prod/builder/column/basic-column.js +13 -0
- package/lib-prod/builder/column/boolean-column.js +14 -0
- package/lib-prod/builder/column/comparable-column.js +42 -0
- package/lib-prod/builder/column/date-column.js +14 -0
- package/lib-prod/builder/column/number-column.js +19 -0
- package/lib-prod/builder/column/query-column.js +24 -0
- package/lib-prod/builder/column/string-column.js +36 -0
- package/lib-prod/builder/column/value-column.js +29 -0
- package/lib-prod/builder/condition/query-column-condition.js +22 -0
- package/lib-prod/builder/condition/query-condition-chain.js +33 -0
- package/lib-prod/builder/condition/query-condition.js +6 -0
- package/lib-prod/builder/condition/query-join-condition.js +22 -0
- package/lib-prod/builder/helpers/generics-helper.js +5 -0
- package/lib-prod/builder/helpers/internal-types.js +0 -0
- package/lib-prod/builder/join/joined-tables-chain.js +14 -0
- package/lib-prod/builder/join/joined-tables.js +22 -0
- package/lib-prod/builder/other/query-ordering.js +20 -0
- package/lib-prod/builder/query/select-query.js +51 -0
- package/lib-prod/builder/query/table-condition-query.js +27 -0
- package/lib-prod/builder/query/table-query.js +54 -0
- package/lib-prod/builder/query-source.js +18 -0
- package/lib-prod/builder/query-table.js +27 -0
- package/lib-prod/client/mysql.js +10 -0
- package/lib-prod/client/pg.js +10 -0
- package/lib-prod/client/query-processor.js +44 -0
- package/lib-prod/converter/param-converter.js +23 -0
- package/lib-prod/converter/parameterized-converter.js +17 -0
- package/lib-prod/converter/query-converter.js +268 -0
- package/lib-prod/converter/result-converter.js +77 -0
- package/lib-prod/converter/sql-converter.js +8 -0
- package/lib-prod/converter/type-converter.js +32 -0
- package/lib-prod/converter/types.js +0 -0
- package/lib-prod/env/env.angular-node-app.js +130 -0
- package/lib-prod/env/env.docs-webapp.js +130 -0
- package/lib-prod/env/env.electron-app.js +130 -0
- package/lib-prod/env/env.mobile-app.js +130 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +130 -0
- package/lib-prod/env/env.vscode-plugin.js +130 -0
- package/lib-prod/env/index.js +6 -0
- package/lib-prod/index._auto-generated_.js +0 -0
- package/lib-prod/index.js +46 -0
- package/lib-prod/migrations/index.js +1 -0
- package/lib-prod/migrations/migrations_index._auto-generated_.js +0 -0
- package/lib-prod/package.json +1 -1
- package/package.json +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/package.json +1 -1
- package/lib-prod/build-info._auto-generated_.ts +0 -27
- package/lib-prod/builder/column/basic-column.ts +0 -17
- package/lib-prod/builder/column/boolean-column.ts +0 -19
- package/lib-prod/builder/column/comparable-column.ts +0 -56
- package/lib-prod/builder/column/date-column.ts +0 -19
- package/lib-prod/builder/column/number-column.ts +0 -25
- package/lib-prod/builder/column/query-column.ts +0 -34
- package/lib-prod/builder/column/string-column.ts +0 -47
- package/lib-prod/builder/column/value-column.ts +0 -39
- package/lib-prod/builder/condition/query-column-condition.ts +0 -28
- package/lib-prod/builder/condition/query-condition-chain.ts +0 -42
- package/lib-prod/builder/condition/query-condition.ts +0 -13
- package/lib-prod/builder/condition/query-join-condition.ts +0 -27
- package/lib-prod/builder/helpers/generics-helper.ts +0 -2
- package/lib-prod/builder/helpers/internal-types.ts +0 -31
- package/lib-prod/builder/join/joined-tables-chain.ts +0 -17
- package/lib-prod/builder/join/joined-tables.ts +0 -28
- package/lib-prod/builder/other/query-ordering.ts +0 -26
- package/lib-prod/builder/query/select-query.ts +0 -68
- package/lib-prod/builder/query/table-condition-query.ts +0 -35
- package/lib-prod/builder/query/table-query.ts +0 -72
- package/lib-prod/builder/query-source.ts +0 -25
- package/lib-prod/builder/query-table.ts +0 -34
- package/lib-prod/client/mysql.ts +0 -9
- package/lib-prod/client/pg.ts +0 -9
- package/lib-prod/client/query-processor.ts +0 -89
- package/lib-prod/converter/param-converter.ts +0 -23
- package/lib-prod/converter/parameterized-converter.ts +0 -20
- package/lib-prod/converter/query-converter.ts +0 -296
- package/lib-prod/converter/result-converter.ts +0 -88
- package/lib-prod/converter/sql-converter.ts +0 -7
- package/lib-prod/converter/type-converter.ts +0 -29
- package/lib-prod/converter/types.ts +0 -6
- package/lib-prod/env/env.angular-node-app.ts +0 -66
- package/lib-prod/env/env.docs-webapp.ts +0 -66
- package/lib-prod/env/env.electron-app.ts +0 -66
- package/lib-prod/env/env.mobile-app.ts +0 -66
- package/lib-prod/env/env.npm-lib-and-cli-tool.ts +0 -66
- package/lib-prod/env/env.vscode-plugin.ts +0 -66
- package/lib-prod/env/index.ts +0 -6
- package/lib-prod/index._auto-generated_.ts +0 -5
- package/lib-prod/index.ts +0 -37
- package/lib-prod/lib-info.md +0 -8
- package/lib-prod/migrations/index.ts +0 -2
- package/lib-prod/migrations/migrations-info.md +0 -6
- package/lib-prod/migrations/migrations_index._auto-generated_.ts +0 -5
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function convertSubstitutionParam(param) {
|
|
2
|
+
if (param == null) return "NULL";
|
|
3
|
+
if (typeof param === "string" || param instanceof String) {
|
|
4
|
+
return `'${String(param)}'`;
|
|
5
|
+
} else if (typeof param === "boolean" || param instanceof Boolean) {
|
|
6
|
+
return String(param).toUpperCase();
|
|
7
|
+
} else if (param instanceof Date) {
|
|
8
|
+
return `'${param.toISOString()}'`;
|
|
9
|
+
} else if (typeof param === "number" || param instanceof Number) {
|
|
10
|
+
return String(param);
|
|
11
|
+
}
|
|
12
|
+
return `'${JSON.stringify(param)}'`;
|
|
13
|
+
}
|
|
14
|
+
function convertEscapedParam(param) {
|
|
15
|
+
if (typeof param === "object" && !(param == null || param instanceof String || param instanceof Number || param instanceof Boolean || param instanceof Date)) {
|
|
16
|
+
return JSON.stringify(param);
|
|
17
|
+
}
|
|
18
|
+
return param;
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
convertEscapedParam,
|
|
22
|
+
convertSubstitutionParam
|
|
23
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createQueryConverter } from "./query-converter";
|
|
2
|
+
import { convertEscapedParam } from "./param-converter";
|
|
3
|
+
let pgParamConverter = (index) => "$" + index;
|
|
4
|
+
let mySqlParamConverter = (index) => "?";
|
|
5
|
+
function convertSingleParam(param, params, paramConverter) {
|
|
6
|
+
params.push(convertEscapedParam(param));
|
|
7
|
+
return paramConverter(params.length);
|
|
8
|
+
}
|
|
9
|
+
function convertQueryToParameterizedSQL(query, options, engine) {
|
|
10
|
+
let params = [];
|
|
11
|
+
let paramConverter = engine === "mysql" ? mySqlParamConverter : pgParamConverter;
|
|
12
|
+
let sql = createQueryConverter((param) => convertSingleParam(param, params, paramConverter), options, engine)(query);
|
|
13
|
+
return { sql, params };
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
convertQueryToParameterizedSQL
|
|
17
|
+
};
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { string, number, date, boolean } from "./type-converter";
|
|
2
|
+
function createQueryConverter(paramConverter, options, engine) {
|
|
3
|
+
return convertQuery;
|
|
4
|
+
function convertQuery(query) {
|
|
5
|
+
if (query._action === "select") return convertSelectQuery(query);
|
|
6
|
+
if (query._action === "delete") return convertDeleteQuery(query);
|
|
7
|
+
if (query._action === "update") return convertUpdateQuery(query);
|
|
8
|
+
if (query._action === "insert") return convertInsertQuery(query);
|
|
9
|
+
throw new Error("Unknown query type:" + query._action);
|
|
10
|
+
}
|
|
11
|
+
function convertDeleteQuery(query) {
|
|
12
|
+
let s = "DELETE FROM " + convertTable(query._table);
|
|
13
|
+
s += convertConditions(query._conditions);
|
|
14
|
+
return s;
|
|
15
|
+
}
|
|
16
|
+
function convertUpdateQuery(query) {
|
|
17
|
+
let s = "UPDATE " + convertTable(query._table) + " SET ";
|
|
18
|
+
s += convertUpdateSetters(query._table, query._entity);
|
|
19
|
+
s += convertConditions(query._conditions);
|
|
20
|
+
return s;
|
|
21
|
+
}
|
|
22
|
+
function convertUpdateSetters(table, entity) {
|
|
23
|
+
return Object.keys(entity).sort().map((key) => {
|
|
24
|
+
let value = entity[key];
|
|
25
|
+
let column = table[key];
|
|
26
|
+
return convertColumnName(column) + " = " + convertParam(column, value);
|
|
27
|
+
}).join(", ");
|
|
28
|
+
}
|
|
29
|
+
function convertInsertQuery(query) {
|
|
30
|
+
let items = Array.isArray(query._entity) ? query._entity : [query._entity];
|
|
31
|
+
let keySet = items.reduce((set, item) => {
|
|
32
|
+
Object.keys(item).forEach((key) => set.add(key));
|
|
33
|
+
return set;
|
|
34
|
+
}, /* @__PURE__ */ new Set());
|
|
35
|
+
let keys = Array.from(keySet).sort();
|
|
36
|
+
let s = "INSERT INTO " + convertTable(query._table) + " ";
|
|
37
|
+
s += "(" + keys.map((key) => convertColumnName(query._table[key])).join(", ") + ")";
|
|
38
|
+
s += options.lineBreak + "VALUES ";
|
|
39
|
+
s += items.map((item) => convertInsertItem(query._table, item, keys)).map((row) => "(" + row + ")").join(", ");
|
|
40
|
+
s += getPgInsertReturningIfNeeded(query);
|
|
41
|
+
return s;
|
|
42
|
+
}
|
|
43
|
+
function getPgInsertReturningIfNeeded(query) {
|
|
44
|
+
if (engine === "pg" && query._action === "insert" && !Array.isArray(query._entity) && query._table.$id && query._table.$id._table && query._table.$id._name) {
|
|
45
|
+
return " RETURNING " + convertColumnName(query._table.$id);
|
|
46
|
+
}
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
function convertInsertItem(table, entity, keys) {
|
|
50
|
+
return keys.map((key) => {
|
|
51
|
+
let value = entity[key];
|
|
52
|
+
let column = table[key];
|
|
53
|
+
return convertParam(column, value);
|
|
54
|
+
}).join(", ");
|
|
55
|
+
}
|
|
56
|
+
function convertSelectQuery(query) {
|
|
57
|
+
let s = "SELECT ";
|
|
58
|
+
if (query._distinct) {
|
|
59
|
+
s += "DISTINCT ";
|
|
60
|
+
}
|
|
61
|
+
if (query._columns == null || query._columns.length === 0) {
|
|
62
|
+
s += "*";
|
|
63
|
+
} else {
|
|
64
|
+
s += query._columns.map((column) => convertColumn(column)).join(", ");
|
|
65
|
+
}
|
|
66
|
+
s += options.lineBreak + "FROM ";
|
|
67
|
+
if (query._tables) {
|
|
68
|
+
s += query._tables.map((table) => table._parent ? convertJoin(table) : convertTable(table)).join(", ");
|
|
69
|
+
} else {
|
|
70
|
+
s += convertTable(query._table);
|
|
71
|
+
}
|
|
72
|
+
s += convertConditions(query._conditions);
|
|
73
|
+
if (query._groupBy && query._groupBy.length > 0) {
|
|
74
|
+
s += options.lineBreak + "GROUP BY ";
|
|
75
|
+
s += query._groupBy.map((column) => convertColumn(column)).join(", ");
|
|
76
|
+
}
|
|
77
|
+
s += convertConditions(query._having, "HAVING");
|
|
78
|
+
if (query._orderings && query._orderings.length > 0) {
|
|
79
|
+
s += options.lineBreak + "ORDER BY ";
|
|
80
|
+
s += query._orderings.map((ordering) => convertOrdering(ordering)).join(", ");
|
|
81
|
+
}
|
|
82
|
+
if (query._limit != null) {
|
|
83
|
+
s += options.lineBreak + "LIMIT " + number(query._limit);
|
|
84
|
+
}
|
|
85
|
+
if (query._offset != null) {
|
|
86
|
+
s += options.lineBreak + "OFFSET " + number(query._offset);
|
|
87
|
+
}
|
|
88
|
+
return s;
|
|
89
|
+
}
|
|
90
|
+
function convertConditions(conditions, keyword = "WHERE") {
|
|
91
|
+
let s = "";
|
|
92
|
+
if (conditions && conditions.length > 0) {
|
|
93
|
+
s += options.lineBreak + keyword + " ";
|
|
94
|
+
preprocessConditions(conditions);
|
|
95
|
+
s += conditions.map((condition) => convertCondition(condition, true)).join(" AND ");
|
|
96
|
+
}
|
|
97
|
+
return s;
|
|
98
|
+
}
|
|
99
|
+
function convertJoin(joinChain) {
|
|
100
|
+
let items = [];
|
|
101
|
+
while (joinChain) {
|
|
102
|
+
items.push(joinChain);
|
|
103
|
+
joinChain = joinChain._parent;
|
|
104
|
+
}
|
|
105
|
+
let root = items[items.length - 1];
|
|
106
|
+
let s = convertTable(root);
|
|
107
|
+
for (let i = items.length - 2; i >= 0; i -= 2) {
|
|
108
|
+
let table = items[i]._table;
|
|
109
|
+
let modifier = items[i]._modifier;
|
|
110
|
+
let condition = items[i - 1]._condition;
|
|
111
|
+
let param = convertColumn(condition._otherColumn);
|
|
112
|
+
s += " " + modifier.toUpperCase() + " JOIN " + convertTable(table) + " ON " + convertColumnCondition(condition, param);
|
|
113
|
+
}
|
|
114
|
+
return s;
|
|
115
|
+
}
|
|
116
|
+
function convertOrdering(ordering) {
|
|
117
|
+
if (ordering._column) {
|
|
118
|
+
let s = convertColumn(ordering._column);
|
|
119
|
+
if (ordering._nullsPosition != null) {
|
|
120
|
+
s += " IS NULL " + (ordering._nullsPosition === "FIRST" ? "DESC" : "ASC") + ", " + s;
|
|
121
|
+
}
|
|
122
|
+
if (ordering._direction === "ASC") s += " ASC";
|
|
123
|
+
if (ordering._direction === "DESC") s += " DESC";
|
|
124
|
+
return s;
|
|
125
|
+
} else {
|
|
126
|
+
return convertColumn(ordering);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function convertTable(table) {
|
|
130
|
+
return options.nameEscape + table._$name + options.nameEscape;
|
|
131
|
+
}
|
|
132
|
+
function convertColumn(column) {
|
|
133
|
+
let s = "";
|
|
134
|
+
if (!(column._name === "*" && column._modifiers.length > 0 && column._modifiers[0].name === "count")) {
|
|
135
|
+
s += convertTable(column._table) + ".";
|
|
136
|
+
}
|
|
137
|
+
s += convertColumnName(column);
|
|
138
|
+
return convertColumnModifiers(s, column);
|
|
139
|
+
}
|
|
140
|
+
function convertColumnModifiers(s, column) {
|
|
141
|
+
if (column._modifiers) {
|
|
142
|
+
column._modifiers.forEach((modifier) => {
|
|
143
|
+
let name = modifier.name;
|
|
144
|
+
if (name === "lower") s = "LOWER(" + s + ")";
|
|
145
|
+
else if (name === "upper") s = "UPPER(" + s + ")";
|
|
146
|
+
else if (name === "count") s = "COUNT(" + s + ")";
|
|
147
|
+
else if (name === "sum") s = "SUM(" + s + ")";
|
|
148
|
+
else if (name === "avg") s = "AVG(" + s + ")";
|
|
149
|
+
else if (name === "min") s = "MIN(" + s + ")";
|
|
150
|
+
else if (name === "max") s = "MAX(" + s + ")";
|
|
151
|
+
else if (name === "as") s = s + " AS " + options.nameEscape + modifier.params + options.nameEscape;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return s + "";
|
|
155
|
+
}
|
|
156
|
+
function convertColumnName(column) {
|
|
157
|
+
if (column._name === "*") return column._name;
|
|
158
|
+
let name = typeof column._name === "string" ? column._name : column._name.name;
|
|
159
|
+
return options.nameEscape + name + options.nameEscape;
|
|
160
|
+
}
|
|
161
|
+
function preprocessConditions(conditions) {
|
|
162
|
+
conditions.forEach((condition) => {
|
|
163
|
+
if (conditions.length > 1 && condition._sibling) {
|
|
164
|
+
condition._parenthesis = true;
|
|
165
|
+
}
|
|
166
|
+
preprocessParams(condition);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function preprocessParams(condition) {
|
|
170
|
+
if (condition._sibling) {
|
|
171
|
+
preprocessParams(condition._sibling);
|
|
172
|
+
}
|
|
173
|
+
if (!condition._sibling && !condition._child) {
|
|
174
|
+
condition.__param = getConditionParam(condition);
|
|
175
|
+
}
|
|
176
|
+
if (condition._child) {
|
|
177
|
+
preprocessParams(condition._child);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function convertCondition(condition, root = false) {
|
|
181
|
+
if (!condition._sibling && !condition._child) {
|
|
182
|
+
return convertColumnCondition(condition, condition.__param);
|
|
183
|
+
}
|
|
184
|
+
let s = "";
|
|
185
|
+
if (condition._child) {
|
|
186
|
+
s += convertCondition(condition._child);
|
|
187
|
+
}
|
|
188
|
+
if (condition._sibling) {
|
|
189
|
+
s = convertCondition(condition._sibling, root) + " " + condition._chainType.toUpperCase() + " " + s;
|
|
190
|
+
}
|
|
191
|
+
if (condition._parenthesis || (!root || condition._negation) && condition._child) {
|
|
192
|
+
s = "( " + s + " )";
|
|
193
|
+
}
|
|
194
|
+
if (condition._negation) {
|
|
195
|
+
s = "NOT " + s;
|
|
196
|
+
}
|
|
197
|
+
return s;
|
|
198
|
+
}
|
|
199
|
+
function convertColumnCondition(condition, param) {
|
|
200
|
+
let s = convertColumn(condition._column);
|
|
201
|
+
s += getConditionString(condition, param);
|
|
202
|
+
return s;
|
|
203
|
+
}
|
|
204
|
+
function getConditionString(condition, param) {
|
|
205
|
+
switch (condition._type) {
|
|
206
|
+
case "eq":
|
|
207
|
+
return " = " + param;
|
|
208
|
+
case "ne":
|
|
209
|
+
return " <> " + param;
|
|
210
|
+
case "lt":
|
|
211
|
+
return " < " + param;
|
|
212
|
+
case "gt":
|
|
213
|
+
return " > " + param;
|
|
214
|
+
case "lte":
|
|
215
|
+
return " <= " + param;
|
|
216
|
+
case "gte":
|
|
217
|
+
return " >= " + param;
|
|
218
|
+
case "is-null":
|
|
219
|
+
return " IS NULL";
|
|
220
|
+
case "is-not-null":
|
|
221
|
+
return " IS NOT NULL";
|
|
222
|
+
case "like":
|
|
223
|
+
return " LIKE " + param;
|
|
224
|
+
case "not-like":
|
|
225
|
+
return " NOT LIKE " + param;
|
|
226
|
+
case "in":
|
|
227
|
+
return " IN (" + param + ")";
|
|
228
|
+
case "not-in":
|
|
229
|
+
return " NOT IN (" + param + ")";
|
|
230
|
+
case "between":
|
|
231
|
+
return " BETWEEN " + param;
|
|
232
|
+
case "not-between":
|
|
233
|
+
return " NOT BETWEEN " + param;
|
|
234
|
+
default:
|
|
235
|
+
return "";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function getConditionParam(condition) {
|
|
239
|
+
let param = "";
|
|
240
|
+
if (condition._otherColumn) {
|
|
241
|
+
param = convertColumn(condition._otherColumn);
|
|
242
|
+
} else {
|
|
243
|
+
let _convertParam = (param2) => convertParam(condition._column, param2);
|
|
244
|
+
if (condition._type === "in" || condition._type === "not-in") {
|
|
245
|
+
param = condition._values.map((value) => _convertParam(value)).join(", ");
|
|
246
|
+
} else if (condition._type === "between" || condition._type === "not-between") {
|
|
247
|
+
param = _convertParam(condition._values[0]) + " AND " + _convertParam(condition._values[1]);
|
|
248
|
+
} else if (condition._type !== "is-null" && condition._type !== "is-not-null") {
|
|
249
|
+
param = _convertParam(condition._values[0]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return param;
|
|
253
|
+
}
|
|
254
|
+
function convertParam(column, param) {
|
|
255
|
+
if (param == null) return "NULL";
|
|
256
|
+
return paramConverter(getTypedParam(column._type, param));
|
|
257
|
+
}
|
|
258
|
+
function getTypedParam(type, param) {
|
|
259
|
+
if (type === "number") return number(param);
|
|
260
|
+
else if (type === "boolean") return boolean(param);
|
|
261
|
+
else if (type === "date") return date(param);
|
|
262
|
+
else if (type === "string") return string(param);
|
|
263
|
+
return param;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export {
|
|
267
|
+
createQueryConverter
|
|
268
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
function convertResult(query, result, engine) {
|
|
2
|
+
let rows = engine === "pg" ? result.rows : result;
|
|
3
|
+
let rowCount = engine === "pg" ? result.rowCount : result.affectedRows || result.changedRows;
|
|
4
|
+
if (query._action === "select") return convertSelectResult(query, rows);
|
|
5
|
+
if (query._action === "delete") return rowCount;
|
|
6
|
+
if (query._action === "update") return rowCount;
|
|
7
|
+
if (query._action === "insert") return convertInsertResult(result, engine);
|
|
8
|
+
throw new Error("Unknown query type:" + query._action);
|
|
9
|
+
}
|
|
10
|
+
function convertInsertResult(result, engine) {
|
|
11
|
+
if (engine === "mysql") return result.insertId > 0 ? result.insertId : void 0;
|
|
12
|
+
if (engine === "pg" && result.rows && result.rows.length === 1) {
|
|
13
|
+
let columnName = Object.keys(result.rows[0])[0];
|
|
14
|
+
return result.rows[0][columnName];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function convertSelectResult(query, rows) {
|
|
18
|
+
if (query._columns && query._columns.length === 1 && !(query._columns[0]._name === "*" && query._columns[0]._modifiers.length === 0)) {
|
|
19
|
+
if (rows.length == 0) return [];
|
|
20
|
+
let columnName = Object.keys(rows[0])[0];
|
|
21
|
+
let values = rows.map((row) => row[columnName]);
|
|
22
|
+
if (query._columns[0]._name === "*" && query._columns[0]._modifiers.some((m) => m.name === "count")) {
|
|
23
|
+
return values.map((value) => Number(value));
|
|
24
|
+
}
|
|
25
|
+
return values;
|
|
26
|
+
} else {
|
|
27
|
+
convertAliasFields(query, rows);
|
|
28
|
+
return rows;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function convertAliasFields(query, rows) {
|
|
32
|
+
let aliasByName = getColumnAliasesByName(query);
|
|
33
|
+
if (Object.keys(aliasByName).length === 0) return;
|
|
34
|
+
rows.forEach((row) => {
|
|
35
|
+
Object.keys(row).forEach((name) => {
|
|
36
|
+
if (aliasByName[name]) {
|
|
37
|
+
row[aliasByName[name]] = row[name];
|
|
38
|
+
delete row[name];
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function getColumnAliasesByName(query) {
|
|
44
|
+
let aliasByName = {};
|
|
45
|
+
if (query._columns && query._columns.length > 0) {
|
|
46
|
+
query._columns.forEach((column) => {
|
|
47
|
+
if (column._name && column._name.alias && column._modifiers.length === 0) {
|
|
48
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
49
|
+
} else if (column._name === "*" && column._modifiers.length === 0) {
|
|
50
|
+
getAliasColumnsOfTable(column._table).forEach((column2) => {
|
|
51
|
+
aliasByName[column2._name.name] = column2._name.alias;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
} else {
|
|
56
|
+
let tables = query._table ? [query._table] : query._tables;
|
|
57
|
+
tables.forEach((table) => {
|
|
58
|
+
getAliasColumnsOfTable(table).forEach((column) => {
|
|
59
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
60
|
+
});
|
|
61
|
+
let joinTable = table._parent;
|
|
62
|
+
while (joinTable) {
|
|
63
|
+
getAliasColumnsOfTable(joinTable).forEach((column) => {
|
|
64
|
+
aliasByName[column._name.name] = column._name.alias;
|
|
65
|
+
});
|
|
66
|
+
joinTable = joinTable._parent;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return aliasByName;
|
|
71
|
+
}
|
|
72
|
+
function getAliasColumnsOfTable(table) {
|
|
73
|
+
return Object.keys(table).map((key) => table[key]).filter((column) => column && column._name && column._name.alias);
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
convertResult
|
|
77
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createQueryConverter } from "./query-converter";
|
|
2
|
+
import { convertSubstitutionParam } from "./param-converter";
|
|
3
|
+
function convertQueryToSQL(query, options, engine) {
|
|
4
|
+
return createQueryConverter((param) => convertSubstitutionParam(param), options, engine)(query);
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
convertQueryToSQL
|
|
8
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function number(param) {
|
|
2
|
+
let result = Number(param);
|
|
3
|
+
if (Number.isNaN(result)) throw new Error("Invalid number parameter in SQL query: " + param);
|
|
4
|
+
return result;
|
|
5
|
+
}
|
|
6
|
+
function boolean(param) {
|
|
7
|
+
if (typeof param === "boolean") return param;
|
|
8
|
+
if (param instanceof Boolean) return param.valueOf();
|
|
9
|
+
if (param === "true") return true;
|
|
10
|
+
if (param === "false") return false;
|
|
11
|
+
throw new Error("Invalid boolean parameter in SQL query: " + param);
|
|
12
|
+
}
|
|
13
|
+
function date(param) {
|
|
14
|
+
if (param instanceof Date) return param;
|
|
15
|
+
if (typeof param === "number" || param instanceof Number) return new Date(param);
|
|
16
|
+
if (typeof param === "string" || param instanceof String) {
|
|
17
|
+
if (Number.isNaN(Date.parse(String(param)))) throw new Error("Invalid date parameter in SQL query: " + param);
|
|
18
|
+
return new Date(param);
|
|
19
|
+
}
|
|
20
|
+
throw new Error("Invalid date parameter in SQL query: " + param);
|
|
21
|
+
}
|
|
22
|
+
function string(param) {
|
|
23
|
+
if (typeof param === "string") return param;
|
|
24
|
+
if (param instanceof String) return param.valueOf();
|
|
25
|
+
throw new Error("Invalid string parameter in SQL query: " + param);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
boolean,
|
|
29
|
+
date,
|
|
30
|
+
number,
|
|
31
|
+
string
|
|
32
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
const ENV_ANGULAR_NODE_APP_WEBSITE_DOMAIN = "taon-type-sql.example.domain.com";
|
|
2
|
+
const ENV_ANGULAR_NODE_APP_WEBSITE_TITLE = "Taon Type Sql";
|
|
3
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_TARGET_ARTIFACT = "angular-node-app";
|
|
4
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_ENV_NAME = "__";
|
|
5
|
+
const ENV_ANGULAR_NODE_APP_CONTAINER_ONLY = void 0;
|
|
6
|
+
const ENV_ANGULAR_NODE_APP_CONTAINER_END = void 0;
|
|
7
|
+
const ENV_ANGULAR_NODE_APP_CONTAINER_START = void 0;
|
|
8
|
+
const ENV_ANGULAR_NODE_APP_CONTAINER_SKIP_RELEASED = void 0;
|
|
9
|
+
const ENV_ANGULAR_NODE_APP_CONTAINER_SKIP = void 0;
|
|
10
|
+
const ENV_ANGULAR_NODE_APP_INIT_BRANDING = void 0;
|
|
11
|
+
const ENV_ANGULAR_NODE_APP_INIT_STRUCT = void 0;
|
|
12
|
+
const ENV_ANGULAR_NODE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER = void 0;
|
|
13
|
+
const ENV_ANGULAR_NODE_APP_BUILD_PWA_NAME = void 0;
|
|
14
|
+
const ENV_ANGULAR_NODE_APP_BUILD_PWA_SHORT_NAME = void 0;
|
|
15
|
+
const ENV_ANGULAR_NODE_APP_BUILD_PWA_START_URL = void 0;
|
|
16
|
+
const ENV_ANGULAR_NODE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS = void 0;
|
|
17
|
+
const ENV_ANGULAR_NODE_APP_BUILD_SSR = void 0;
|
|
18
|
+
const ENV_ANGULAR_NODE_APP_BUILD_WEBSQL = void 0;
|
|
19
|
+
const ENV_ANGULAR_NODE_APP_BUILD_PROD = void 0;
|
|
20
|
+
const ENV_ANGULAR_NODE_APP_BUILD_OVERRIDE_OUTPUT_PATH = void 0;
|
|
21
|
+
const ENV_ANGULAR_NODE_APP_BUILD_BASE_HREF = void 0;
|
|
22
|
+
const ENV_ANGULAR_NODE_APP_BUILD_WATCH = void 0;
|
|
23
|
+
const ENV_ANGULAR_NODE_APP_BUILD_GEN_ONLY_CLIENT_CODE = void 0;
|
|
24
|
+
const ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER = void 0;
|
|
25
|
+
const ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND = void 0;
|
|
26
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_CLI_MINIFY = void 0;
|
|
27
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES = void 0;
|
|
28
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_CLI_UGLIFY = void 0;
|
|
29
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_CLI_OBSCURE = void 0;
|
|
30
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_CLI_COMPRESS = void 0;
|
|
31
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_NODE_BACKEND_APP_MINIFY = void 0;
|
|
32
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_REMOVE_DTS = void 0;
|
|
33
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE = void 0;
|
|
34
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE = void 0;
|
|
35
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS = void 0;
|
|
36
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_COMPRESS = void 0;
|
|
37
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES = void 0;
|
|
38
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_RESOLVED_NEW_VERSION = void 0;
|
|
39
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE = void 0;
|
|
40
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_ENV_NUMBER = void 0;
|
|
41
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_INSTALL_LOCALLY = void 0;
|
|
42
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL = void 0;
|
|
43
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_TYPE = void 0;
|
|
44
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG = void 0;
|
|
45
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_TASK_NAME = void 0;
|
|
46
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_TAON_INSTANCE_IP = void 0;
|
|
47
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_NPM_PUBLISH = void 0;
|
|
48
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_DEPLOY = void 0;
|
|
49
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_TAG_GIT_PUSH = void 0;
|
|
50
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RELEASE_QUESTION = void 0;
|
|
51
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES = void 0;
|
|
52
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_CODE_CUTTING = void 0;
|
|
53
|
+
const ENV_ANGULAR_NODE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS = void 0;
|
|
54
|
+
const ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK = void 0;
|
|
55
|
+
const ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS = void 0;
|
|
56
|
+
const ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS = void 0;
|
|
57
|
+
const ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_SKIP = void 0;
|
|
58
|
+
const ENV_ANGULAR_NODE_APP_WEBSITE_USE_DOMAIN = void 0;
|
|
59
|
+
const ENV_ANGULAR_NODE_APP_PURPOSE = void 0;
|
|
60
|
+
const ENV_ANGULAR_NODE_APP_RECURSIVE_ACTION = void 0;
|
|
61
|
+
const ENV_ANGULAR_NODE_APP_IS_CI_PROCESS = void 0;
|
|
62
|
+
const ENV_ANGULAR_NODE_APP_DOCKER_ADDITIONAL_CONTAINER = void 0;
|
|
63
|
+
const ENV_ANGULAR_NODE_APP_DOCKER_SKIP_START_IN_ORDER = void 0;
|
|
64
|
+
const ENV_ANGULAR_NODE_APP_DOCKER_SKIP_USING_MYSQL_DB = void 0;
|
|
65
|
+
export {
|
|
66
|
+
ENV_ANGULAR_NODE_APP_BUILD_BASE_HREF,
|
|
67
|
+
ENV_ANGULAR_NODE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS,
|
|
68
|
+
ENV_ANGULAR_NODE_APP_BUILD_GEN_ONLY_CLIENT_CODE,
|
|
69
|
+
ENV_ANGULAR_NODE_APP_BUILD_OVERRIDE_OUTPUT_PATH,
|
|
70
|
+
ENV_ANGULAR_NODE_APP_BUILD_PROD,
|
|
71
|
+
ENV_ANGULAR_NODE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER,
|
|
72
|
+
ENV_ANGULAR_NODE_APP_BUILD_PWA_NAME,
|
|
73
|
+
ENV_ANGULAR_NODE_APP_BUILD_PWA_SHORT_NAME,
|
|
74
|
+
ENV_ANGULAR_NODE_APP_BUILD_PWA_START_URL,
|
|
75
|
+
ENV_ANGULAR_NODE_APP_BUILD_SSR,
|
|
76
|
+
ENV_ANGULAR_NODE_APP_BUILD_WATCH,
|
|
77
|
+
ENV_ANGULAR_NODE_APP_BUILD_WEBSQL,
|
|
78
|
+
ENV_ANGULAR_NODE_APP_CONTAINER_END,
|
|
79
|
+
ENV_ANGULAR_NODE_APP_CONTAINER_ONLY,
|
|
80
|
+
ENV_ANGULAR_NODE_APP_CONTAINER_SKIP,
|
|
81
|
+
ENV_ANGULAR_NODE_APP_CONTAINER_SKIP_RELEASED,
|
|
82
|
+
ENV_ANGULAR_NODE_APP_CONTAINER_START,
|
|
83
|
+
ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK,
|
|
84
|
+
ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS,
|
|
85
|
+
ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS,
|
|
86
|
+
ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_SKIP,
|
|
87
|
+
ENV_ANGULAR_NODE_APP_DOCKER_ADDITIONAL_CONTAINER,
|
|
88
|
+
ENV_ANGULAR_NODE_APP_DOCKER_SKIP_START_IN_ORDER,
|
|
89
|
+
ENV_ANGULAR_NODE_APP_DOCKER_SKIP_USING_MYSQL_DB,
|
|
90
|
+
ENV_ANGULAR_NODE_APP_INIT_BRANDING,
|
|
91
|
+
ENV_ANGULAR_NODE_APP_INIT_STRUCT,
|
|
92
|
+
ENV_ANGULAR_NODE_APP_IS_CI_PROCESS,
|
|
93
|
+
ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND,
|
|
94
|
+
ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER,
|
|
95
|
+
ENV_ANGULAR_NODE_APP_PURPOSE,
|
|
96
|
+
ENV_ANGULAR_NODE_APP_RECURSIVE_ACTION,
|
|
97
|
+
ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_TASK_NAME,
|
|
98
|
+
ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG,
|
|
99
|
+
ENV_ANGULAR_NODE_APP_RELEASE_CLI_COMPRESS,
|
|
100
|
+
ENV_ANGULAR_NODE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES,
|
|
101
|
+
ENV_ANGULAR_NODE_APP_RELEASE_CLI_MINIFY,
|
|
102
|
+
ENV_ANGULAR_NODE_APP_RELEASE_CLI_OBSCURE,
|
|
103
|
+
ENV_ANGULAR_NODE_APP_RELEASE_CLI_UGLIFY,
|
|
104
|
+
ENV_ANGULAR_NODE_APP_RELEASE_ENV_NAME,
|
|
105
|
+
ENV_ANGULAR_NODE_APP_RELEASE_ENV_NUMBER,
|
|
106
|
+
ENV_ANGULAR_NODE_APP_RELEASE_INSTALL_LOCALLY,
|
|
107
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_COMPRESS,
|
|
108
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES,
|
|
109
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS,
|
|
110
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE,
|
|
111
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_REMOVE_DTS,
|
|
112
|
+
ENV_ANGULAR_NODE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE,
|
|
113
|
+
ENV_ANGULAR_NODE_APP_RELEASE_NODE_BACKEND_APP_MINIFY,
|
|
114
|
+
ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_TYPE,
|
|
115
|
+
ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE,
|
|
116
|
+
ENV_ANGULAR_NODE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL,
|
|
117
|
+
ENV_ANGULAR_NODE_APP_RELEASE_RESOLVED_NEW_VERSION,
|
|
118
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS,
|
|
119
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_CODE_CUTTING,
|
|
120
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_DEPLOY,
|
|
121
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_NPM_PUBLISH,
|
|
122
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RELEASE_QUESTION,
|
|
123
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES,
|
|
124
|
+
ENV_ANGULAR_NODE_APP_RELEASE_SKIP_TAG_GIT_PUSH,
|
|
125
|
+
ENV_ANGULAR_NODE_APP_RELEASE_TAON_INSTANCE_IP,
|
|
126
|
+
ENV_ANGULAR_NODE_APP_RELEASE_TARGET_ARTIFACT,
|
|
127
|
+
ENV_ANGULAR_NODE_APP_WEBSITE_DOMAIN,
|
|
128
|
+
ENV_ANGULAR_NODE_APP_WEBSITE_TITLE,
|
|
129
|
+
ENV_ANGULAR_NODE_APP_WEBSITE_USE_DOMAIN
|
|
130
|
+
};
|