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
@@ -3,7 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.
|
6
|
+
exports.validateAndGenerateCode = validateAndGenerateCode;
|
7
|
+
exports.generateCrud = generateCrud;
|
8
|
+
exports.generateTsCode = generateTsCode;
|
7
9
|
const Either_1 = require("fp-ts/lib/Either");
|
8
10
|
const parser_1 = require("./parser");
|
9
11
|
const code_generator_1 = require("../code-generator");
|
@@ -12,7 +14,7 @@ const ts_nested_descriptor_1 = require("../ts-nested-descriptor");
|
|
12
14
|
const describe_query_1 = require("../describe-query");
|
13
15
|
const query_executor_1 = require("./query-executor");
|
14
16
|
const ts_dynamic_query_descriptor_1 = require("../ts-dynamic-query-descriptor");
|
15
|
-
const
|
17
|
+
const node_os_1 = require("node:os");
|
16
18
|
function validateAndGenerateCode(client, sql, queryName, sqliteDbSchema, isCrud = false) {
|
17
19
|
const { sql: processedSql } = (0, describe_query_1.preprocessSql)(sql);
|
18
20
|
const explainSqlResult = (0, query_executor_1.explainSql)(client.client, processedSql);
|
@@ -22,12 +24,11 @@ function validateAndGenerateCode(client, sql, queryName, sqliteDbSchema, isCrud
|
|
22
24
|
description: explainSqlResult.left.description
|
23
25
|
});
|
24
26
|
}
|
25
|
-
const code = generateTsCode(sql, queryName, sqliteDbSchema,
|
27
|
+
const code = generateTsCode(sql, queryName, sqliteDbSchema, client.type, isCrud);
|
26
28
|
return code;
|
27
29
|
}
|
28
|
-
exports.validateAndGenerateCode = validateAndGenerateCode;
|
29
30
|
function mapToColumnInfo(col, checkOptional) {
|
30
|
-
const defaultValue = col.columnKey
|
31
|
+
const defaultValue = col.columnKey === 'PRI' && col.column_type === 'INTEGER' ? 'AUTOINCREMENT' : col.defaultValue;
|
31
32
|
const columnInfo = {
|
32
33
|
columnName: col.column,
|
33
34
|
notNull: col.notNull,
|
@@ -37,45 +38,44 @@ function mapToColumnInfo(col, checkOptional) {
|
|
37
38
|
};
|
38
39
|
return columnInfo;
|
39
40
|
}
|
40
|
-
function generateCrud(client
|
41
|
-
const columns = dbSchema.filter(col => col.table
|
42
|
-
const columnInfo = columns.map(col => mapToColumnInfo(col, queryType
|
43
|
-
const keys = columns.filter(col => col.columnKey
|
44
|
-
if (keys.length
|
45
|
-
keys.push(...columns.filter(col => col.columnKey
|
46
|
-
}
|
47
|
-
const keyColumnInfo = keys.map(key => mapToColumnInfo(key, false)).map(col => mapColumnToTsFieldDescriptor(col, client));
|
41
|
+
function generateCrud(client, queryType, tableName, dbSchema) {
|
42
|
+
const columns = dbSchema.filter((col) => col.table === tableName);
|
43
|
+
const columnInfo = columns.map((col) => mapToColumnInfo(col, queryType === 'Insert' || queryType === 'Update'));
|
44
|
+
const keys = columns.filter((col) => col.columnKey === 'PRI');
|
45
|
+
if (keys.length === 0) {
|
46
|
+
keys.push(...columns.filter((col) => col.columnKey === 'UNI'));
|
47
|
+
}
|
48
|
+
const keyColumnInfo = keys.map((key) => mapToColumnInfo(key, false)).map((col) => mapColumnToTsFieldDescriptor(col, client));
|
48
49
|
const resultColumns = mapColumns(client, queryType, columnInfo, false);
|
49
|
-
const params = columnInfo.map(col => mapColumnToTsFieldDescriptor(col, client));
|
50
|
+
const params = columnInfo.map((col) => mapColumnToTsFieldDescriptor(col, client));
|
50
51
|
const tsDescriptor = {
|
51
52
|
sql: '',
|
52
53
|
queryType,
|
53
54
|
multipleRowsResult: false,
|
54
55
|
columns: resultColumns,
|
55
56
|
parameterNames: [],
|
56
|
-
parameters: queryType
|
57
|
-
data: queryType
|
57
|
+
parameters: queryType === 'Insert' ? params : keyColumnInfo,
|
58
|
+
data: queryType === 'Update' ? params.filter((param) => { var _a; return param.name !== ((_a = keyColumnInfo[0]) === null || _a === void 0 ? void 0 : _a.name); }) : []
|
58
59
|
};
|
59
60
|
const queryName = getQueryName(queryType, tableName);
|
60
61
|
const code = generateCodeFromTsDescriptor(client, queryName, tsDescriptor, true, tableName);
|
61
62
|
return code;
|
62
63
|
}
|
63
|
-
exports.generateCrud = generateCrud;
|
64
64
|
function getQueryName(queryType, tableName) {
|
65
65
|
const camelCaseName = (0, code_generator_1.convertToCamelCaseName)(tableName);
|
66
66
|
const captitalizedName = (0, code_generator_1.capitalize)(camelCaseName);
|
67
67
|
switch (queryType) {
|
68
|
-
case
|
69
|
-
return
|
70
|
-
case
|
71
|
-
return
|
72
|
-
case
|
73
|
-
return
|
74
|
-
case
|
75
|
-
return
|
68
|
+
case 'Select':
|
69
|
+
return `selectFrom${captitalizedName}`;
|
70
|
+
case 'Insert':
|
71
|
+
return `insertInto${captitalizedName}`;
|
72
|
+
case 'Update':
|
73
|
+
return `update${captitalizedName}`;
|
74
|
+
case 'Delete':
|
75
|
+
return `deleteFrom${captitalizedName}`;
|
76
76
|
}
|
77
77
|
}
|
78
|
-
function generateTsCode(sql, queryName, sqliteDbSchema, isCrud = false
|
78
|
+
function generateTsCode(sql, queryName, sqliteDbSchema, client, isCrud = false) {
|
79
79
|
const schemaDefResult = (0, parser_1.parseSql)(sql, sqliteDbSchema);
|
80
80
|
if ((0, Either_1.isLeft)(schemaDefResult)) {
|
81
81
|
return schemaDefResult;
|
@@ -84,7 +84,6 @@ function generateTsCode(sql, queryName, sqliteDbSchema, isCrud = false, client =
|
|
84
84
|
const code = generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud);
|
85
85
|
return (0, Either_1.right)(code);
|
86
86
|
}
|
87
|
-
exports.generateTsCode = generateTsCode;
|
88
87
|
function createTsDescriptor(queryInfo, client) {
|
89
88
|
var _a;
|
90
89
|
const tsDescriptor = {
|
@@ -94,17 +93,17 @@ function createTsDescriptor(queryInfo, client) {
|
|
94
93
|
returning: queryInfo.returning,
|
95
94
|
columns: mapColumns(client, queryInfo.queryType, queryInfo.columns, queryInfo.returning),
|
96
95
|
parameterNames: [],
|
97
|
-
parameters: queryInfo.parameters.map(param => mapParameterToTsFieldDescriptor(param, client)),
|
98
|
-
data: (_a = queryInfo.data) === null || _a === void 0 ? void 0 : _a.map(param => mapParameterToTsFieldDescriptor(param, client)),
|
96
|
+
parameters: queryInfo.parameters.map((param) => mapParameterToTsFieldDescriptor(param, client)),
|
97
|
+
data: (_a = queryInfo.data) === null || _a === void 0 ? void 0 : _a.map((param) => mapParameterToTsFieldDescriptor(param, client)),
|
99
98
|
orderByColumns: queryInfo.orderByColumns
|
100
99
|
};
|
101
100
|
if (queryInfo.nestedInfo) {
|
102
|
-
const nestedDescriptor2 = queryInfo.nestedInfo.map(relation => {
|
101
|
+
const nestedDescriptor2 = queryInfo.nestedInfo.map((relation) => {
|
103
102
|
const tsRelation = {
|
104
103
|
groupIndex: relation.groupIndex,
|
105
104
|
name: relation.name,
|
106
|
-
fields: relation.fields.map(field => mapFieldToTsField(queryInfo.columns, field, client)),
|
107
|
-
relations: relation.relations.map(relation => (0, ts_nested_descriptor_1.mapToTsRelation2)(relation))
|
105
|
+
fields: relation.fields.map((field) => mapFieldToTsField(queryInfo.columns, field, client)),
|
106
|
+
relations: relation.relations.map((relation) => (0, ts_nested_descriptor_1.mapToTsRelation2)(relation))
|
108
107
|
};
|
109
108
|
return tsRelation;
|
110
109
|
});
|
@@ -138,13 +137,13 @@ function mapColumns(client, queryType, columns, returning = false) {
|
|
138
137
|
notNull: true
|
139
138
|
}
|
140
139
|
];
|
141
|
-
if (queryType
|
142
|
-
return client == 'sqlite' ? sqliteInsertColumns : libSqlInsertColumns;
|
140
|
+
if (queryType === 'Insert' && !returning) {
|
141
|
+
return client === 'better-sqlite3' || client == 'bun:sqlite' ? sqliteInsertColumns : libSqlInsertColumns;
|
143
142
|
}
|
144
|
-
if (queryType
|
145
|
-
return client == 'sqlite' ? [sqliteInsertColumns[0]] : [libSqlInsertColumns[0]];
|
143
|
+
if (queryType === 'Update' || queryType === 'Delete') {
|
144
|
+
return client === 'better-sqlite3' || client == 'bun:sqlite' ? [sqliteInsertColumns[0]] : [libSqlInsertColumns[0]];
|
146
145
|
}
|
147
|
-
const escapedColumnsNames = (0, code_generator_1.renameInvalidNames)(columns.map(col => col.columnName));
|
146
|
+
const escapedColumnsNames = (0, code_generator_1.renameInvalidNames)(columns.map((col) => col.columnName));
|
148
147
|
return columns.map((col, index) => mapColumnToTsFieldDescriptor(Object.assign(Object.assign({}, col), { columnName: escapedColumnsNames[index] }), client));
|
149
148
|
}
|
150
149
|
function mapFieldToTsField(columns, field, client) {
|
@@ -194,7 +193,7 @@ function mapColumnType(sqliteType, client) {
|
|
194
193
|
case 'DATE':
|
195
194
|
return 'Date';
|
196
195
|
case 'BLOB':
|
197
|
-
return client
|
196
|
+
return client === 'better-sqlite3' ? 'Uint8Array' : 'ArrayBuffer';
|
198
197
|
}
|
199
198
|
}
|
200
199
|
function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud = false, tableName = '') {
|
@@ -206,35 +205,38 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
206
205
|
const capitalizedName = (0, code_generator_1.capitalize)(camelCaseName);
|
207
206
|
const queryType = tsDescriptor.queryType;
|
208
207
|
const sql = tsDescriptor.sql;
|
209
|
-
const dataTypeName = capitalizedName
|
210
|
-
const paramsTypeName = capitalizedName
|
211
|
-
const resultTypeName = capitalizedName
|
212
|
-
const dynamicParamsTypeName = capitalizedName
|
213
|
-
const selectColumnsTypeName = capitalizedName
|
214
|
-
const whereTypeName = capitalizedName
|
215
|
-
const orderByTypeName = capitalizedName
|
208
|
+
const dataTypeName = `${capitalizedName}Data`;
|
209
|
+
const paramsTypeName = `${capitalizedName}Params`;
|
210
|
+
const resultTypeName = `${capitalizedName}Result`;
|
211
|
+
const dynamicParamsTypeName = `${capitalizedName}DynamicParams`;
|
212
|
+
const selectColumnsTypeName = `${capitalizedName}Select`;
|
213
|
+
const whereTypeName = `${capitalizedName}Where`;
|
214
|
+
const orderByTypeName = `${capitalizedName}OrderBy`;
|
216
215
|
const generateOrderBy = tsDescriptor.orderByColumns != null && tsDescriptor.orderByColumns.length > 0;
|
217
216
|
const uniqueParams = (0, code_generator_1.removeDuplicatedParameters2)(tsDescriptor.parameters);
|
218
217
|
const uniqueUpdateParams = (0, code_generator_1.removeDuplicatedParameters2)(tsDescriptor.data || []);
|
219
218
|
const orderByField = generateOrderBy ? `orderBy: [${orderByTypeName}, 'asc' | 'desc'][]` : undefined;
|
220
219
|
const paramsTypes = (0, code_generator_1.removeDuplicatedParameters2)(tsDescriptor.dynamicQuery2 == null ? tsDescriptor.parameters : (0, ts_dynamic_query_descriptor_1.mapToDynamicParams)(tsDescriptor.parameters));
|
221
|
-
let functionArguments = client == 'sqlite' ?
|
222
|
-
functionArguments += queryType
|
220
|
+
let functionArguments = client === 'better-sqlite3' || client == 'bun:sqlite' ? 'db: Database' : 'client: Client | Transaction';
|
221
|
+
functionArguments += queryType === 'Update' ? `, data: ${dataTypeName}` : '';
|
223
222
|
if (tsDescriptor.dynamicQuery2 == null) {
|
224
|
-
functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ?
|
223
|
+
functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ? `, params: ${paramsTypeName}` : '';
|
225
224
|
}
|
226
225
|
else {
|
227
226
|
functionArguments += `, ${orderByField ? 'params' : 'params?'}: ${dynamicParamsTypeName}`;
|
228
227
|
}
|
229
|
-
const orNull = queryType
|
228
|
+
const orNull = queryType === 'Select' ? ' | null' : '';
|
230
229
|
const returnType = tsDescriptor.multipleRowsResult ? `${resultTypeName}[]` : `${resultTypeName}${orNull}`;
|
231
|
-
const allParameters = (((_a = tsDescriptor.data) === null || _a === void 0 ? void 0 : _a.map((param) => fromDriver('data', param))) || [])
|
232
|
-
|
233
|
-
const queryParams =
|
234
|
-
if (client
|
230
|
+
const allParameters = (((_a = tsDescriptor.data) === null || _a === void 0 ? void 0 : _a.map((param) => fromDriver('data', param))) || []).concat(tsDescriptor.parameters.map((param) => fromDriver('params', param)));
|
231
|
+
const queryParamsWithoutBrackets = allParameters.length > 0 ? `${allParameters.join(', ')}` : '';
|
232
|
+
const queryParams = queryParamsWithoutBrackets !== '' ? `[${queryParamsWithoutBrackets}]` : '';
|
233
|
+
if (client === 'better-sqlite3') {
|
235
234
|
writer.writeLine(`import type { Database } from 'better-sqlite3';`);
|
236
235
|
}
|
237
|
-
if (client
|
236
|
+
if (client === 'bun:sqlite') {
|
237
|
+
writer.writeLine(`import type { Database } from 'bun:sqlite';`);
|
238
|
+
}
|
239
|
+
if (client === 'libsql') {
|
238
240
|
writer.writeLine(`import type { Client, Transaction } from '@libsql/client';`);
|
239
241
|
}
|
240
242
|
if (tsDescriptor.dynamicQuery2 != null) {
|
@@ -256,7 +258,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
256
258
|
(0, code_generator_1.writeTypeBlock)(writer, resultTypes, resultTypeName, false);
|
257
259
|
const selectFields = (0, ts_dynamic_query_descriptor_1.mapToDynamicSelectColumns)(tsDescriptor.columns);
|
258
260
|
(0, code_generator_1.writeTypeBlock)(writer, selectFields, selectColumnsTypeName, false);
|
259
|
-
writer.write(
|
261
|
+
writer.write('const selectFragments = ').inlineBlock(() => {
|
260
262
|
var _a;
|
261
263
|
(_a = tsDescriptor.dynamicQuery2) === null || _a === void 0 ? void 0 : _a.select.forEach((fragment, index) => {
|
262
264
|
const field = tsDescriptor.columns[index].name;
|
@@ -266,7 +268,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
266
268
|
writer.write(' as const;');
|
267
269
|
writer.blankLine();
|
268
270
|
writer.writeLine(`const NumericOperatorList = ['=', '<>', '>', '<', '>=', '<='] as const;`);
|
269
|
-
writer.writeLine(
|
271
|
+
writer.writeLine('type NumericOperator = typeof NumericOperatorList[number];');
|
270
272
|
if ((0, code_generator_1.hasStringColumn)(tsDescriptor.columns)) {
|
271
273
|
writer.writeLine(`type StringOperator = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE';`);
|
272
274
|
}
|
@@ -274,20 +276,20 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
274
276
|
writer.writeLine(`type BetweenOperator = 'BETWEEN';`);
|
275
277
|
writer.blankLine();
|
276
278
|
writer.write(`export type ${whereTypeName} =`).indent(() => {
|
277
|
-
tsDescriptor.columns.forEach(col => {
|
279
|
+
tsDescriptor.columns.forEach((col) => {
|
278
280
|
writer.writeLine(`| ['${col.name}', ${(0, code_generator_1.getOperator)(col.tsType)}, ${col.tsType} | null]`);
|
279
281
|
writer.writeLine(`| ['${col.name}', SetOperator, ${col.tsType}[]]`);
|
280
282
|
writer.writeLine(`| ['${col.name}', BetweenOperator, ${col.tsType} | null, ${col.tsType} | null]`);
|
281
283
|
});
|
282
284
|
});
|
283
285
|
writer.blankLine();
|
284
|
-
const asyncModified = client
|
285
|
-
const returnTypeModifier = client
|
286
|
+
const asyncModified = client === 'libsql' ? 'async ' : '';
|
287
|
+
const returnTypeModifier = client === 'libsql' ? `Promise<${returnType}>` : returnType;
|
286
288
|
writer.write(`export ${asyncModified}function ${camelCaseName}(${functionArguments}): ${returnTypeModifier}`).block(() => {
|
287
289
|
var _a, _b, _c, _d, _e, _f;
|
288
290
|
writer.write('const where = whereConditionsToObject(params?.where);').newLine();
|
289
291
|
if (orderByField != null) {
|
290
|
-
writer.writeLine(
|
292
|
+
writer.writeLine('const orderBy = orderByToObject(params.orderBy);');
|
291
293
|
}
|
292
294
|
writer.write('const paramsValues: any = [];').newLine();
|
293
295
|
const hasCte = (((_a = tsDescriptor.dynamicQuery2) === null || _a === void 0 ? void 0 : _a.with.length) || 0) > 0;
|
@@ -295,17 +297,17 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
295
297
|
writer.writeLine(`let withClause = '';`);
|
296
298
|
(_b = tsDescriptor.dynamicQuery2) === null || _b === void 0 ? void 0 : _b.with.forEach((withFragment, index) => {
|
297
299
|
var _a;
|
298
|
-
const selectConditions = withFragment.dependOnFields.map(fieldIndex =>
|
300
|
+
const selectConditions = withFragment.dependOnFields.map((fieldIndex) => `params.select.${tsDescriptor.columns[fieldIndex].name}`);
|
299
301
|
if (selectConditions.length > 0) {
|
300
302
|
selectConditions.unshift('params?.select == null');
|
301
303
|
}
|
302
|
-
const whereConditions = withFragment.dependOnFields.map(fieldIndex =>
|
303
|
-
const orderByConditions = ((_a = withFragment.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map(orderBy =>
|
304
|
+
const whereConditions = withFragment.dependOnFields.map((fieldIndex) => `where.${tsDescriptor.columns[fieldIndex].name} != null`);
|
305
|
+
const orderByConditions = ((_a = withFragment.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map((orderBy) => `orderBy['${orderBy}'] != null`)) || [];
|
304
306
|
const allConditions = [...selectConditions, ...whereConditions, ...orderByConditions];
|
305
|
-
const paramValues = withFragment.parameters.map(param =>
|
306
|
-
writer.write(`if (${allConditions.join(
|
307
|
+
const paramValues = withFragment.parameters.map((param) => `params?.params?.${param}`);
|
308
|
+
writer.write(`if (${allConditions.join(`${node_os_1.EOL}\t|| `)})`).block(() => {
|
307
309
|
writer.write(`withClause += EOL + \`${withFragment.fragment}\`;`);
|
308
|
-
paramValues.forEach(paramValues => {
|
310
|
+
paramValues.forEach((paramValues) => {
|
309
311
|
writer.writeLine(`paramsValues.push(${paramValues});`);
|
310
312
|
});
|
311
313
|
});
|
@@ -318,56 +320,56 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
318
320
|
(_c = tsDescriptor.dynamicQuery2) === null || _c === void 0 ? void 0 : _c.select.forEach((select, index) => {
|
319
321
|
writer.write(`if (params?.select == null || params.select.${tsDescriptor.columns[index].name})`).block(() => {
|
320
322
|
writer.writeLine(`sql = appendSelect(sql, \`${select.fragment}\`);`);
|
321
|
-
select.parameters.forEach(param => {
|
323
|
+
select.parameters.forEach((param) => {
|
322
324
|
writer.writeLine(`paramsValues.push(params?.params?.${param} ?? null);`);
|
323
325
|
});
|
324
326
|
});
|
325
327
|
});
|
326
328
|
(_d = tsDescriptor.dynamicQuery2) === null || _d === void 0 ? void 0 : _d.from.forEach((from, index) => {
|
327
329
|
var _a;
|
328
|
-
if (index
|
330
|
+
if (index === 0) {
|
329
331
|
writer.writeLine(`sql += EOL + \`${from.fragment}\`;`);
|
330
332
|
}
|
331
333
|
else {
|
332
|
-
const selectConditions = from.dependOnFields.map(fieldIndex =>
|
334
|
+
const selectConditions = from.dependOnFields.map((fieldIndex) => `params.select.${tsDescriptor.columns[fieldIndex].name}`);
|
333
335
|
if (selectConditions.length > 0) {
|
334
336
|
selectConditions.unshift('params?.select == null');
|
335
337
|
}
|
336
|
-
const whereConditions = from.dependOnFields.map(fieldIndex =>
|
337
|
-
const orderByConditions = ((_a = from.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map(orderBy =>
|
338
|
+
const whereConditions = from.dependOnFields.map((fieldIndex) => `where.${tsDescriptor.columns[fieldIndex].name} != null`);
|
339
|
+
const orderByConditions = ((_a = from.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map((orderBy) => `orderBy['${orderBy}'] != null`)) || [];
|
338
340
|
const allConditions = [...selectConditions, ...whereConditions, ...orderByConditions];
|
339
|
-
const paramValues = from.parameters.map(param =>
|
340
|
-
writer.write(`if (${allConditions.join(
|
341
|
+
const paramValues = from.parameters.map((param) => `params?.params?.${param}`);
|
342
|
+
writer.write(`if (${allConditions.join(`${node_os_1.EOL}\t|| `)})`).block(() => {
|
341
343
|
writer.write(`sql += EOL + \`${from.fragment}\`;`);
|
342
|
-
paramValues.forEach(paramValues => {
|
344
|
+
paramValues.forEach((paramValues) => {
|
343
345
|
writer.writeLine(`paramsValues.push(${paramValues});`);
|
344
346
|
});
|
345
347
|
});
|
346
348
|
}
|
347
349
|
});
|
348
|
-
writer.writeLine(
|
349
|
-
(_e = tsDescriptor.dynamicQuery2) === null || _e === void 0 ? void 0 : _e.where.forEach(fragment => {
|
350
|
-
const paramValues = fragment.parameters.map(param =>
|
350
|
+
writer.writeLine('sql += EOL + `WHERE 1 = 1`;');
|
351
|
+
(_e = tsDescriptor.dynamicQuery2) === null || _e === void 0 ? void 0 : _e.where.forEach((fragment) => {
|
352
|
+
const paramValues = fragment.parameters.map((param) => `params?.params?.${param} ?? null`);
|
351
353
|
writer.writeLine(`sql += EOL + \`${fragment.fragment}\`;`);
|
352
|
-
paramValues.forEach(paramValues => {
|
354
|
+
paramValues.forEach((paramValues) => {
|
353
355
|
writer.writeLine(`paramsValues.push(${paramValues});`);
|
354
356
|
});
|
355
357
|
});
|
356
|
-
writer.write(
|
358
|
+
writer.write('params?.where?.forEach(condition => ').inlineBlock(() => {
|
357
359
|
var _a;
|
358
|
-
writer.writeLine(
|
360
|
+
writer.writeLine('const where = whereCondition(condition);');
|
359
361
|
(_a = tsDescriptor.dynamicQuery2) === null || _a === void 0 ? void 0 : _a.select.forEach((select, index) => {
|
360
362
|
if (select.parameters.length > 0) {
|
361
363
|
writer.write(`if (condition[0] == '${tsDescriptor.columns[index].name}')`).block(() => {
|
362
|
-
select.parameters.forEach(param => {
|
364
|
+
select.parameters.forEach((param) => {
|
363
365
|
writer.writeLine(`paramsValues.push(params?.params?.${param} ?? null);`);
|
364
366
|
});
|
365
367
|
});
|
366
368
|
}
|
367
369
|
});
|
368
|
-
writer.write(
|
370
|
+
writer.write('if (where?.hasValue)').block(() => {
|
369
371
|
writer.writeLine(`sql += EOL + 'AND ' + where.sql;`);
|
370
|
-
writer.write(
|
372
|
+
writer.write('paramsValues.push(...where.values);');
|
371
373
|
});
|
372
374
|
});
|
373
375
|
writer.write(');').newLine();
|
@@ -377,68 +379,79 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
377
379
|
const limitOffset = (_f = tsDescriptor.dynamicQuery2) === null || _f === void 0 ? void 0 : _f.limitOffset;
|
378
380
|
if (limitOffset) {
|
379
381
|
writer.writeLine(`sql += EOL + \`${limitOffset.fragment}\`;`);
|
380
|
-
limitOffset.parameters.forEach(param => {
|
382
|
+
limitOffset.parameters.forEach((param) => {
|
381
383
|
writer.writeLine(`paramsValues.push(params?.params?.${param} ?? null);`);
|
382
384
|
});
|
383
385
|
}
|
384
|
-
if (client
|
386
|
+
if (client === 'better-sqlite3') {
|
385
387
|
writer.write('return db.prepare(sql)').newLine();
|
386
388
|
writer.indent().write('.raw(true)').newLine();
|
387
|
-
writer.indent().write(
|
388
|
-
writer
|
389
|
+
writer.indent().write('.all(paramsValues)').newLine();
|
390
|
+
writer
|
391
|
+
.indent()
|
392
|
+
.write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
|
393
|
+
}
|
394
|
+
if (client === 'bun:sqlite') {
|
395
|
+
writer.write('return db.prepare(sql)').newLine();
|
396
|
+
writer.indent().write('.values(paramsValues)').newLine();
|
397
|
+
writer
|
398
|
+
.indent()
|
399
|
+
.write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
|
389
400
|
}
|
390
|
-
if (client
|
401
|
+
if (client === 'libsql') {
|
391
402
|
writer.write('return client.execute({ sql, args: paramsValues })').newLine();
|
392
403
|
writer.indent().write('.then(res => res.rows)').newLine();
|
393
|
-
writer
|
404
|
+
writer
|
405
|
+
.indent()
|
406
|
+
.write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
|
394
407
|
}
|
395
408
|
});
|
396
409
|
writer.blankLine();
|
397
410
|
writer.write(`function mapArrayTo${resultTypeName}(data: any, select?: ${selectColumnsTypeName})`).block(() => {
|
398
411
|
writer.writeLine(`const result = {} as ${resultTypeName};`);
|
399
|
-
writer.writeLine(
|
412
|
+
writer.writeLine('let rowIndex = -1;');
|
400
413
|
tsDescriptor.columns.forEach((tsField) => {
|
401
414
|
writer.write(`if (select == null || select.${tsField.name})`).block(() => {
|
402
|
-
writer.writeLine(
|
415
|
+
writer.writeLine('rowIndex++;');
|
403
416
|
writer.writeLine(`result.${tsField.name} = ${toDriver('data[rowIndex]', tsField)};`);
|
404
417
|
});
|
405
418
|
});
|
406
419
|
writer.write('return result;');
|
407
420
|
});
|
408
421
|
writer.blankLine();
|
409
|
-
writer.write(
|
422
|
+
writer.write('function appendSelect(sql: string, selectField: string)').block(() => {
|
410
423
|
writer.write(`if (sql == 'SELECT')`).block(() => {
|
411
|
-
writer.writeLine(
|
424
|
+
writer.writeLine('return sql + EOL + selectField;');
|
412
425
|
});
|
413
|
-
writer.write(
|
426
|
+
writer.write('else').block(() => {
|
414
427
|
writer.writeLine(`return sql + ', ' + EOL + selectField;`);
|
415
428
|
});
|
416
429
|
});
|
417
430
|
writer.blankLine();
|
418
431
|
writer.write(`function whereConditionsToObject(whereConditions?: ${whereTypeName}[])`).block(() => {
|
419
|
-
writer.writeLine(
|
420
|
-
writer.write(
|
421
|
-
writer.writeLine(
|
422
|
-
writer.write(
|
423
|
-
writer.writeLine(
|
432
|
+
writer.writeLine('const obj = {} as any;');
|
433
|
+
writer.write('whereConditions?.forEach(condition => ').inlineBlock(() => {
|
434
|
+
writer.writeLine('const where = whereCondition(condition);');
|
435
|
+
writer.write('if (where?.hasValue) ').block(() => {
|
436
|
+
writer.writeLine('obj[condition[0]] = true;');
|
424
437
|
});
|
425
438
|
});
|
426
439
|
writer.write(');');
|
427
|
-
writer.writeLine(
|
440
|
+
writer.writeLine('return obj;');
|
428
441
|
});
|
429
442
|
if (orderByField != null) {
|
430
443
|
writer.blankLine();
|
431
444
|
writer.write(`function orderByToObject(orderBy: ${dynamicParamsTypeName}['orderBy'])`).block(() => {
|
432
|
-
writer.writeLine(
|
433
|
-
writer.write(
|
434
|
-
writer.writeLine(
|
445
|
+
writer.writeLine('const obj = {} as any;');
|
446
|
+
writer.write('orderBy?.forEach(order => ').inlineBlock(() => {
|
447
|
+
writer.writeLine('obj[order[0]] = true;');
|
435
448
|
});
|
436
449
|
writer.write(');');
|
437
|
-
writer.writeLine(
|
450
|
+
writer.writeLine('return obj;');
|
438
451
|
});
|
439
452
|
}
|
440
453
|
writer.blankLine();
|
441
|
-
writer.write(
|
454
|
+
writer.write('type WhereConditionResult = ').block(() => {
|
442
455
|
writer.writeLine('sql: string;');
|
443
456
|
writer.writeLine('hasValue: boolean;');
|
444
457
|
writer.writeLine('values: any[];');
|
@@ -451,8 +464,8 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
451
464
|
writer.blankLine();
|
452
465
|
if ((0, code_generator_1.hasStringColumn)(tsDescriptor.columns)) {
|
453
466
|
writer.write(`if (operator == 'LIKE') `).block(() => {
|
454
|
-
writer.write(
|
455
|
-
writer.writeLine(
|
467
|
+
writer.write('return ').block(() => {
|
468
|
+
writer.writeLine("sql: `${selectFragment} LIKE concat('%', ?, '%')`,");
|
456
469
|
writer.writeLine('hasValue: condition[2] != null,');
|
457
470
|
writer.writeLine('values: [condition[2]]');
|
458
471
|
});
|
@@ -460,17 +473,17 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
460
473
|
}
|
461
474
|
writer.write(`if (operator == 'BETWEEN') `).block(() => {
|
462
475
|
if ((0, code_generator_1.hasDateColumn)(tsDescriptor.columns)) {
|
463
|
-
writer.writeLine(
|
464
|
-
writer.writeLine(
|
476
|
+
writer.writeLine('const value1 = isDate(condition[2]) ? condition[2]?.toISOString() : condition[2];');
|
477
|
+
writer.writeLine('const value2 = isDate(condition[3]) ? condition[3]?.toISOString() : condition[3];');
|
465
478
|
writer.writeLine(`const param = isDate(condition[2]) && isDate(condition[3]) ? 'date(?)' : '?';`);
|
466
|
-
writer.write(
|
479
|
+
writer.write('return ').block(() => {
|
467
480
|
writer.writeLine('sql: `${selectFragment} BETWEEN ${param} AND ${param}`,');
|
468
481
|
writer.writeLine('hasValue: value1 != null && value2 != null,');
|
469
482
|
writer.writeLine('values: [value1, value2]');
|
470
483
|
});
|
471
484
|
}
|
472
485
|
else {
|
473
|
-
writer.write(
|
486
|
+
writer.write('return ').block(() => {
|
474
487
|
writer.writeLine('sql: `${selectFragment} BETWEEN ? AND ?`,');
|
475
488
|
writer.writeLine('hasValue: condition[2] != null && condition[3] != null,');
|
476
489
|
writer.writeLine('values: [condition[2], condition[3]]');
|
@@ -479,32 +492,32 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
479
492
|
});
|
480
493
|
writer.write(`if (operator == 'IN' || operator == 'NOT IN') `).block(() => {
|
481
494
|
if ((0, code_generator_1.hasDateColumn)(tsDescriptor.columns)) {
|
482
|
-
writer.write(
|
483
|
-
writer.writeLine(
|
495
|
+
writer.write('return ').block(() => {
|
496
|
+
writer.writeLine("sql: `${selectFragment} ${operator} (${condition[2]?.map(value => isDate(value) ? 'date(?)' : '?').join(', ')})`,");
|
484
497
|
writer.writeLine('hasValue: condition[2] != null && condition[2].length > 0,');
|
485
498
|
writer.writeLine('values: condition[2].map(value => isDate(value) ? value.toISOString() : value)');
|
486
499
|
});
|
487
500
|
}
|
488
501
|
else {
|
489
|
-
writer.write(
|
490
|
-
writer.writeLine(
|
502
|
+
writer.write('return ').block(() => {
|
503
|
+
writer.writeLine("sql: `${selectFragment} ${operator} (${condition[2]?.map(_ => '?').join(', ')})`,");
|
491
504
|
writer.writeLine('hasValue: condition[2] != null && condition[2].length > 0,');
|
492
505
|
writer.writeLine('values: condition[2]');
|
493
506
|
});
|
494
507
|
}
|
495
508
|
});
|
496
|
-
writer.write(
|
509
|
+
writer.write('if (NumericOperatorList.includes(operator)) ').block(() => {
|
497
510
|
if ((0, code_generator_1.hasDateColumn)(tsDescriptor.columns)) {
|
498
|
-
writer.writeLine(
|
511
|
+
writer.writeLine('const value = isDate(condition[2]) ? condition[2]?.toISOString() : condition[2];');
|
499
512
|
writer.writeLine(`const param = isDate(condition[2]) ? 'date(?)' : '?';`);
|
500
|
-
writer.write(
|
513
|
+
writer.write('return ').block(() => {
|
501
514
|
writer.writeLine('sql: `${selectFragment} ${operator} ${param}`,');
|
502
515
|
writer.writeLine('hasValue: value != null,');
|
503
516
|
writer.writeLine('values: [value]');
|
504
517
|
});
|
505
518
|
}
|
506
519
|
else {
|
507
|
-
writer.write(
|
520
|
+
writer.write('return ').block(() => {
|
508
521
|
writer.writeLine('sql: `${selectFragment} ${operator} ?`,');
|
509
522
|
writer.writeLine('hasValue: condition[2] != null,');
|
510
523
|
writer.writeLine('values: [condition[2]]');
|
@@ -514,8 +527,8 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
514
527
|
});
|
515
528
|
if ((0, code_generator_1.hasDateColumn)(tsDescriptor.columns)) {
|
516
529
|
writer.blankLine();
|
517
|
-
writer.write(
|
518
|
-
writer.writeLine(
|
530
|
+
writer.write('function isDate(value: any): value is Date').block(() => {
|
531
|
+
writer.writeLine('return value instanceof Date;');
|
519
532
|
});
|
520
533
|
}
|
521
534
|
}
|
@@ -523,7 +536,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
523
536
|
if (uniqueUpdateParams.length > 0) {
|
524
537
|
writer.blankLine();
|
525
538
|
writer.write(`export type ${dataTypeName} =`).block(() => {
|
526
|
-
uniqueUpdateParams.forEach(field => {
|
539
|
+
uniqueUpdateParams.forEach((field) => {
|
527
540
|
const optionalOp = field.optional ? '?' : '';
|
528
541
|
const orNull = field.notNull ? '' : ' | null';
|
529
542
|
writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${orNull};`);
|
@@ -545,7 +558,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
545
558
|
}
|
546
559
|
writer.blankLine();
|
547
560
|
writer.write(`export type ${resultTypeName} =`).block(() => {
|
548
|
-
tsDescriptor.columns.forEach(field => {
|
561
|
+
tsDescriptor.columns.forEach((field) => {
|
549
562
|
const optionalOp = field.notNull ? '' : '?';
|
550
563
|
writer.writeLine(`${field.name}${optionalOp}: ${field.tsType};`);
|
551
564
|
});
|
@@ -553,21 +566,21 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
553
566
|
writer.blankLine();
|
554
567
|
}
|
555
568
|
if (isCrud) {
|
556
|
-
const crudFunction = client
|
569
|
+
const crudFunction = client === 'libsql'
|
557
570
|
? `async function ${camelCaseName}(${functionArguments}): Promise<${returnType}>`
|
558
571
|
: `function ${camelCaseName}(${functionArguments}): ${returnType}`;
|
559
572
|
writer.write(`export ${crudFunction}`).block(() => {
|
560
573
|
const idColumn = tsDescriptor.parameters[0].name;
|
561
|
-
writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
|
574
|
+
writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, client == 'bun:sqlite' ? queryParamsWithoutBrackets : queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
|
562
575
|
});
|
563
576
|
}
|
564
|
-
if (tsDescriptor.dynamicQuery2 == null && !isCrud && (queryType
|
565
|
-
if (client
|
577
|
+
if (tsDescriptor.dynamicQuery2 == null && !isCrud && (queryType === 'Select' || (queryType === 'Insert' && tsDescriptor.returning))) {
|
578
|
+
if (client === 'better-sqlite3') {
|
566
579
|
writer.write(`export function ${camelCaseName}(${functionArguments}): ${returnType}`).block(() => {
|
567
580
|
const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
|
568
581
|
const sqlSplit = processedSql.split('\n');
|
569
582
|
writer.write('const sql = `').newLine();
|
570
|
-
sqlSplit.forEach(sqlLine => {
|
583
|
+
sqlSplit.forEach((sqlLine) => {
|
571
584
|
writer.indent().write(sqlLine).newLine();
|
572
585
|
});
|
573
586
|
writer.indent().write('`').newLine();
|
@@ -577,19 +590,33 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
577
590
|
writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
|
578
591
|
});
|
579
592
|
}
|
580
|
-
if (
|
593
|
+
if (client === 'bun:sqlite') {
|
594
|
+
writer.write(`export function ${camelCaseName}(${functionArguments}): ${returnType}`).block(() => {
|
595
|
+
const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
|
596
|
+
const sqlSplit = processedSql.split('\n');
|
597
|
+
writer.write('const sql = `').newLine();
|
598
|
+
sqlSplit.forEach((sqlLine) => {
|
599
|
+
writer.indent().write(sqlLine).newLine();
|
600
|
+
});
|
601
|
+
writer.indent().write('`').newLine();
|
602
|
+
writer.write('return db.prepare(sql)').newLine();
|
603
|
+
writer.indent().write(`.values(${queryParamsWithoutBrackets})`).newLine();
|
604
|
+
writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
|
605
|
+
});
|
606
|
+
}
|
607
|
+
if (!isCrud && client === 'libsql') {
|
581
608
|
writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${returnType}>`).block(() => {
|
582
609
|
const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
|
583
610
|
const sqlSplit = processedSql.split('\n');
|
584
611
|
writer.write('const sql = `').newLine();
|
585
|
-
sqlSplit.forEach(sqlLine => {
|
612
|
+
sqlSplit.forEach((sqlLine) => {
|
586
613
|
writer.indent().write(sqlLine).newLine();
|
587
614
|
});
|
588
615
|
writer.indent().write('`').newLine();
|
589
|
-
const executeParams = queryParams
|
616
|
+
const executeParams = queryParams !== '' ? `{ sql, args: ${queryParams} }` : 'sql';
|
590
617
|
writer.write(`return client.execute(${executeParams})`).newLine();
|
591
|
-
if (queryType
|
592
|
-
writer.indent().write(
|
618
|
+
if (queryType === 'Select') {
|
619
|
+
writer.indent().write('.then(res => res.rows)').newLine();
|
593
620
|
if (tsDescriptor.multipleRowsResult) {
|
594
621
|
writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
|
595
622
|
}
|
@@ -597,9 +624,9 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
597
624
|
writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
|
598
625
|
}
|
599
626
|
}
|
600
|
-
if (queryType
|
627
|
+
if (queryType === 'Insert') {
|
601
628
|
if (tsDescriptor.returning) {
|
602
|
-
writer.indent().write(
|
629
|
+
writer.indent().write('.then(res => res.rows)').newLine();
|
603
630
|
writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
|
604
631
|
}
|
605
632
|
else {
|
@@ -609,27 +636,28 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
609
636
|
});
|
610
637
|
}
|
611
638
|
}
|
612
|
-
if (!isCrud && (queryType
|
613
|
-
if (client
|
639
|
+
if (!isCrud && (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !tsDescriptor.returning))) {
|
640
|
+
if (client === 'better-sqlite3' || client === 'bun:sqlite') {
|
614
641
|
writer.write(`export function ${camelCaseName}(${functionArguments}): ${resultTypeName}`).block(() => {
|
615
|
-
|
642
|
+
const params = client === 'better-sqlite3' ? queryParams : queryParamsWithoutBrackets;
|
643
|
+
writeExecuteBlock(sql, params, resultTypeName, writer);
|
616
644
|
});
|
617
645
|
}
|
618
|
-
if (client
|
646
|
+
if (client === 'libsql') {
|
619
647
|
writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${resultTypeName}>`).block(() => {
|
620
648
|
const sqlSplit = sql.split('\n');
|
621
649
|
writer.write('const sql = `').newLine();
|
622
|
-
sqlSplit.forEach(sqlLine => {
|
650
|
+
sqlSplit.forEach((sqlLine) => {
|
623
651
|
writer.indent().write(sqlLine).newLine();
|
624
652
|
});
|
625
653
|
writer.indent().write('`').newLine();
|
626
|
-
const executeParams = queryParams
|
654
|
+
const executeParams = queryParams !== '' ? `{ sql, args: ${queryParams} }` : 'sql';
|
627
655
|
writer.write(`return client.execute(${executeParams})`).newLine();
|
628
656
|
writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`);
|
629
657
|
});
|
630
658
|
}
|
631
659
|
}
|
632
|
-
if ((queryType
|
660
|
+
if ((queryType === 'Select' || tsDescriptor.returning) && tsDescriptor.dynamicQuery2 == null) {
|
633
661
|
writer.blankLine();
|
634
662
|
writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
|
635
663
|
writer.write(`const result: ${resultTypeName} = `).block(() => {
|
@@ -641,7 +669,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
641
669
|
writer.writeLine('return result;');
|
642
670
|
});
|
643
671
|
}
|
644
|
-
else if (client
|
672
|
+
else if (client === 'libsql' && !tsDescriptor.returning && tsDescriptor.dynamicQuery2 == null) {
|
645
673
|
writer.blankLine();
|
646
674
|
writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
|
647
675
|
writer.write(`const result: ${resultTypeName} = `).block(() => {
|
@@ -657,7 +685,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
657
685
|
const orderByType = tsDescriptor.dynamicQuery2 == null ? paramsTypeName : dynamicParamsTypeName;
|
658
686
|
if (orderByField != null) {
|
659
687
|
writer.blankLine();
|
660
|
-
writer.write(
|
688
|
+
writer.write('const orderByFragments = ').inlineBlock(() => {
|
661
689
|
var _a;
|
662
690
|
(_a = tsDescriptor.orderByColumns) === null || _a === void 0 ? void 0 : _a.forEach((col) => {
|
663
691
|
writer.writeLine(`'${col}': \`${col}\`,`);
|
@@ -678,11 +706,11 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
678
706
|
const relationType = (0, code_generator_1.generateRelationType)(capitalizedName, relation.name);
|
679
707
|
writer.blankLine();
|
680
708
|
writer.write(`export type ${relationType} = `).block(() => {
|
681
|
-
const uniqueNameFields = (0, code_generator_1.renameInvalidNames)(relation.fields.map(f => f.name));
|
709
|
+
const uniqueNameFields = (0, code_generator_1.renameInvalidNames)(relation.fields.map((f) => f.name));
|
682
710
|
relation.fields.forEach((field, index) => {
|
683
711
|
writer.writeLine(`${uniqueNameFields[index]}: ${field.tsType};`);
|
684
712
|
});
|
685
|
-
relation.relations.forEach(field => {
|
713
|
+
relation.relations.forEach((field) => {
|
686
714
|
const nestedRelationType = (0, code_generator_1.generateRelationType)(capitalizedName, field.tsType);
|
687
715
|
const nullableOperator = field.notNull ? '' : '?';
|
688
716
|
writer.writeLine(`${field.name}${nullableOperator}: ${nestedRelationType};`);
|
@@ -692,8 +720,8 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
692
720
|
writer.blankLine();
|
693
721
|
relations.forEach((relation, index) => {
|
694
722
|
const relationType = (0, code_generator_1.generateRelationType)(capitalizedName, relation.name);
|
695
|
-
if (index
|
696
|
-
if (client == 'sqlite') {
|
723
|
+
if (index === 0) {
|
724
|
+
if (client === 'better-sqlite3' || client == 'bun:sqlite') {
|
697
725
|
writer.write(`export function ${camelCaseName}Nested(${functionArguments}): ${relationType}[]`).block(() => {
|
698
726
|
const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
|
699
727
|
writer.writeLine(`const selectResult = ${camelCaseName}(db${params});`);
|
@@ -703,7 +731,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
703
731
|
writer.writeLine(`return collect${relationType}(selectResult);`);
|
704
732
|
});
|
705
733
|
}
|
706
|
-
else if (client
|
734
|
+
else if (client === 'libsql') {
|
707
735
|
writer.write(`export async function ${camelCaseName}Nested(${functionArguments}): Promise<${relationType}[]>`).block(() => {
|
708
736
|
const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
|
709
737
|
writer.writeLine(`const selectResult = await ${camelCaseName}(client${params});`);
|
@@ -718,11 +746,14 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
718
746
|
});
|
719
747
|
writer.blankLine();
|
720
748
|
writer.write('const groupBy = <T, Q>(array: T[], predicate: (value: T, index: number, array: T[]) => Q) =>').block(() => {
|
721
|
-
writer
|
749
|
+
writer
|
750
|
+
.write('return array.reduce((map, value, index, array) => ')
|
751
|
+
.inlineBlock(() => {
|
722
752
|
writer.writeLine('const key = predicate(value, index, array);');
|
723
753
|
writer.writeLine('map.get(key)?.push(value) ?? map.set(key, [value]);');
|
724
754
|
writer.writeLine('return map;');
|
725
|
-
})
|
755
|
+
})
|
756
|
+
.write(', new Map<Q, T[]>());');
|
726
757
|
});
|
727
758
|
}
|
728
759
|
return writer.toString();
|
@@ -730,7 +761,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
|
|
730
761
|
function writeExecuteBlock(sql, queryParams, resultTypeName, writer) {
|
731
762
|
const sqlSplit = sql.split('\n');
|
732
763
|
writer.write('const sql = `').newLine();
|
733
|
-
sqlSplit.forEach(sqlLine => {
|
764
|
+
sqlSplit.forEach((sqlLine) => {
|
734
765
|
writer.indent().write(sqlLine).newLine();
|
735
766
|
});
|
736
767
|
writer.indent().write('`').newLine();
|
@@ -739,13 +770,13 @@ function writeExecuteBlock(sql, queryParams, resultTypeName, writer) {
|
|
739
770
|
}
|
740
771
|
function writeExecuteCrudBlock(client, queryType, tableName, columns, idColumn, queryParams, paramTypeName, dataTypeName, resultTypeName, writer) {
|
741
772
|
switch (queryType) {
|
742
|
-
case
|
773
|
+
case 'Select':
|
743
774
|
return writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryParams, resultTypeName, writer);
|
744
|
-
case
|
775
|
+
case 'Insert':
|
745
776
|
return writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTypeName, writer);
|
746
|
-
case
|
777
|
+
case 'Update':
|
747
778
|
return writeExecuteUpdateCrudBlock(client, tableName, idColumn, dataTypeName, resultTypeName, writer);
|
748
|
-
case
|
779
|
+
case 'Delete':
|
749
780
|
return writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, resultTypeName, writer);
|
750
781
|
}
|
751
782
|
}
|
@@ -759,41 +790,50 @@ function writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryP
|
|
759
790
|
writer.indent().write(`FROM ${tableName}`).newLine();
|
760
791
|
writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
|
761
792
|
writer.blankLine();
|
762
|
-
if (client
|
793
|
+
if (client === 'better-sqlite3') {
|
763
794
|
writer.write('return db.prepare(sql)').newLine();
|
764
795
|
writer.indent().write('.raw(true)').newLine();
|
765
796
|
writer.indent().write(`.all(${queryParams})`).newLine();
|
766
797
|
writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))[0];`);
|
767
798
|
}
|
799
|
+
else if (client === 'bun:sqlite') {
|
800
|
+
writer.write('return db.prepare(sql)').newLine();
|
801
|
+
writer.indent().write(`.values(${queryParams})`).newLine();
|
802
|
+
writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))[0];`);
|
803
|
+
}
|
768
804
|
else {
|
769
805
|
writer.write(`return client.execute({ sql, args: ${queryParams} })`).newLine();
|
770
|
-
writer.indent().write(
|
806
|
+
writer.indent().write('.then(res => res.rows)').newLine();
|
771
807
|
writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
|
772
808
|
}
|
773
809
|
}
|
774
810
|
function writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTypeName, writer) {
|
775
811
|
writer.blankLine();
|
776
812
|
writer.writeLine(`const keys = Object.keys(params) as Array<keyof ${paramTypeName}>;`);
|
777
|
-
writer.writeLine(
|
778
|
-
writer.writeLine(
|
813
|
+
writer.writeLine('const columns = keys.filter(key => params[key] !== undefined);');
|
814
|
+
writer.writeLine('const values = columns.map(col => params[col]!);');
|
779
815
|
writer.blankLine();
|
780
816
|
writer.writeLine('const sql = columns.length == 0');
|
781
817
|
writer.indent().write(`? \`INSERT INTO ${tableName} DEFAULT VALUES\``).newLine();
|
782
818
|
writer.indent().write(`: \`INSERT INTO ${tableName}(\${columns.join(',')}) VALUES(\${columns.map(_ => '?').join(',')})\``).newLine();
|
783
819
|
writer.blankLine();
|
784
|
-
if (client
|
820
|
+
if (client === 'better-sqlite3') {
|
785
821
|
writer.write('return db.prepare(sql)').newLine();
|
786
822
|
writer.indent().write(`.run(values) as ${resultTypeName};`);
|
787
823
|
}
|
824
|
+
else if (client == 'bun:sqlite') {
|
825
|
+
writer.write('return db.prepare(sql)').newLine();
|
826
|
+
writer.indent().write(`.run(...values) as ${resultTypeName};`);
|
827
|
+
}
|
788
828
|
else {
|
789
|
-
writer.write(
|
829
|
+
writer.write('return client.execute({ sql, args: values })').newLine();
|
790
830
|
writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
|
791
831
|
}
|
792
832
|
}
|
793
833
|
function writeExecuteUpdateCrudBlock(client, tableName, idColumn, paramTypeName, resultTypeName, writer) {
|
794
834
|
writer.blankLine();
|
795
835
|
writer.writeLine(`const keys = Object.keys(data) as Array<keyof ${paramTypeName}>;`);
|
796
|
-
writer.writeLine(
|
836
|
+
writer.writeLine('const columns = keys.filter(key => data[key] !== undefined);');
|
797
837
|
writer.writeLine(`const values = columns.map(col => data[col]!).concat(params.${idColumn});`);
|
798
838
|
writer.blankLine();
|
799
839
|
writer.writeLine('const sql = `');
|
@@ -801,12 +841,16 @@ function writeExecuteUpdateCrudBlock(client, tableName, idColumn, paramTypeName,
|
|
801
841
|
writer.indent().write(`SET \${columns.map(col => \`\${col} = ?\`).join(', ')}`).newLine();
|
802
842
|
writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
|
803
843
|
writer.blankLine();
|
804
|
-
if (client
|
844
|
+
if (client === 'better-sqlite3') {
|
805
845
|
writer.write('return db.prepare(sql)').newLine();
|
806
846
|
writer.indent().write(`.run(values) as ${resultTypeName};`);
|
807
847
|
}
|
848
|
+
else if (client === 'bun:sqlite') {
|
849
|
+
writer.write('return db.prepare(sql)').newLine();
|
850
|
+
writer.indent().write(`.run(...values) as ${resultTypeName};`);
|
851
|
+
}
|
808
852
|
else {
|
809
|
-
writer.write(
|
853
|
+
writer.write('return client.execute({ sql, args: values })').newLine();
|
810
854
|
writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
|
811
855
|
}
|
812
856
|
}
|
@@ -816,7 +860,11 @@ function writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, re
|
|
816
860
|
writer.indent().write(`FROM ${tableName}`).newLine();
|
817
861
|
writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
|
818
862
|
writer.blankLine();
|
819
|
-
if (client
|
863
|
+
if (client === 'better-sqlite3') {
|
864
|
+
writer.write('return db.prepare(sql)').newLine();
|
865
|
+
writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`).newLine();
|
866
|
+
}
|
867
|
+
else if (client === 'bun:sqlite') {
|
820
868
|
writer.write('return db.prepare(sql)').newLine();
|
821
869
|
writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`).newLine();
|
822
870
|
}
|
@@ -826,22 +874,20 @@ function writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, re
|
|
826
874
|
}
|
827
875
|
}
|
828
876
|
function toDriver(variableData, param) {
|
829
|
-
if (param.tsType
|
877
|
+
if (param.tsType === 'Date') {
|
830
878
|
if (param.notNull) {
|
831
879
|
return `new Date(${variableData})`;
|
832
880
|
}
|
833
|
-
|
834
|
-
return `${variableData} != null ? new Date(${variableData}) : ${variableData}`;
|
835
|
-
}
|
881
|
+
return `${variableData} != null ? new Date(${variableData}) : ${variableData}`;
|
836
882
|
}
|
837
883
|
return variableData;
|
838
884
|
}
|
839
885
|
function fromDriver(variableName, param) {
|
840
886
|
var _a;
|
841
|
-
if (param.tsType
|
887
|
+
if (param.tsType === 'Date') {
|
842
888
|
return `${variableName}.${param.name}?.toISOString()`;
|
843
889
|
}
|
844
|
-
if ((_a = param.tsType) === null || _a === void 0 ? void 0 : _a.endsWith(
|
890
|
+
if ((_a = param.tsType) === null || _a === void 0 ? void 0 : _a.endsWith('[]')) {
|
845
891
|
return `...${variableName}.${param.name}`;
|
846
892
|
}
|
847
893
|
return `${variableName}.${param.name}`;
|
@@ -853,19 +899,22 @@ function writeCollectFunction(writer, relation, columns, capitalizedName, result
|
|
853
899
|
writer.write(`function ${collectFunctionName}(selectResult: ${resultTypeName}[]): ${relationType}[]`).block(() => {
|
854
900
|
const groupBy = columns[relation.groupIndex].name;
|
855
901
|
writer.writeLine(`const grouped = groupBy(selectResult.filter(r => r.${groupBy} != null), r => r.${groupBy});`);
|
856
|
-
writer
|
902
|
+
writer
|
903
|
+
.write('return [...grouped.values()].map(row => (')
|
904
|
+
.inlineBlock(() => {
|
857
905
|
relation.fields.forEach((field, index) => {
|
858
|
-
const uniqueNameFields = (0, code_generator_1.renameInvalidNames)(relation.fields.map(f => f.name));
|
906
|
+
const uniqueNameFields = (0, code_generator_1.renameInvalidNames)(relation.fields.map((f) => f.name));
|
859
907
|
const separator = ',';
|
860
908
|
const fieldName = columns[field.index].name;
|
861
|
-
writer.writeLine(`${uniqueNameFields[index]}: row[0].${fieldName}
|
909
|
+
writer.writeLine(`${uniqueNameFields[index]}: row[0].${fieldName}!${separator}`);
|
862
910
|
});
|
863
|
-
relation.relations.forEach(fieldRelation => {
|
911
|
+
relation.relations.forEach((fieldRelation) => {
|
864
912
|
const relationType = (0, code_generator_1.generateRelationType)(capitalizedName, fieldRelation.name);
|
865
913
|
const cardinality = fieldRelation.list ? '' : '[0]';
|
866
914
|
writer.writeLine(`${fieldRelation.name}: collect${relationType}(row)${cardinality},`);
|
867
915
|
});
|
868
|
-
})
|
916
|
+
})
|
917
|
+
.write('))');
|
869
918
|
});
|
870
919
|
}
|
871
920
|
//# sourceMappingURL=code-generator.js.map
|