typesql-cli 0.9.6 → 0.10.1
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/README.md +2 -3
- package/cli.js +76 -78
- package/cli.js.map +1 -1
- package/code-generator.d.ts +7 -7
- package/code-generator.d.ts.map +1 -1
- package/code-generator.js +193 -194
- package/code-generator.js.map +1 -1
- package/describe-dynamic-query.d.ts +1 -1
- package/describe-dynamic-query.d.ts.map +1 -1
- package/describe-dynamic-query.js +47 -42
- package/describe-dynamic-query.js.map +1 -1
- package/describe-nested-query.d.ts +2 -2
- package/describe-nested-query.d.ts.map +1 -1
- package/describe-nested-query.js +28 -25
- package/describe-nested-query.js.map +1 -1
- package/describe-query.d.ts +4 -4
- package/describe-query.d.ts.map +1 -1
- package/describe-query.js +24 -25
- package/describe-query.js.map +1 -1
- package/drivers/libsql.d.ts +2 -2
- package/drivers/libsql.d.ts.map +1 -1
- package/drivers/libsql.js +4 -5
- package/drivers/libsql.js.map +1 -1
- package/mysql-mapping.d.ts +1 -1
- package/mysql-mapping.d.ts.map +1 -1
- package/mysql-mapping.js +13 -13
- package/mysql-mapping.js.map +1 -1
- package/mysql-query-analyzer/collect-constraints.d.ts +4 -4
- package/mysql-query-analyzer/collect-constraints.d.ts.map +1 -1
- package/mysql-query-analyzer/collect-constraints.js +29 -31
- package/mysql-query-analyzer/collect-constraints.js.map +1 -1
- package/mysql-query-analyzer/infer-column-nullability.d.ts +2 -2
- package/mysql-query-analyzer/infer-column-nullability.d.ts.map +1 -1
- package/mysql-query-analyzer/infer-column-nullability.js +61 -63
- package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
- package/mysql-query-analyzer/infer-param-nullability.d.ts +2 -2
- package/mysql-query-analyzer/infer-param-nullability.d.ts.map +1 -1
- package/mysql-query-analyzer/infer-param-nullability.js +13 -14
- package/mysql-query-analyzer/infer-param-nullability.js.map +1 -1
- package/mysql-query-analyzer/parse.d.ts +2 -2
- package/mysql-query-analyzer/parse.d.ts.map +1 -1
- package/mysql-query-analyzer/parse.js +42 -40
- package/mysql-query-analyzer/parse.js.map +1 -1
- package/mysql-query-analyzer/select-columns.d.ts +4 -4
- package/mysql-query-analyzer/select-columns.d.ts.map +1 -1
- package/mysql-query-analyzer/select-columns.js +70 -65
- package/mysql-query-analyzer/select-columns.js.map +1 -1
- package/mysql-query-analyzer/traverse.d.ts +4 -4
- package/mysql-query-analyzer/traverse.d.ts.map +1 -1
- package/mysql-query-analyzer/traverse.js +211 -188
- package/mysql-query-analyzer/traverse.js.map +1 -1
- package/mysql-query-analyzer/types.d.ts +5 -5
- package/mysql-query-analyzer/types.d.ts.map +1 -1
- package/mysql-query-analyzer/unify.d.ts +2 -2
- package/mysql-query-analyzer/unify.d.ts.map +1 -1
- package/mysql-query-analyzer/unify.js +485 -487
- package/mysql-query-analyzer/unify.js.map +1 -1
- package/mysql-query-analyzer/util.d.ts.map +1 -1
- package/mysql-query-analyzer/util.js +4 -6
- package/mysql-query-analyzer/util.js.map +1 -1
- package/mysql-query-analyzer/verify-multiple-result.d.ts +2 -2
- package/mysql-query-analyzer/verify-multiple-result.d.ts.map +1 -1
- package/mysql-query-analyzer/verify-multiple-result.js +9 -9
- package/mysql-query-analyzer/verify-multiple-result.js.map +1 -1
- package/package.json +46 -44
- package/queryExectutor.d.ts +4 -4
- package/queryExectutor.d.ts.map +1 -1
- package/queryExectutor.js +48 -51
- package/queryExectutor.js.map +1 -1
- package/sql-generator.d.ts +2 -2
- package/sql-generator.d.ts.map +1 -1
- package/sql-generator.js +30 -29
- package/sql-generator.js.map +1 -1
- package/sqlite-query-analyzer/code-generator.d.ts +6 -6
- package/sqlite-query-analyzer/code-generator.d.ts.map +1 -1
- package/sqlite-query-analyzer/code-generator.js +226 -177
- package/sqlite-query-analyzer/code-generator.js.map +1 -1
- package/sqlite-query-analyzer/parser.d.ts +4 -4
- package/sqlite-query-analyzer/parser.d.ts.map +1 -1
- package/sqlite-query-analyzer/parser.js +17 -18
- package/sqlite-query-analyzer/parser.js.map +1 -1
- package/sqlite-query-analyzer/query-executor.d.ts +6 -6
- package/sqlite-query-analyzer/query-executor.d.ts.map +1 -1
- package/sqlite-query-analyzer/query-executor.js +42 -33
- package/sqlite-query-analyzer/query-executor.js.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.d.ts +1 -1
- package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.js +5 -5
- package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts +4 -4
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js +19 -17
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
- package/sqlite-query-analyzer/traverse.d.ts +5 -5
- package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
- package/sqlite-query-analyzer/traverse.js +185 -155
- package/sqlite-query-analyzer/traverse.js.map +1 -1
- package/ts-dynamic-query-descriptor.d.ts +1 -1
- package/ts-dynamic-query-descriptor.d.ts.map +1 -1
- package/ts-dynamic-query-descriptor.js +7 -8
- package/ts-dynamic-query-descriptor.js.map +1 -1
- package/ts-nested-descriptor.d.ts +4 -4
- package/ts-nested-descriptor.d.ts.map +1 -1
- package/ts-nested-descriptor.js +13 -14
- package/ts-nested-descriptor.js.map +1 -1
- package/types.d.ts +18 -15
- package/types.d.ts.map +1 -1
- package/util.d.ts.map +1 -1
- package/util.js.map +1 -1
- package/utility-types.d.ts.map +1 -1
package/code-generator.js
CHANGED
@@ -35,9 +35,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
35
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
36
36
|
};
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
38
|
-
exports.
|
39
|
-
|
40
|
-
|
38
|
+
exports.generateTsCodeForMySQL = generateTsCodeForMySQL;
|
39
|
+
exports.getOperator = getOperator;
|
40
|
+
exports.generateRelationType = generateRelationType;
|
41
|
+
exports.writeTypeBlock = writeTypeBlock;
|
42
|
+
exports.generateTsDescriptor = generateTsDescriptor;
|
43
|
+
exports.removeDuplicatedParameters = removeDuplicatedParameters;
|
44
|
+
exports.removeDuplicatedParameters2 = removeDuplicatedParameters2;
|
45
|
+
exports.renameInvalidNames = renameInvalidNames;
|
46
|
+
exports.escapeInvalidTsField = escapeInvalidTsField;
|
47
|
+
exports.hasStringColumn = hasStringColumn;
|
48
|
+
exports.hasDateColumn = hasDateColumn;
|
49
|
+
exports.replaceOrderByParam = replaceOrderByParam;
|
50
|
+
exports.writeFile = writeFile;
|
51
|
+
exports.capitalize = capitalize;
|
52
|
+
exports.convertToCamelCaseName = convertToCamelCaseName;
|
53
|
+
exports.generateTsFile = generateTsFile;
|
54
|
+
exports.generateTsFileFromContent = generateTsFileFromContent;
|
55
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
56
|
+
const node_path_1 = __importStar(require("node:path"));
|
41
57
|
const camelcase_1 = __importDefault(require("camelcase"));
|
42
58
|
const Either_1 = require("fp-ts/lib/Either");
|
43
59
|
const mysql_mapping_1 = require("./mysql-mapping");
|
@@ -45,33 +61,29 @@ const describe_query_1 = require("./describe-query");
|
|
45
61
|
const code_block_writer_1 = __importDefault(require("code-block-writer"));
|
46
62
|
const ts_nested_descriptor_1 = require("./ts-nested-descriptor");
|
47
63
|
const ts_dynamic_query_descriptor_1 = require("./ts-dynamic-query-descriptor");
|
48
|
-
const
|
64
|
+
const node_os_1 = require("node:os");
|
49
65
|
const code_generator_1 = require("./sqlite-query-analyzer/code-generator");
|
50
|
-
function generateTsCodeForMySQL(tsDescriptor, fileName,
|
66
|
+
function generateTsCodeForMySQL(tsDescriptor, fileName, crud = false) {
|
51
67
|
var _a;
|
52
68
|
const writer = new code_block_writer_1.default();
|
53
69
|
const camelCaseName = convertToCamelCaseName(fileName);
|
54
70
|
const capitalizedName = capitalize(camelCaseName);
|
55
|
-
const dataTypeName = capitalizedName
|
56
|
-
const paramsTypeName = capitalizedName
|
57
|
-
const resultTypeName = capitalizedName
|
58
|
-
const dynamicParamsTypeName = capitalizedName
|
59
|
-
const selectColumnsTypeName = capitalizedName
|
60
|
-
const whereTypeName = capitalizedName
|
61
|
-
const orderByTypeName = capitalizedName
|
71
|
+
const dataTypeName = `${capitalizedName}Data`;
|
72
|
+
const paramsTypeName = `${capitalizedName}Params`;
|
73
|
+
const resultTypeName = `${capitalizedName}Result`;
|
74
|
+
const dynamicParamsTypeName = `${capitalizedName}DynamicParams`;
|
75
|
+
const selectColumnsTypeName = `${capitalizedName}Select`;
|
76
|
+
const whereTypeName = `${capitalizedName}Where`;
|
77
|
+
const orderByTypeName = `${capitalizedName}OrderBy`;
|
62
78
|
const generateOrderBy = tsDescriptor.orderByColumns != null && tsDescriptor.orderByColumns.length > 0;
|
63
79
|
// Import declarations
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
else {
|
68
|
-
writer.writeLine(`import type { Connection } from 'mysql2/promise';`);
|
69
|
-
if (tsDescriptor.dynamicQuery != null) {
|
70
|
-
writer.writeLine(`import { EOL } from 'os';`);
|
71
|
-
}
|
80
|
+
writer.writeLine(`import type { Connection } from 'mysql2/promise';`);
|
81
|
+
if (tsDescriptor.dynamicQuery != null) {
|
82
|
+
writer.writeLine(`import { EOL } from 'os';`);
|
72
83
|
}
|
73
84
|
writer.blankLine();
|
74
|
-
if (tsDescriptor.data) {
|
85
|
+
if (tsDescriptor.data) {
|
86
|
+
//update
|
75
87
|
writeTypeBlock(writer, tsDescriptor.data, dataTypeName, crud);
|
76
88
|
}
|
77
89
|
const orderByField = generateOrderBy ? `orderBy: [${orderByTypeName}, ...${orderByTypeName}[]]` : undefined;
|
@@ -95,7 +107,7 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
95
107
|
if (tsDescriptor.dynamicQuery) {
|
96
108
|
const selectFields = (0, ts_dynamic_query_descriptor_1.mapToDynamicSelectColumns)(tsDescriptor.columns);
|
97
109
|
writeTypeBlock(writer, selectFields, selectColumnsTypeName, false);
|
98
|
-
writer.write(
|
110
|
+
writer.write('const selectFragments = ').inlineBlock(() => {
|
99
111
|
var _a;
|
100
112
|
(_a = tsDescriptor.dynamicQuery) === null || _a === void 0 ? void 0 : _a.select.forEach((fragment, index) => {
|
101
113
|
const field = tsDescriptor.columns[index].name;
|
@@ -105,17 +117,16 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
105
117
|
writer.write(' as const;');
|
106
118
|
if (orderByField != null) {
|
107
119
|
writer.blankLine();
|
108
|
-
writer.write(
|
109
|
-
|
110
|
-
(_a = tsDescriptor.orderByColumns) === null || _a === void 0 ? void 0 : _a.forEach((col) => {
|
120
|
+
writer.write('const orderByFragments = ').inlineBlock(() => {
|
121
|
+
for (const col of tsDescriptor.orderByColumns || []) {
|
111
122
|
writer.writeLine(`'${col}': \`${col}\`,`);
|
112
|
-
}
|
123
|
+
}
|
113
124
|
});
|
114
125
|
writer.write(' as const;');
|
115
126
|
}
|
116
127
|
writer.blankLine();
|
117
128
|
writer.writeLine(`const NumericOperatorList = ['=', '<>', '>', '<', '>=', '<='] as const;`);
|
118
|
-
writer.writeLine(
|
129
|
+
writer.writeLine('type NumericOperator = typeof NumericOperatorList[number];');
|
119
130
|
if (hasStringColumn(tsDescriptor.columns)) {
|
120
131
|
writer.writeLine(`type StringOperator = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE';`);
|
121
132
|
}
|
@@ -123,41 +134,43 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
123
134
|
writer.writeLine(`type BetweenOperator = 'BETWEEN';`);
|
124
135
|
writer.blankLine();
|
125
136
|
writer.write(`export type ${whereTypeName} =`).indent(() => {
|
126
|
-
tsDescriptor.columns
|
137
|
+
for (const col of tsDescriptor.columns) {
|
127
138
|
writer.writeLine(`| ['${col.name}', ${getOperator(col.tsType)}, ${col.tsType} | null]`);
|
128
139
|
writer.writeLine(`| ['${col.name}', SetOperator, ${col.tsType}[]]`);
|
129
140
|
writer.writeLine(`| ['${col.name}', BetweenOperator, ${col.tsType} | null, ${col.tsType} | null]`);
|
130
|
-
}
|
141
|
+
}
|
131
142
|
});
|
132
143
|
writer.blankLine();
|
133
144
|
}
|
134
145
|
let functionReturnType = resultTypeName;
|
135
|
-
functionReturnType += tsDescriptor.multipleRowsResult ? '[]' : tsDescriptor.queryType
|
136
|
-
let functionArguments =
|
137
|
-
functionArguments += tsDescriptor.data && tsDescriptor.data.length > 0 ?
|
146
|
+
functionReturnType += tsDescriptor.multipleRowsResult ? '[]' : tsDescriptor.queryType === 'Select' ? ' | null' : '';
|
147
|
+
let functionArguments = 'connection: Connection';
|
148
|
+
functionArguments += tsDescriptor.data && tsDescriptor.data.length > 0 ? `, data: ${dataTypeName}` : '';
|
138
149
|
if (tsDescriptor.dynamicQuery == null) {
|
139
|
-
functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ?
|
150
|
+
functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ? `, params: ${paramsTypeName}` : '';
|
140
151
|
}
|
141
152
|
else {
|
142
153
|
functionArguments += `, ${orderByField ? 'params' : 'params?'}: ${dynamicParamsTypeName}`;
|
143
154
|
}
|
144
|
-
const allParameters = tsDescriptor.data
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
155
|
+
const allParameters = tsDescriptor.data
|
156
|
+
? tsDescriptor.data.map((field, index) => {
|
157
|
+
//:nameIsSet, :name, :valueIsSet, :value....
|
158
|
+
if (crud && index % 2 === 0) {
|
159
|
+
const nextField = tsDescriptor.data[index + 1];
|
160
|
+
return `data.${nextField.name} !== undefined`;
|
161
|
+
}
|
162
|
+
return `data.${field.name}`;
|
163
|
+
})
|
164
|
+
: [];
|
165
|
+
allParameters.push(...tsDescriptor.parameterNames.map((paramName) => generateParam(paramName)));
|
166
|
+
const queryParams = allParameters.length > 0 ? `, [${allParameters.join(', ')}]` : '';
|
154
167
|
const escapedBackstick = scapeBackStick(tsDescriptor.sql);
|
155
168
|
const processedSql = replaceOrderByParam(escapedBackstick);
|
156
169
|
const sqlSplit = processedSql.split('\n');
|
157
170
|
writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${functionReturnType}>`).block(() => {
|
158
171
|
if (tsDescriptor.dynamicQuery == null) {
|
159
172
|
writer.writeLine('const sql = `');
|
160
|
-
sqlSplit.forEach(sqlLine => {
|
173
|
+
sqlSplit.forEach((sqlLine) => {
|
161
174
|
writer.indent().write(sqlLine);
|
162
175
|
writer.newLine();
|
163
176
|
});
|
@@ -165,34 +178,36 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
165
178
|
writer.blankLine();
|
166
179
|
}
|
167
180
|
else {
|
168
|
-
writer.writeLine(
|
181
|
+
writer.writeLine('const where = whereConditionsToObject(params?.where);');
|
169
182
|
if (orderByField != null) {
|
170
|
-
writer.writeLine(
|
183
|
+
writer.writeLine('const orderBy = orderByToObject(params.orderBy);');
|
171
184
|
}
|
172
185
|
writer.writeLine('const paramsValues: any = [];');
|
173
186
|
if (tsDescriptor.dynamicQuery.with) {
|
174
187
|
writer.writeLine(`let withClause = '';`);
|
175
|
-
tsDescriptor.dynamicQuery.with.forEach(withFragment => {
|
188
|
+
tsDescriptor.dynamicQuery.with.forEach((withFragment) => {
|
176
189
|
generateDynamicQueryFrom(writer, 'withClause', withFragment, tsDescriptor.columns);
|
177
190
|
});
|
178
191
|
}
|
179
192
|
writer.writeLine(`let sql = 'SELECT';`);
|
180
|
-
tsDescriptor.dynamicQuery.select.forEach(fragment => {
|
181
|
-
writer
|
193
|
+
tsDescriptor.dynamicQuery.select.forEach((fragment) => {
|
194
|
+
writer
|
195
|
+
.write(`if (params?.select == null || ${fragment.dependOnFields.map((fieldIndex) => `params.select.${tsDescriptor.columns[fieldIndex].name}`).join('&&')})`)
|
196
|
+
.block(() => {
|
182
197
|
writer.write(`sql = appendSelect(sql, \`${fragment.fragment}\`);`);
|
183
198
|
});
|
184
199
|
});
|
185
|
-
tsDescriptor.dynamicQuery.from.forEach(fragment => {
|
200
|
+
tsDescriptor.dynamicQuery.from.forEach((fragment) => {
|
186
201
|
generateDynamicQueryFrom(writer, 'sql', fragment, tsDescriptor.columns, tsDescriptor.orderByColumns != null);
|
187
202
|
});
|
188
|
-
writer.writeLine(
|
189
|
-
tsDescriptor.dynamicQuery.where.forEach(fragment => {
|
190
|
-
const ifParamConditions = fragment.dependOnParams.map(param =>
|
191
|
-
const paramValues = fragment.parameters.map(param =>
|
203
|
+
writer.writeLine('sql += EOL + `WHERE 1 = 1`;');
|
204
|
+
tsDescriptor.dynamicQuery.where.forEach((fragment) => {
|
205
|
+
const ifParamConditions = fragment.dependOnParams.map((param) => `params?.params?.${param} != null`);
|
206
|
+
const paramValues = fragment.parameters.map((param) => `params.params.${param}`);
|
192
207
|
if (ifParamConditions.length > 0) {
|
193
208
|
writer.write(`if (${ifParamConditions.join(' || ')})`).block(() => {
|
194
209
|
writer.writeLine(`sql += EOL + \`${fragment.fragment}\`;`);
|
195
|
-
paramValues.forEach(paramValues => {
|
210
|
+
paramValues.forEach((paramValues) => {
|
196
211
|
writer.writeLine(`paramsValues.push(${paramValues});`);
|
197
212
|
});
|
198
213
|
});
|
@@ -206,11 +221,11 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
206
221
|
writer.writeLine(`sql = 'WITH ' + withClause + EOL + sql;`);
|
207
222
|
});
|
208
223
|
}
|
209
|
-
writer.write(
|
210
|
-
writer.writeLine(
|
211
|
-
writer.write(
|
224
|
+
writer.write('params?.where?.forEach(condition => ').inlineBlock(() => {
|
225
|
+
writer.writeLine('const where = whereCondition(condition);');
|
226
|
+
writer.write('if (where?.hasValue)').block(() => {
|
212
227
|
writer.writeLine(`sql += EOL + 'AND ' + where.sql;`);
|
213
|
-
writer.write(
|
228
|
+
writer.write('paramsValues.push(...where.values);');
|
214
229
|
});
|
215
230
|
});
|
216
231
|
writer.write(');');
|
@@ -218,37 +233,31 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
218
233
|
writer.writeLine('sql += EOL + `ORDER BY ${escapeOrderBy(params.orderBy)}`;');
|
219
234
|
}
|
220
235
|
}
|
221
|
-
const singleRowSelect = tsDescriptor.queryType
|
222
|
-
if (
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
if (tsDescriptor.queryType == 'Select') {
|
228
|
-
if (tsDescriptor.dynamicQuery == null) {
|
229
|
-
writer.writeLine(`return connection.query({sql, rowsAsArray: true}${queryParams})`);
|
230
|
-
writer.indent().write(`.then(res => res[0] as any[])`);
|
231
|
-
writer.newLine().indent().write(`.then(res => res.map(data => mapArrayTo${resultTypeName}(data)))`);
|
232
|
-
}
|
233
|
-
else {
|
234
|
-
writer.writeLine(`return connection.query({ sql, rowsAsArray: true }, paramsValues)`);
|
235
|
-
writer.indent().write(`.then(res => res[0] as any[])`);
|
236
|
-
writer.newLine().indent().write(`.then(res => res.map(data => mapArrayTo${resultTypeName}(data, params?.select)))`);
|
237
|
-
}
|
238
|
-
}
|
239
|
-
else {
|
240
|
-
writer.writeLine(`return connection.query(sql${queryParams})`);
|
241
|
-
writer.indent().write(`.then(res => res[0] as ${resultTypeName})`);
|
242
|
-
}
|
243
|
-
if (tsDescriptor.queryType == 'Select' && tsDescriptor.multipleRowsResult == false) {
|
244
|
-
writer.newLine().indent().write(`.then(res => res[0]);`);
|
236
|
+
const singleRowSelect = tsDescriptor.queryType === 'Select' && tsDescriptor.multipleRowsResult === false;
|
237
|
+
if (tsDescriptor.queryType === 'Select') {
|
238
|
+
if (tsDescriptor.dynamicQuery == null) {
|
239
|
+
writer.writeLine(`return connection.query({sql, rowsAsArray: true}${queryParams})`);
|
240
|
+
writer.indent().write('.then(res => res[0] as any[])');
|
241
|
+
writer.newLine().indent().write(`.then(res => res.map(data => mapArrayTo${resultTypeName}(data)))`);
|
245
242
|
}
|
246
243
|
else {
|
247
|
-
writer.
|
244
|
+
writer.writeLine('return connection.query({ sql, rowsAsArray: true }, paramsValues)');
|
245
|
+
writer.indent().write('.then(res => res[0] as any[])');
|
246
|
+
writer.newLine().indent().write(`.then(res => res.map(data => mapArrayTo${resultTypeName}(data, params?.select)))`);
|
248
247
|
}
|
249
248
|
}
|
249
|
+
else {
|
250
|
+
writer.writeLine(`return connection.query(sql${queryParams})`);
|
251
|
+
writer.indent().write(`.then(res => res[0] as ${resultTypeName})`);
|
252
|
+
}
|
253
|
+
if (tsDescriptor.queryType === 'Select' && tsDescriptor.multipleRowsResult === false) {
|
254
|
+
writer.newLine().indent().write('.then(res => res[0]);');
|
255
|
+
}
|
256
|
+
else {
|
257
|
+
writer.write(';');
|
258
|
+
}
|
250
259
|
});
|
251
|
-
if (
|
260
|
+
if (tsDescriptor.queryType === 'Select') {
|
252
261
|
writer.blankLine();
|
253
262
|
if (tsDescriptor.dynamicQuery == null) {
|
254
263
|
writer.write(`function mapArrayTo${resultTypeName}(data: any)`).block(() => {
|
@@ -263,7 +272,7 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
263
272
|
else {
|
264
273
|
writer.write(`function mapArrayTo${resultTypeName}(data: any, select?: ${selectColumnsTypeName})`).block(() => {
|
265
274
|
writer.writeLine(`const result = {} as ${resultTypeName};`);
|
266
|
-
writer.writeLine(
|
275
|
+
writer.writeLine('let rowIndex = 0;');
|
267
276
|
tsDescriptor.columns.forEach((tsField) => {
|
268
277
|
writer.write(`if (select == null || select.${tsField.name})`).block(() => {
|
269
278
|
writer.writeLine(`result.${tsField.name} = data[rowIndex++];`);
|
@@ -272,39 +281,39 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
272
281
|
writer.write('return result;');
|
273
282
|
});
|
274
283
|
writer.blankLine();
|
275
|
-
writer.write(
|
284
|
+
writer.write('function appendSelect(sql: string, selectField: string)').block(() => {
|
276
285
|
writer.write(`if (sql == 'SELECT')`).block(() => {
|
277
|
-
writer.writeLine(
|
286
|
+
writer.writeLine('return sql + EOL + selectField;');
|
278
287
|
});
|
279
|
-
writer.write(
|
288
|
+
writer.write('else').block(() => {
|
280
289
|
writer.writeLine(`return sql + ', ' + EOL + selectField;`);
|
281
290
|
});
|
282
291
|
});
|
283
292
|
writer.blankLine();
|
284
293
|
writer.write(`function whereConditionsToObject(whereConditions?: ${whereTypeName}[])`).block(() => {
|
285
|
-
writer.writeLine(
|
286
|
-
writer.write(
|
287
|
-
writer.writeLine(
|
288
|
-
writer.write(
|
289
|
-
writer.writeLine(
|
294
|
+
writer.writeLine('const obj = {} as any;');
|
295
|
+
writer.write('whereConditions?.forEach(condition => ').inlineBlock(() => {
|
296
|
+
writer.writeLine('const where = whereCondition(condition);');
|
297
|
+
writer.write('if (where?.hasValue) ').block(() => {
|
298
|
+
writer.writeLine('obj[condition[0]] = true;');
|
290
299
|
});
|
291
300
|
});
|
292
301
|
writer.write(');');
|
293
|
-
writer.writeLine(
|
302
|
+
writer.writeLine('return obj;');
|
294
303
|
});
|
295
304
|
if (orderByField != null) {
|
296
305
|
writer.blankLine();
|
297
306
|
writer.write(`function orderByToObject(${orderByField})`).block(() => {
|
298
|
-
writer.writeLine(
|
299
|
-
writer.write(
|
300
|
-
writer.writeLine(
|
307
|
+
writer.writeLine('const obj = {} as any;');
|
308
|
+
writer.write('orderBy?.forEach(order => ').inlineBlock(() => {
|
309
|
+
writer.writeLine('obj[order.column] = true;');
|
301
310
|
});
|
302
311
|
writer.write(');');
|
303
|
-
writer.writeLine(
|
312
|
+
writer.writeLine('return obj;');
|
304
313
|
});
|
305
314
|
}
|
306
315
|
writer.blankLine();
|
307
|
-
writer.write(
|
316
|
+
writer.write('type WhereConditionResult = ').block(() => {
|
308
317
|
writer.writeLine('sql: string;');
|
309
318
|
writer.writeLine('hasValue: boolean;');
|
310
319
|
writer.writeLine('values: any[];');
|
@@ -317,29 +326,29 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
317
326
|
writer.blankLine();
|
318
327
|
if (hasStringColumn(tsDescriptor.columns)) {
|
319
328
|
writer.write(`if (operator == 'LIKE') `).block(() => {
|
320
|
-
writer.write(
|
321
|
-
writer.writeLine(
|
329
|
+
writer.write('return ').block(() => {
|
330
|
+
writer.writeLine("sql: `${selectFragment} LIKE concat('%', ?, '%')`,");
|
322
331
|
writer.writeLine('hasValue: condition[2] != null,');
|
323
332
|
writer.writeLine('values: [condition[2]]');
|
324
333
|
});
|
325
334
|
});
|
326
335
|
}
|
327
336
|
writer.write(`if (operator == 'BETWEEN') `).block(() => {
|
328
|
-
writer.write(
|
337
|
+
writer.write('return ').block(() => {
|
329
338
|
writer.writeLine('sql: `${selectFragment} BETWEEN ? AND ?`,');
|
330
339
|
writer.writeLine('hasValue: condition[2] != null && condition[3] != null,');
|
331
340
|
writer.writeLine('values: [condition[2], condition[3]]');
|
332
341
|
});
|
333
342
|
});
|
334
343
|
writer.write(`if (operator == 'IN' || operator == 'NOT IN') `).block(() => {
|
335
|
-
writer.write(
|
344
|
+
writer.write('return ').block(() => {
|
336
345
|
writer.writeLine('sql: `${selectFragment} ${operator} (?)`,');
|
337
346
|
writer.writeLine('hasValue: condition[2] != null && condition[2].length > 0,');
|
338
347
|
writer.writeLine('values: [condition[2]]');
|
339
348
|
});
|
340
349
|
});
|
341
|
-
writer.write(
|
342
|
-
writer.write(
|
350
|
+
writer.write('if (NumericOperatorList.includes(operator)) ').block(() => {
|
351
|
+
writer.write('return ').block(() => {
|
343
352
|
writer.writeLine('sql: `${selectFragment} ${operator} ?`,');
|
344
353
|
writer.writeLine('hasValue: condition[2] != null,');
|
345
354
|
writer.writeLine('values: [condition[2]]');
|
@@ -349,14 +358,14 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
349
358
|
}
|
350
359
|
}
|
351
360
|
if (generateOrderBy) {
|
352
|
-
const orderByColumnsType = (_a = tsDescriptor.orderByColumns) === null || _a === void 0 ? void 0 : _a.map(col => `'${col}'`).join(' | ');
|
361
|
+
const orderByColumnsType = (_a = tsDescriptor.orderByColumns) === null || _a === void 0 ? void 0 : _a.map((col) => `'${col}'`).join(' | ');
|
353
362
|
writer.blankLine();
|
354
363
|
writer.write(`export type ${orderByTypeName} = `).block(() => {
|
355
364
|
if (tsDescriptor.dynamicQuery == null) {
|
356
365
|
writer.writeLine(`column: ${orderByColumnsType};`);
|
357
366
|
}
|
358
367
|
else {
|
359
|
-
writer.writeLine(
|
368
|
+
writer.writeLine('column: keyof typeof orderByFragments;');
|
360
369
|
}
|
361
370
|
writer.writeLine(`direction: 'asc' | 'desc';`);
|
362
371
|
});
|
@@ -376,12 +385,12 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
376
385
|
const relationType = generateRelationType(capitalizedName, relation.name);
|
377
386
|
writer.blankLine();
|
378
387
|
writer.write(`export type ${relationType} = `).block(() => {
|
379
|
-
const uniqueNameFields = renameInvalidNames(relation.fields.map(f => f.name));
|
388
|
+
const uniqueNameFields = renameInvalidNames(relation.fields.map((f) => f.name));
|
380
389
|
relation.fields.forEach((field, index) => {
|
381
|
-
if (field.type
|
390
|
+
if (field.type === 'field') {
|
382
391
|
writer.writeLine(`${uniqueNameFields[index]}: ${field.tsType};`);
|
383
392
|
}
|
384
|
-
if (field.type
|
393
|
+
if (field.type === 'relation') {
|
385
394
|
const nestedRelationType = generateRelationType(capitalizedName, field.tsType);
|
386
395
|
const nullableOperator = field.notNull ? '' : '?';
|
387
396
|
writer.writeLine(`${field.name}${nullableOperator}: ${nestedRelationType};`);
|
@@ -391,7 +400,8 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
391
400
|
});
|
392
401
|
relations.forEach((relation, index) => {
|
393
402
|
const relationType = generateRelationType(capitalizedName, relation.name);
|
394
|
-
if (index
|
403
|
+
if (index === 0) {
|
404
|
+
//first
|
395
405
|
writer.blankLine();
|
396
406
|
writer.write(`export async function ${camelCaseName}Nested(${functionArguments}): Promise<${relationType}[]>`).block(() => {
|
397
407
|
const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
|
@@ -412,19 +422,19 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
412
422
|
});
|
413
423
|
writer.blankLine();
|
414
424
|
writer.write(`function ${mapFunctionName}(selectResult: ${resultTypeName}[]): ${relationType}`).block(() => {
|
415
|
-
writer.writeLine(
|
425
|
+
writer.writeLine('const firstRow = selectResult[0];');
|
416
426
|
writer.write(`const result: ${relationType} = `).block(() => {
|
417
|
-
const uniqueNameFields = renameInvalidNames(relation.fields.map(f => f.name));
|
427
|
+
const uniqueNameFields = renameInvalidNames(relation.fields.map((f) => f.name));
|
418
428
|
relation.fields.forEach((field, index) => {
|
419
429
|
const separator = commaSeparator(relation.fields.length, index);
|
420
|
-
if (field.type
|
430
|
+
if (field.type === 'field') {
|
421
431
|
const fieldName = tsDescriptor.columns[field.index].name;
|
422
|
-
writer.writeLine(`${uniqueNameFields[index]}: firstRow.${fieldName}
|
432
|
+
writer.writeLine(`${uniqueNameFields[index]}: firstRow.${fieldName}!${separator}`);
|
423
433
|
}
|
424
|
-
if (field.type
|
434
|
+
if (field.type === 'relation') {
|
425
435
|
const nestedRelationType = generateRelationType(capitalizedName, field.name);
|
426
436
|
const cardinality = field.list ? '' : '[0]';
|
427
|
-
writer.writeLine(`${field.name}: collect${nestedRelationType}(selectResult)${cardinality}`
|
437
|
+
writer.writeLine(`${field.name}: collect${nestedRelationType}(selectResult)${cardinality}${separator}`);
|
428
438
|
}
|
429
439
|
});
|
430
440
|
});
|
@@ -433,90 +443,90 @@ function generateTsCodeForMySQL(tsDescriptor, fileName, target, crud = false) {
|
|
433
443
|
});
|
434
444
|
writer.blankLine();
|
435
445
|
writer.write('const groupBy = <T, Q>(array: T[], predicate: (value: T, index: number, array: T[]) => Q) =>').block(() => {
|
436
|
-
writer
|
446
|
+
writer
|
447
|
+
.write('return array.reduce((map, value, index, array) => ')
|
448
|
+
.inlineBlock(() => {
|
437
449
|
writer.writeLine('const key = predicate(value, index, array);');
|
438
450
|
writer.writeLine('map.get(key)?.push(value) ?? map.set(key, [value]);');
|
439
451
|
writer.writeLine('return map;');
|
440
|
-
})
|
452
|
+
})
|
453
|
+
.write(', new Map<Q, T[]>());');
|
441
454
|
});
|
442
455
|
}
|
443
456
|
return writer.toString();
|
444
457
|
}
|
445
|
-
exports.generateTsCodeForMySQL = generateTsCodeForMySQL;
|
446
458
|
function generateDynamicQueryFrom(writer, sqlVar, fragment, columns, includeOrderBy = false) {
|
447
459
|
var _a;
|
448
|
-
const selectConditions = fragment.dependOnFields.map(fieldIndex =>
|
460
|
+
const selectConditions = fragment.dependOnFields.map((fieldIndex) => `params.select.${columns[fieldIndex].name}`);
|
449
461
|
if (selectConditions.length > 0) {
|
450
462
|
selectConditions.unshift('params?.select == null');
|
451
463
|
}
|
452
|
-
const paramConditions = fragment.dependOnParams.map(param =>
|
453
|
-
const whereConditions = fragment.dependOnFields.map(fieldIndex =>
|
454
|
-
const orderByConditions = includeOrderBy ? ((_a = fragment.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map(orderBy =>
|
464
|
+
const paramConditions = fragment.dependOnParams.map((param) => `params.params?.${param} != null`);
|
465
|
+
const whereConditions = fragment.dependOnFields.map((fieldIndex) => `where.${columns[fieldIndex].name} != null`);
|
466
|
+
const orderByConditions = includeOrderBy ? ((_a = fragment.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map((orderBy) => `orderBy['${orderBy}'] != null`)) || [] : [];
|
455
467
|
const allConditions = [...selectConditions, ...paramConditions, ...whereConditions, ...orderByConditions];
|
456
|
-
const paramValues = fragment.parameters.map(param =>
|
468
|
+
const paramValues = fragment.parameters.map((param) => `params?.params?.${param}`);
|
457
469
|
if (allConditions.length > 0) {
|
458
|
-
writer.write(`if (${allConditions.join(
|
470
|
+
writer.write(`if (${allConditions.join(`${node_os_1.EOL} || `)})`).block(() => {
|
459
471
|
writer.write(`${sqlVar} += EOL + \`${fragment.fragment}\`;`);
|
460
|
-
|
461
|
-
writer.writeLine(`paramsValues.push(${
|
462
|
-
}
|
472
|
+
for (const paramValue of paramValues) {
|
473
|
+
writer.writeLine(`paramsValues.push(${paramValue});`);
|
474
|
+
}
|
463
475
|
});
|
464
476
|
}
|
465
477
|
else {
|
466
478
|
writer.writeLine(`${sqlVar} += EOL + \`${fragment.fragment}\`;`);
|
467
|
-
|
468
|
-
writer.writeLine(`paramsValues.push(${
|
469
|
-
}
|
479
|
+
for (const paramValue of paramValues) {
|
480
|
+
writer.writeLine(`paramsValues.push(${paramValue});`);
|
481
|
+
}
|
470
482
|
}
|
471
483
|
}
|
472
484
|
function getOperator(type) {
|
473
|
-
if (type
|
485
|
+
if (type === 'number' || type === 'Date') {
|
474
486
|
return 'NumericOperator';
|
475
487
|
}
|
476
488
|
return 'StringOperator';
|
477
489
|
}
|
478
|
-
|
479
|
-
|
480
|
-
if (target == 'node' && param.isList) {
|
490
|
+
function generateParam(param) {
|
491
|
+
if (param.isList) {
|
481
492
|
return `params.${param.name}.length == 0? null : params.${param.name}`;
|
482
493
|
}
|
483
494
|
return `params.${param.name}`;
|
484
495
|
}
|
485
496
|
function generateRelationType(capitalizedName, relationName) {
|
486
|
-
return capitalizedName
|
497
|
+
return `${capitalizedName}Nested${capitalizeStr(relationName)}`;
|
487
498
|
}
|
488
|
-
exports.generateRelationType = generateRelationType;
|
489
499
|
function writeTypeBlock(writer, fields, typeName, updateCrud, extraField) {
|
490
500
|
const writeBlockCond = fields.length > 0 || extraField != null;
|
491
501
|
if (writeBlockCond) {
|
492
502
|
writer.write(`export type ${typeName} =`).block(() => {
|
493
503
|
fields.forEach((tsField, index) => {
|
494
504
|
// :nameSet, :name, valueSet, :value...
|
495
|
-
if (updateCrud && index % 2
|
496
|
-
|
505
|
+
if (updateCrud && index % 2 !== 0) {
|
506
|
+
//only odd fields (:name, :value)
|
507
|
+
writer.writeLine(`${tsFieldToStr(tsField, true)};`);
|
497
508
|
}
|
498
509
|
else if (!updateCrud) {
|
499
|
-
writer.writeLine(tsFieldToStr(tsField, false)
|
510
|
+
writer.writeLine(`${tsFieldToStr(tsField, false)};`);
|
500
511
|
}
|
501
512
|
});
|
502
513
|
if (extraField) {
|
503
|
-
writer.write(extraField
|
514
|
+
writer.write(`${extraField};`);
|
504
515
|
}
|
505
516
|
});
|
506
517
|
writer.blankLine();
|
507
518
|
}
|
508
519
|
}
|
509
|
-
exports.writeTypeBlock = writeTypeBlock;
|
510
520
|
function tsFieldToStr(tsField, isCrudUpdate) {
|
511
521
|
if (isCrudUpdate) {
|
512
522
|
//all fields are optionals
|
513
|
-
return tsField.name
|
523
|
+
return `${tsField.name}?: ${tsField.tsType}${tsField.notNull === false ? ' | null' : ''}`;
|
514
524
|
}
|
515
525
|
return tsField.name + (tsField.notNull ? ': ' : '?: ') + tsField.tsType;
|
516
526
|
}
|
517
527
|
function generateTsDescriptor(queryInfo) {
|
518
528
|
var _a;
|
519
|
-
const escapedColumnsNames = renameInvalidNames(queryInfo.columns.map(col => col.columnName));
|
529
|
+
const escapedColumnsNames = renameInvalidNames(queryInfo.columns.map((col) => col.columnName));
|
520
530
|
const columns = queryInfo.columns.map((col, columnIndex) => {
|
521
531
|
const tsDesc = {
|
522
532
|
name: escapedColumnsNames[columnIndex],
|
@@ -525,15 +535,15 @@ function generateTsDescriptor(queryInfo) {
|
|
525
535
|
};
|
526
536
|
return tsDesc;
|
527
537
|
});
|
528
|
-
const parameterNames = queryInfo.parameters.map(p => {
|
538
|
+
const parameterNames = queryInfo.parameters.map((p) => {
|
529
539
|
const paramInfo = {
|
530
540
|
name: p.name,
|
531
|
-
isList: p.columnType.endsWith('[]')
|
541
|
+
isList: !!p.columnType.endsWith('[]')
|
532
542
|
};
|
533
543
|
return paramInfo;
|
534
544
|
});
|
535
545
|
const uniqueParams = removeDuplicatedParameters(queryInfo.parameters);
|
536
|
-
const escapedParametersNames = renameInvalidNames(uniqueParams.map(col => col.name));
|
546
|
+
const escapedParametersNames = renameInvalidNames(uniqueParams.map((col) => col.name));
|
537
547
|
const parameters = uniqueParams.map((col, paramIndex) => {
|
538
548
|
const arraySymbol = col.list ? '[]' : '';
|
539
549
|
const tsDesc = {
|
@@ -543,7 +553,7 @@ function generateTsDescriptor(queryInfo) {
|
|
543
553
|
};
|
544
554
|
return tsDesc;
|
545
555
|
});
|
546
|
-
const escapedDataNames = queryInfo.data ? renameInvalidNames(queryInfo.data.map(col => col.name)) : [];
|
556
|
+
const escapedDataNames = queryInfo.data ? renameInvalidNames(queryInfo.data.map((col) => col.name)) : [];
|
547
557
|
const data = (_a = queryInfo.data) === null || _a === void 0 ? void 0 : _a.map((col, dataIndex) => {
|
548
558
|
const tsDesc = {
|
549
559
|
name: escapedDataNames[dataIndex],
|
@@ -560,7 +570,7 @@ function generateTsDescriptor(queryInfo) {
|
|
560
570
|
orderByColumns: queryInfo.orderByColumns,
|
561
571
|
parameterNames,
|
562
572
|
parameters,
|
563
|
-
data
|
573
|
+
data
|
564
574
|
};
|
565
575
|
if (queryInfo.nestedResultInfo) {
|
566
576
|
const nestedDescriptor = (0, ts_nested_descriptor_1.createNestedTsDescriptor)(queryInfo.columns, queryInfo.nestedResultInfo);
|
@@ -575,13 +585,13 @@ function generateTsDescriptor(queryInfo) {
|
|
575
585
|
}
|
576
586
|
return result;
|
577
587
|
}
|
578
|
-
exports.generateTsDescriptor = generateTsDescriptor;
|
579
588
|
function removeDuplicatedParameters(parameters) {
|
580
589
|
const columnsCount = new Map();
|
581
|
-
parameters.forEach(param => {
|
590
|
+
parameters.forEach((param) => {
|
582
591
|
const dupParam = columnsCount.get(param.name);
|
583
|
-
if (dupParam != null) {
|
584
|
-
|
592
|
+
if (dupParam != null) {
|
593
|
+
//duplicated - two parameter null and notNull, resturn the null param (notNull == false)
|
594
|
+
if (param.notNull === false) {
|
585
595
|
columnsCount.set(param.name, param);
|
586
596
|
}
|
587
597
|
// return param;
|
@@ -592,14 +602,14 @@ function removeDuplicatedParameters(parameters) {
|
|
592
602
|
});
|
593
603
|
return [...columnsCount.values()];
|
594
604
|
}
|
595
|
-
exports.removeDuplicatedParameters = removeDuplicatedParameters;
|
596
605
|
//TODO - remove duplicated code
|
597
606
|
function removeDuplicatedParameters2(parameters) {
|
598
607
|
const columnsCount = new Map();
|
599
|
-
parameters.forEach(param => {
|
608
|
+
parameters.forEach((param) => {
|
600
609
|
const dupParam = columnsCount.get(param.name);
|
601
|
-
if (dupParam != null) {
|
602
|
-
|
610
|
+
if (dupParam != null) {
|
611
|
+
//duplicated - two parameter null and notNull, resturn the null param (notNull == false)
|
612
|
+
if (param.notNull === false) {
|
603
613
|
columnsCount.set(param.name, param);
|
604
614
|
}
|
605
615
|
// return param;
|
@@ -610,26 +620,22 @@ function removeDuplicatedParameters2(parameters) {
|
|
610
620
|
});
|
611
621
|
return [...columnsCount.values()];
|
612
622
|
}
|
613
|
-
exports.removeDuplicatedParameters2 = removeDuplicatedParameters2;
|
614
623
|
function renameInvalidNames(columnNames) {
|
615
624
|
const columnsCount = new Map();
|
616
|
-
return columnNames.map(columnName => {
|
625
|
+
return columnNames.map((columnName) => {
|
617
626
|
if (columnsCount.has(columnName)) {
|
618
627
|
const count = columnsCount.get(columnName) + 1;
|
619
628
|
columnsCount.set(columnName, count);
|
620
|
-
const newName = columnName
|
629
|
+
const newName = `${columnName}_${count}`;
|
621
630
|
return escapeInvalidTsField(newName);
|
622
631
|
}
|
623
|
-
|
624
|
-
|
625
|
-
return escapeInvalidTsField(columnName);
|
626
|
-
}
|
632
|
+
columnsCount.set(columnName, 1);
|
633
|
+
return escapeInvalidTsField(columnName);
|
627
634
|
});
|
628
635
|
}
|
629
|
-
exports.renameInvalidNames = renameInvalidNames;
|
630
636
|
function scapeBackStick(sql) {
|
631
637
|
const pattern = /`/g;
|
632
|
-
return sql.replace(pattern,
|
638
|
+
return sql.replace(pattern, '\\`');
|
633
639
|
}
|
634
640
|
function escapeInvalidTsField(columnName) {
|
635
641
|
const validPattern = /^[a-zA-Z0-9_$]+$/g;
|
@@ -638,38 +644,32 @@ function escapeInvalidTsField(columnName) {
|
|
638
644
|
}
|
639
645
|
return columnName;
|
640
646
|
}
|
641
|
-
exports.escapeInvalidTsField = escapeInvalidTsField;
|
642
647
|
function mapColumnType(columnType) {
|
643
|
-
if (columnType
|
648
|
+
if (columnType === 'any')
|
644
649
|
return 'any';
|
645
650
|
const types = [].concat(columnType);
|
646
|
-
const mappedTypes = types.map(type => (0, mysql_mapping_1.converToTsType)(type));
|
651
|
+
const mappedTypes = types.map((type) => (0, mysql_mapping_1.converToTsType)(type));
|
647
652
|
return mappedTypes.join(' | '); // number | string
|
648
653
|
}
|
649
654
|
function hasStringColumn(columns) {
|
650
|
-
return columns.some(c => c.tsType
|
655
|
+
return columns.some((c) => c.tsType === 'string');
|
651
656
|
}
|
652
|
-
exports.hasStringColumn = hasStringColumn;
|
653
657
|
function hasDateColumn(columns) {
|
654
|
-
return columns.some(c => c.tsType
|
658
|
+
return columns.some((c) => c.tsType === 'Date');
|
655
659
|
}
|
656
|
-
exports.hasDateColumn = hasDateColumn;
|
657
660
|
function replaceOrderByParam(sql) {
|
658
661
|
const patern = /(.*order\s+by\s*)(\?)(.\n$)*/i;
|
659
|
-
const newSql = sql.replace(patern,
|
662
|
+
const newSql = sql.replace(patern, '$1${escapeOrderBy(params.orderBy)}$3');
|
660
663
|
return newSql;
|
661
664
|
}
|
662
|
-
exports.replaceOrderByParam = replaceOrderByParam;
|
663
665
|
function writeFile(filePath, tsContent) {
|
664
|
-
|
666
|
+
node_fs_1.default.writeFileSync(filePath, tsContent);
|
665
667
|
}
|
666
|
-
exports.writeFile = writeFile;
|
667
668
|
function capitalize(name) {
|
668
669
|
return capitalizeStr(name);
|
669
670
|
}
|
670
|
-
exports.capitalize = capitalize;
|
671
671
|
function capitalizeStr(name) {
|
672
|
-
if (name.length
|
672
|
+
if (name.length === 0)
|
673
673
|
return name;
|
674
674
|
return name.charAt(0).toUpperCase() + name.slice(1);
|
675
675
|
}
|
@@ -677,19 +677,20 @@ function convertToCamelCaseName(name) {
|
|
677
677
|
const camelCaseStr = (0, camelcase_1.default)(name);
|
678
678
|
return camelCaseStr;
|
679
679
|
}
|
680
|
-
exports.convertToCamelCaseName = convertToCamelCaseName;
|
681
680
|
function generateTsFile(client, sqlFile, dbSchema, isCrudFile) {
|
682
681
|
return __awaiter(this, void 0, void 0, function* () {
|
683
|
-
const sqlContent =
|
684
|
-
if (sqlContent.trim()
|
682
|
+
const sqlContent = node_fs_1.default.readFileSync(sqlFile, 'utf8');
|
683
|
+
if (sqlContent.trim() === '') {
|
684
|
+
//ignore empty file
|
685
685
|
return;
|
686
686
|
}
|
687
|
-
const fileName = (0,
|
688
|
-
const dirPath = (0,
|
687
|
+
const fileName = (0, node_path_1.parse)(sqlFile).name;
|
688
|
+
const dirPath = (0, node_path_1.parse)(sqlFile).dir;
|
689
689
|
const queryName = convertToCamelCaseName(fileName);
|
690
|
-
const tsContentResult = client.type
|
690
|
+
const tsContentResult = client.type === 'mysql2'
|
691
|
+
? yield generateTsFileFromContent(client, queryName, sqlContent, isCrudFile)
|
691
692
|
: (0, code_generator_1.validateAndGenerateCode)(client, sqlContent, queryName, dbSchema, isCrudFile);
|
692
|
-
const tsFilePath =
|
693
|
+
const tsFilePath = `${node_path_1.default.resolve(dirPath, fileName)}.ts`;
|
693
694
|
if ((0, Either_1.isLeft)(tsContentResult)) {
|
694
695
|
console.error('ERROR: ', tsContentResult.left.description);
|
695
696
|
console.error('at ', sqlFile);
|
@@ -700,20 +701,18 @@ function generateTsFile(client, sqlFile, dbSchema, isCrudFile) {
|
|
700
701
|
writeFile(tsFilePath, tsContent);
|
701
702
|
});
|
702
703
|
}
|
703
|
-
|
704
|
-
function
|
705
|
-
return __awaiter(this, arguments, void 0, function* (client, queryName, sqlContent, target, crud = false) {
|
704
|
+
function generateTsFileFromContent(client_1, queryName_1, sqlContent_1) {
|
705
|
+
return __awaiter(this, arguments, void 0, function* (client, queryName, sqlContent, crud = false) {
|
706
706
|
const queryInfoResult = yield (0, describe_query_1.parseSql)(client, sqlContent);
|
707
707
|
if ((0, Either_1.isLeft)(queryInfoResult)) {
|
708
708
|
return queryInfoResult;
|
709
709
|
}
|
710
710
|
const tsDescriptor = generateTsDescriptor(queryInfoResult.right);
|
711
|
-
const tsContent = generateTsCodeForMySQL(tsDescriptor, queryName,
|
711
|
+
const tsContent = generateTsCodeForMySQL(tsDescriptor, queryName, crud);
|
712
712
|
return (0, Either_1.right)(tsContent);
|
713
713
|
});
|
714
714
|
}
|
715
|
-
exports.generateTsFileFromContent = generateTsFileFromContent;
|
716
715
|
function commaSeparator(length, index) {
|
717
|
-
return length > 1 && index
|
716
|
+
return length > 1 && index !== length - 1 ? ',' : '';
|
718
717
|
}
|
719
718
|
//# sourceMappingURL=code-generator.js.map
|