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.
Files changed (110) hide show
  1. package/README.md +2 -3
  2. package/cli.js +76 -78
  3. package/cli.js.map +1 -1
  4. package/code-generator.d.ts +7 -7
  5. package/code-generator.d.ts.map +1 -1
  6. package/code-generator.js +193 -194
  7. package/code-generator.js.map +1 -1
  8. package/describe-dynamic-query.d.ts +1 -1
  9. package/describe-dynamic-query.d.ts.map +1 -1
  10. package/describe-dynamic-query.js +47 -42
  11. package/describe-dynamic-query.js.map +1 -1
  12. package/describe-nested-query.d.ts +2 -2
  13. package/describe-nested-query.d.ts.map +1 -1
  14. package/describe-nested-query.js +28 -25
  15. package/describe-nested-query.js.map +1 -1
  16. package/describe-query.d.ts +4 -4
  17. package/describe-query.d.ts.map +1 -1
  18. package/describe-query.js +24 -25
  19. package/describe-query.js.map +1 -1
  20. package/drivers/libsql.d.ts +2 -2
  21. package/drivers/libsql.d.ts.map +1 -1
  22. package/drivers/libsql.js +4 -5
  23. package/drivers/libsql.js.map +1 -1
  24. package/mysql-mapping.d.ts +1 -1
  25. package/mysql-mapping.d.ts.map +1 -1
  26. package/mysql-mapping.js +13 -13
  27. package/mysql-mapping.js.map +1 -1
  28. package/mysql-query-analyzer/collect-constraints.d.ts +4 -4
  29. package/mysql-query-analyzer/collect-constraints.d.ts.map +1 -1
  30. package/mysql-query-analyzer/collect-constraints.js +29 -31
  31. package/mysql-query-analyzer/collect-constraints.js.map +1 -1
  32. package/mysql-query-analyzer/infer-column-nullability.d.ts +2 -2
  33. package/mysql-query-analyzer/infer-column-nullability.d.ts.map +1 -1
  34. package/mysql-query-analyzer/infer-column-nullability.js +61 -63
  35. package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
  36. package/mysql-query-analyzer/infer-param-nullability.d.ts +2 -2
  37. package/mysql-query-analyzer/infer-param-nullability.d.ts.map +1 -1
  38. package/mysql-query-analyzer/infer-param-nullability.js +13 -14
  39. package/mysql-query-analyzer/infer-param-nullability.js.map +1 -1
  40. package/mysql-query-analyzer/parse.d.ts +2 -2
  41. package/mysql-query-analyzer/parse.d.ts.map +1 -1
  42. package/mysql-query-analyzer/parse.js +42 -40
  43. package/mysql-query-analyzer/parse.js.map +1 -1
  44. package/mysql-query-analyzer/select-columns.d.ts +4 -4
  45. package/mysql-query-analyzer/select-columns.d.ts.map +1 -1
  46. package/mysql-query-analyzer/select-columns.js +70 -65
  47. package/mysql-query-analyzer/select-columns.js.map +1 -1
  48. package/mysql-query-analyzer/traverse.d.ts +4 -4
  49. package/mysql-query-analyzer/traverse.d.ts.map +1 -1
  50. package/mysql-query-analyzer/traverse.js +211 -188
  51. package/mysql-query-analyzer/traverse.js.map +1 -1
  52. package/mysql-query-analyzer/types.d.ts +5 -5
  53. package/mysql-query-analyzer/types.d.ts.map +1 -1
  54. package/mysql-query-analyzer/unify.d.ts +2 -2
  55. package/mysql-query-analyzer/unify.d.ts.map +1 -1
  56. package/mysql-query-analyzer/unify.js +485 -487
  57. package/mysql-query-analyzer/unify.js.map +1 -1
  58. package/mysql-query-analyzer/util.d.ts.map +1 -1
  59. package/mysql-query-analyzer/util.js +4 -6
  60. package/mysql-query-analyzer/util.js.map +1 -1
  61. package/mysql-query-analyzer/verify-multiple-result.d.ts +2 -2
  62. package/mysql-query-analyzer/verify-multiple-result.d.ts.map +1 -1
  63. package/mysql-query-analyzer/verify-multiple-result.js +9 -9
  64. package/mysql-query-analyzer/verify-multiple-result.js.map +1 -1
  65. package/package.json +46 -44
  66. package/queryExectutor.d.ts +4 -4
  67. package/queryExectutor.d.ts.map +1 -1
  68. package/queryExectutor.js +48 -51
  69. package/queryExectutor.js.map +1 -1
  70. package/sql-generator.d.ts +2 -2
  71. package/sql-generator.d.ts.map +1 -1
  72. package/sql-generator.js +30 -29
  73. package/sql-generator.js.map +1 -1
  74. package/sqlite-query-analyzer/code-generator.d.ts +6 -6
  75. package/sqlite-query-analyzer/code-generator.d.ts.map +1 -1
  76. package/sqlite-query-analyzer/code-generator.js +226 -177
  77. package/sqlite-query-analyzer/code-generator.js.map +1 -1
  78. package/sqlite-query-analyzer/parser.d.ts +4 -4
  79. package/sqlite-query-analyzer/parser.d.ts.map +1 -1
  80. package/sqlite-query-analyzer/parser.js +17 -18
  81. package/sqlite-query-analyzer/parser.js.map +1 -1
  82. package/sqlite-query-analyzer/query-executor.d.ts +6 -6
  83. package/sqlite-query-analyzer/query-executor.d.ts.map +1 -1
  84. package/sqlite-query-analyzer/query-executor.js +42 -33
  85. package/sqlite-query-analyzer/query-executor.js.map +1 -1
  86. package/sqlite-query-analyzer/replace-list-params.d.ts +1 -1
  87. package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
  88. package/sqlite-query-analyzer/replace-list-params.js +5 -5
  89. package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
  90. package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts +4 -4
  91. package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts.map +1 -1
  92. package/sqlite-query-analyzer/sqlite-describe-nested-query.js +19 -17
  93. package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
  94. package/sqlite-query-analyzer/traverse.d.ts +5 -5
  95. package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
  96. package/sqlite-query-analyzer/traverse.js +185 -155
  97. package/sqlite-query-analyzer/traverse.js.map +1 -1
  98. package/ts-dynamic-query-descriptor.d.ts +1 -1
  99. package/ts-dynamic-query-descriptor.d.ts.map +1 -1
  100. package/ts-dynamic-query-descriptor.js +7 -8
  101. package/ts-dynamic-query-descriptor.js.map +1 -1
  102. package/ts-nested-descriptor.d.ts +4 -4
  103. package/ts-nested-descriptor.d.ts.map +1 -1
  104. package/ts-nested-descriptor.js +13 -14
  105. package/ts-nested-descriptor.js.map +1 -1
  106. package/types.d.ts +18 -15
  107. package/types.d.ts.map +1 -1
  108. package/util.d.ts.map +1 -1
  109. package/util.js.map +1 -1
  110. 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.generateTsCode = exports.generateCrud = exports.validateAndGenerateCode = void 0;
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 os_1 = require("os");
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, isCrud, client.type);
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 == 'PRI' && col.column_type == 'INTEGER' ? 'AUTOINCREMENT' : col.defaultValue;
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 = 'sqlite', queryType, tableName, dbSchema) {
41
- const columns = dbSchema.filter(col => col.table == tableName);
42
- const columnInfo = columns.map(col => mapToColumnInfo(col, queryType == 'Insert' || queryType == 'Update'));
43
- const keys = columns.filter(col => col.columnKey == 'PRI');
44
- if (keys.length == 0) {
45
- keys.push(...columns.filter(col => col.columnKey == 'UNI'));
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 == 'Insert' ? params : keyColumnInfo,
57
- data: queryType == 'Update' ? params.filter(param => { var _a; return param.name != ((_a = keyColumnInfo[0]) === null || _a === void 0 ? void 0 : _a.name); }) : []
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 "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;
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, client = 'sqlite') {
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 == 'Insert' && !returning) {
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 == 'Update' || queryType == 'Delete') {
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 == 'sqlite' ? 'Uint8Array' : 'ArrayBuffer';
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 + 'Data';
210
- const paramsTypeName = capitalizedName + 'Params';
211
- const resultTypeName = capitalizedName + 'Result';
212
- const dynamicParamsTypeName = capitalizedName + 'DynamicParams';
213
- const selectColumnsTypeName = capitalizedName + 'Select';
214
- const whereTypeName = capitalizedName + 'Where';
215
- const orderByTypeName = capitalizedName + 'OrderBy';
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' ? `db: Database` : 'client: Client | Transaction';
222
- functionArguments += queryType == 'Update' ? `, data: ${dataTypeName}` : '';
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 ? ', params: ' + paramsTypeName : '';
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 == 'Select' ? ' | null' : '';
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
- .concat(tsDescriptor.parameters.map(param => fromDriver('params', param)));
233
- const queryParams = allParameters.length > 0 ? '[' + allParameters.join(', ') + ']' : '';
234
- if (client == 'sqlite') {
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 == 'libsql') {
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(`const selectFragments = `).inlineBlock(() => {
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(`type NumericOperator = typeof NumericOperatorList[number];`);
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 == 'libsql' ? 'async ' : '';
285
- const returnTypeModifier = client == 'libsql' ? `Promise<${returnType}>` : returnType;
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(`const orderBy = orderByToObject(params.orderBy);`);
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 => 'params.select.' + tsDescriptor.columns[fieldIndex].name);
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 => 'where.' + tsDescriptor.columns[fieldIndex].name + ' != null');
303
- const orderByConditions = ((_a = withFragment.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map(orderBy => 'orderBy[\'' + orderBy + '\'] != null')) || [];
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 => 'params?.params?.' + param);
306
- writer.write(`if (${allConditions.join(os_1.EOL + '\t|| ')})`).block(() => {
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 == 0) {
330
+ if (index === 0) {
329
331
  writer.writeLine(`sql += EOL + \`${from.fragment}\`;`);
330
332
  }
331
333
  else {
332
- const selectConditions = from.dependOnFields.map(fieldIndex => 'params.select.' + tsDescriptor.columns[fieldIndex].name);
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 => 'where.' + tsDescriptor.columns[fieldIndex].name + ' != null');
337
- const orderByConditions = ((_a = from.dependOnOrderBy) === null || _a === void 0 ? void 0 : _a.map(orderBy => 'orderBy[\'' + orderBy + '\'] != null')) || [];
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 => 'params?.params?.' + param);
340
- writer.write(`if (${allConditions.join(os_1.EOL + '\t|| ')})`).block(() => {
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(`sql += EOL + \`WHERE 1 = 1\`;`);
349
- (_e = tsDescriptor.dynamicQuery2) === null || _e === void 0 ? void 0 : _e.where.forEach(fragment => {
350
- const paramValues = fragment.parameters.map(param => 'params?.params?.' + param + ' ?? null');
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(`params?.where?.forEach(condition => `).inlineBlock(() => {
358
+ writer.write('params?.where?.forEach(condition => ').inlineBlock(() => {
357
359
  var _a;
358
- writer.writeLine(`const where = whereCondition(condition);`);
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(`if (where?.hasValue)`).block(() => {
370
+ writer.write('if (where?.hasValue)').block(() => {
369
371
  writer.writeLine(`sql += EOL + 'AND ' + where.sql;`);
370
- writer.write(`paramsValues.push(...where.values);`);
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 == 'sqlite') {
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(`.all(paramsValues)`).newLine();
388
- writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
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 == 'libsql') {
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.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
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(`let rowIndex = -1;`);
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(`rowIndex++;`);
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(`function appendSelect(sql: string, selectField: string)`).block(() => {
422
+ writer.write('function appendSelect(sql: string, selectField: string)').block(() => {
410
423
  writer.write(`if (sql == 'SELECT')`).block(() => {
411
- writer.writeLine(`return sql + EOL + selectField;`);
424
+ writer.writeLine('return sql + EOL + selectField;');
412
425
  });
413
- writer.write(`else`).block(() => {
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(`const obj = {} as any;`);
420
- writer.write(`whereConditions?.forEach(condition => `).inlineBlock(() => {
421
- writer.writeLine(`const where = whereCondition(condition);`);
422
- writer.write(`if (where?.hasValue) `).block(() => {
423
- writer.writeLine(`obj[condition[0]] = true;`);
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(`return obj;`);
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(`const obj = {} as any;`);
433
- writer.write(`orderBy?.forEach(order => `).inlineBlock(() => {
434
- writer.writeLine(`obj[order[0]] = true;`);
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(`return obj;`);
450
+ writer.writeLine('return obj;');
438
451
  });
439
452
  }
440
453
  writer.blankLine();
441
- writer.write(`type WhereConditionResult = `).block(() => {
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(`return `).block(() => {
455
- writer.writeLine('sql: `${selectFragment} LIKE concat(\'%\', ?, \'%\')`,');
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(`const value1 = isDate(condition[2]) ? condition[2]?.toISOString() : condition[2];`);
464
- writer.writeLine(`const value2 = isDate(condition[3]) ? condition[3]?.toISOString() : condition[3];`);
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(`return `).block(() => {
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(`return `).block(() => {
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(`return `).block(() => {
483
- writer.writeLine('sql: `${selectFragment} ${operator} (${condition[2]?.map(value => isDate(value) ? \'date(?)\' : \'?\').join(\', \')})`,');
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(`return `).block(() => {
490
- writer.writeLine('sql: `${selectFragment} ${operator} (${condition[2]?.map(_ => \'?\').join(\', \')})`,');
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(`if (NumericOperatorList.includes(operator)) `).block(() => {
509
+ writer.write('if (NumericOperatorList.includes(operator)) ').block(() => {
497
510
  if ((0, code_generator_1.hasDateColumn)(tsDescriptor.columns)) {
498
- writer.writeLine(`const value = isDate(condition[2]) ? condition[2]?.toISOString() : condition[2];`);
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(`return `).block(() => {
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(`return `).block(() => {
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(`function isDate(value: any): value is Date`).block(() => {
518
- writer.writeLine(`return value instanceof Date;`);
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 == 'libsql'
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 == 'Select' || (queryType == 'Insert' && tsDescriptor.returning))) {
565
- if (client == 'sqlite') {
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 (!isCrud && client == 'libsql') {
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 != '' ? `{ sql, args: ${queryParams} }` : 'sql';
616
+ const executeParams = queryParams !== '' ? `{ sql, args: ${queryParams} }` : 'sql';
590
617
  writer.write(`return client.execute(${executeParams})`).newLine();
591
- if (queryType == 'Select') {
592
- writer.indent().write(`.then(res => res.rows)`).newLine();
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 == 'Insert') {
627
+ if (queryType === 'Insert') {
601
628
  if (tsDescriptor.returning) {
602
- writer.indent().write(`.then(res => res.rows)`).newLine();
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 == 'Update' || queryType == 'Delete' || (queryType == 'Insert' && !tsDescriptor.returning))) {
613
- if (client == 'sqlite') {
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
- writeExecuteBlock(sql, queryParams, resultTypeName, writer);
642
+ const params = client === 'better-sqlite3' ? queryParams : queryParamsWithoutBrackets;
643
+ writeExecuteBlock(sql, params, resultTypeName, writer);
616
644
  });
617
645
  }
618
- if (client == 'libsql') {
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 != '' ? `{ sql, args: ${queryParams} }` : 'sql';
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 == 'Select' || tsDescriptor.returning) && tsDescriptor.dynamicQuery2 == null) {
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 == 'libsql' && !tsDescriptor.returning && tsDescriptor.dynamicQuery2 == null) {
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(`const orderByFragments = `).inlineBlock(() => {
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 == 0) {
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 == 'libsql') {
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.write('return array.reduce((map, value, index, array) => ').inlineBlock(() => {
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
- }).write(', new Map<Q, T[]>());');
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 "Select":
773
+ case 'Select':
743
774
  return writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryParams, resultTypeName, writer);
744
- case "Insert":
775
+ case 'Insert':
745
776
  return writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTypeName, writer);
746
- case "Update":
777
+ case 'Update':
747
778
  return writeExecuteUpdateCrudBlock(client, tableName, idColumn, dataTypeName, resultTypeName, writer);
748
- case "Delete":
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 == 'sqlite') {
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(`.then(res => res.rows)`).newLine();
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(`const columns = keys.filter(key => params[key] !== undefined);`);
778
- writer.writeLine(`const values = columns.map(col => params[col]!);`);
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 == 'sqlite') {
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(`return client.execute({ sql, args: values })`).newLine();
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(`const columns = keys.filter(key => data[key] !== undefined);`);
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 == 'sqlite') {
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(`return client.execute({ sql, args: values })`).newLine();
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 == 'sqlite') {
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 == 'Date') {
877
+ if (param.tsType === 'Date') {
830
878
  if (param.notNull) {
831
879
  return `new Date(${variableData})`;
832
880
  }
833
- else {
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 == 'Date') {
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.write(`return [...grouped.values()].map(row => (`).inlineBlock(() => {
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}!` + separator);
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
- }).write('))');
916
+ })
917
+ .write('))');
869
918
  });
870
919
  }
871
920
  //# sourceMappingURL=code-generator.js.map