typesql-cli 0.20.0 → 0.21.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 (122) hide show
  1. package/cli.js +6 -5
  2. package/cli.js.map +1 -1
  3. package/code-generator2.d.ts.map +1 -1
  4. package/code-generator2.js +136 -102
  5. package/code-generator2.js.map +1 -1
  6. package/codegen/code-generator.d.ts +13 -0
  7. package/codegen/code-generator.d.ts.map +1 -0
  8. package/codegen/code-generator.js +107 -0
  9. package/codegen/code-generator.js.map +1 -0
  10. package/codegen/code-generator2.d.ts +10 -0
  11. package/codegen/code-generator2.d.ts.map +1 -0
  12. package/codegen/code-generator2.js +917 -0
  13. package/codegen/code-generator2.js.map +1 -0
  14. package/codegen/codegen-util.d.ts +1 -0
  15. package/codegen/codegen-util.d.ts.map +1 -0
  16. package/codegen/codegen-util.js +2 -0
  17. package/codegen/codegen-util.js.map +1 -0
  18. package/codegen/generic/codegen-util.d.ts +8 -0
  19. package/codegen/generic/codegen-util.d.ts.map +1 -0
  20. package/codegen/generic/codegen-util.js +89 -0
  21. package/codegen/generic/codegen-util.js.map +1 -0
  22. package/codegen/mysql2.d.ts +14 -0
  23. package/codegen/mysql2.d.ts.map +1 -0
  24. package/codegen/mysql2.js +608 -0
  25. package/codegen/mysql2.js.map +1 -0
  26. package/codegen/pg.d.ts +7 -0
  27. package/codegen/pg.d.ts.map +1 -0
  28. package/codegen/pg.js +707 -0
  29. package/codegen/pg.js.map +1 -0
  30. package/codegen/postgres-pg.d.ts +10 -0
  31. package/codegen/postgres-pg.d.ts.map +1 -0
  32. package/codegen/postgres-pg.js +917 -0
  33. package/codegen/postgres-pg.js.map +1 -0
  34. package/codegen/shared/codegen-util.d.ts +72 -0
  35. package/codegen/shared/codegen-util.d.ts.map +1 -0
  36. package/codegen/shared/codegen-util.js +487 -0
  37. package/codegen/shared/codegen-util.js.map +1 -0
  38. package/codegen/sqlite-code-generator.d.ts +15 -0
  39. package/codegen/sqlite-code-generator.d.ts.map +1 -0
  40. package/codegen/sqlite-code-generator.js +1049 -0
  41. package/codegen/sqlite-code-generator.js.map +1 -0
  42. package/codegen/sqlite.d.ts +11 -0
  43. package/codegen/sqlite.d.ts.map +1 -0
  44. package/codegen/sqlite.js +814 -0
  45. package/codegen/sqlite.js.map +1 -0
  46. package/describe-query.d.ts.map +1 -1
  47. package/describe-query.js +45 -32
  48. package/describe-query.js.map +1 -1
  49. package/dialects/postgres.d.ts +4 -1
  50. package/dialects/postgres.d.ts.map +1 -1
  51. package/dialects/postgres.js +4 -2
  52. package/dialects/postgres.js.map +1 -1
  53. package/drivers/sqlite.d.ts +4 -1
  54. package/drivers/sqlite.d.ts.map +1 -1
  55. package/drivers/sqlite.js +4 -1
  56. package/drivers/sqlite.js.map +1 -1
  57. package/drivers/types.d.ts +3 -1
  58. package/drivers/types.d.ts.map +1 -1
  59. package/generic/codegen-util.d.ts +8 -0
  60. package/generic/codegen-util.d.ts.map +1 -0
  61. package/generic/codegen-util.js +89 -0
  62. package/generic/codegen-util.js.map +1 -0
  63. package/mysql-mapping.d.ts +4 -1
  64. package/mysql-mapping.d.ts.map +1 -1
  65. package/mysql-mapping.js +5 -3
  66. package/mysql-mapping.js.map +1 -1
  67. package/mysql-query-analyzer/infer-column-nullability.js +1 -1
  68. package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
  69. package/mysql-query-analyzer/parse.d.ts.map +1 -1
  70. package/mysql-query-analyzer/parse.js +3 -2
  71. package/mysql-query-analyzer/parse.js.map +1 -1
  72. package/mysql-query-analyzer/select-columns.d.ts.map +1 -1
  73. package/mysql-query-analyzer/select-columns.js +1 -1
  74. package/mysql-query-analyzer/select-columns.js.map +1 -1
  75. package/mysql-query-analyzer/types.d.ts +3 -0
  76. package/mysql-query-analyzer/types.d.ts.map +1 -1
  77. package/package.json +12 -11
  78. package/postgres-pg.d.ts +10 -0
  79. package/postgres-pg.d.ts.map +1 -0
  80. package/postgres-pg.js +917 -0
  81. package/postgres-pg.js.map +1 -0
  82. package/postgres-query-analyzer/describe.d.ts +1 -1
  83. package/postgres-query-analyzer/describe.d.ts.map +1 -1
  84. package/postgres-query-analyzer/describe.js +86 -53
  85. package/postgres-query-analyzer/describe.js.map +1 -1
  86. package/postgres-query-analyzer/traverse.d.ts +1 -0
  87. package/postgres-query-analyzer/traverse.d.ts.map +1 -1
  88. package/postgres-query-analyzer/traverse.js +43 -21
  89. package/postgres-query-analyzer/traverse.js.map +1 -1
  90. package/postgres-query-analyzer/types.d.ts +1 -0
  91. package/postgres-query-analyzer/types.d.ts.map +1 -1
  92. package/postgres-query-analyzer/util.d.ts +9 -0
  93. package/postgres-query-analyzer/util.d.ts.map +1 -0
  94. package/postgres-query-analyzer/util.js +58 -0
  95. package/postgres-query-analyzer/util.js.map +1 -0
  96. package/rescript.d.ts +1 -0
  97. package/rescript.d.ts.map +1 -0
  98. package/rescript.js +2 -0
  99. package/rescript.js.map +1 -0
  100. package/sqlite-query-analyzer/parser.js +6 -3
  101. package/sqlite-query-analyzer/parser.js.map +1 -1
  102. package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
  103. package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
  104. package/sqlite-query-analyzer/sqlite-code-generator.d.ts +15 -0
  105. package/sqlite-query-analyzer/sqlite-code-generator.d.ts.map +1 -0
  106. package/sqlite-query-analyzer/sqlite-code-generator.js +1049 -0
  107. package/sqlite-query-analyzer/sqlite-code-generator.js.map +1 -0
  108. package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts +1 -0
  109. package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts.map +1 -1
  110. package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
  111. package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
  112. package/sqlite-query-analyzer/traverse.js +6 -3
  113. package/sqlite-query-analyzer/traverse.js.map +1 -1
  114. package/sqlite.d.ts +43 -0
  115. package/sqlite.d.ts.map +1 -0
  116. package/sqlite.js +755 -0
  117. package/sqlite.js.map +1 -0
  118. package/ts-nested-descriptor.d.ts.map +1 -1
  119. package/ts-nested-descriptor.js +1 -1
  120. package/ts-nested-descriptor.js.map +1 -1
  121. package/types.d.ts +8 -1
  122. package/types.d.ts.map +1 -1
@@ -0,0 +1,814 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAndGenerateCode = validateAndGenerateCode;
4
+ exports.generateCrud = generateCrud;
5
+ exports.getQueryName = getQueryName;
6
+ exports.generateTsCode = generateTsCode;
7
+ exports.mapFieldToTsField = mapFieldToTsField;
8
+ const Either_1 = require("fp-ts/lib/Either");
9
+ const parser_1 = require("../sqlite-query-analyzer/parser");
10
+ const mysql2_1 = require("./mysql2");
11
+ const ts_nested_descriptor_1 = require("../ts-nested-descriptor");
12
+ const describe_query_1 = require("../describe-query");
13
+ const query_executor_1 = require("../sqlite-query-analyzer/query-executor");
14
+ const ts_dynamic_query_descriptor_1 = require("../ts-dynamic-query-descriptor");
15
+ const sqlite_1 = require("../drivers/sqlite");
16
+ const codegen_util_1 = require("./shared/codegen-util");
17
+ function validateAndGenerateCode(client, sql, queryName, sqliteDbSchema, isCrud = false) {
18
+ const { sql: processedSql } = (0, describe_query_1.preprocessSql)(sql, 'sqlite');
19
+ const explainSqlResult = (0, query_executor_1.explainSql)(client.client, processedSql);
20
+ if ((0, Either_1.isLeft)(explainSqlResult)) {
21
+ return (0, Either_1.left)({
22
+ name: 'Invalid sql',
23
+ description: explainSqlResult.left.description
24
+ });
25
+ }
26
+ const code = generateTsCode(sql, queryName, sqliteDbSchema, client.type, isCrud);
27
+ return code;
28
+ }
29
+ function mapToColumnInfo(col, checkOptional) {
30
+ const defaultValue = col.columnKey === 'PRI' && col.column_type === 'INTEGER' ? 'AUTOINCREMENT' : col.defaultValue;
31
+ const columnInfo = {
32
+ name: col.column,
33
+ notNull: col.notNull,
34
+ type: col.column_type,
35
+ table: col.table,
36
+ optional: checkOptional && (!col.notNull || defaultValue != null)
37
+ };
38
+ return columnInfo;
39
+ }
40
+ function generateCrud(client, 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) => mapColumnToTsParameterDescriptor(col, client));
48
+ const resultColumns = mapColumns(client, queryType, columnInfo, false);
49
+ const params = columnInfo.map((col) => mapColumnToTsParameterDescriptor(col, client));
50
+ const tsDescriptor = {
51
+ sql: '',
52
+ queryType,
53
+ multipleRowsResult: false,
54
+ columns: resultColumns,
55
+ 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); }) : []
58
+ };
59
+ const queryName = getQueryName(queryType, tableName);
60
+ const code = generateCodeFromTsDescriptor(client, queryName, tsDescriptor, true, tableName);
61
+ return code;
62
+ }
63
+ function getQueryName(queryType, tableName) {
64
+ const camelCaseName = (0, codegen_util_1.convertToCamelCaseName)(tableName);
65
+ const captitalizedName = (0, codegen_util_1.capitalize)(camelCaseName);
66
+ switch (queryType) {
67
+ case 'Select':
68
+ return `selectFrom${captitalizedName}`;
69
+ case 'Insert':
70
+ return `insertInto${captitalizedName}`;
71
+ case 'Update':
72
+ return `update${captitalizedName}`;
73
+ case 'Delete':
74
+ return `deleteFrom${captitalizedName}`;
75
+ }
76
+ }
77
+ function generateTsCode(sql, queryName, sqliteDbSchema, client, isCrud = false) {
78
+ const schemaDefResult = (0, parser_1.parseSql)(sql, sqliteDbSchema);
79
+ if ((0, Either_1.isLeft)(schemaDefResult)) {
80
+ return schemaDefResult;
81
+ }
82
+ const tsDescriptor = createTsDescriptor(schemaDefResult.right, client);
83
+ const code = generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud);
84
+ return (0, Either_1.right)(code);
85
+ }
86
+ function createTsDescriptor(queryInfo, client) {
87
+ var _a;
88
+ const tsDescriptor = {
89
+ sql: queryInfo.sql,
90
+ queryType: queryInfo.queryType,
91
+ multipleRowsResult: queryInfo.multipleRowsResult,
92
+ returning: queryInfo.returning,
93
+ columns: mapColumns(client, queryInfo.queryType, queryInfo.columns, queryInfo.returning),
94
+ parameterNames: [],
95
+ parameters: queryInfo.parameters.map((param) => mapParameterToTsFieldDescriptor(param, client)),
96
+ data: (_a = queryInfo.data) === null || _a === void 0 ? void 0 : _a.map((param) => mapParameterToTsFieldDescriptor(param, client)),
97
+ orderByColumns: queryInfo.orderByColumns
98
+ };
99
+ if (queryInfo.nestedInfo) {
100
+ const nestedDescriptor2 = queryInfo.nestedInfo.map((relation) => {
101
+ const tsRelation = {
102
+ groupIndex: relation.groupIndex,
103
+ name: relation.name,
104
+ fields: relation.fields.map((field) => mapFieldToTsField(queryInfo.columns, field, client)),
105
+ relations: relation.relations.map((relation) => (0, ts_nested_descriptor_1.mapToTsRelation2)(relation))
106
+ };
107
+ return tsRelation;
108
+ });
109
+ tsDescriptor.nestedDescriptor2 = nestedDescriptor2;
110
+ }
111
+ tsDescriptor.dynamicQuery2 = queryInfo.dynamicSqlQuery2;
112
+ return tsDescriptor;
113
+ }
114
+ function mapColumns(client, queryType, columns, returning = false) {
115
+ const resultColumns = getInsertUpdateResult(client);
116
+ if (queryType === 'Insert' && !returning) {
117
+ return resultColumns;
118
+ }
119
+ if (queryType === 'Update' || queryType === 'Delete') {
120
+ return [resultColumns[0]];
121
+ }
122
+ const escapedColumnsNames = (0, codegen_util_1.renameInvalidNames)(columns.map((col) => col.name));
123
+ return columns.map((col, index) => mapColumnToTsFieldDescriptor(Object.assign(Object.assign({}, col), { name: escapedColumnsNames[index] }), client));
124
+ }
125
+ function getInsertUpdateResult(client) {
126
+ const sqliteInsertColumns = [
127
+ {
128
+ name: 'changes',
129
+ tsType: 'number',
130
+ notNull: true
131
+ },
132
+ {
133
+ name: 'lastInsertRowid',
134
+ tsType: 'number',
135
+ notNull: true
136
+ }
137
+ ];
138
+ const libSqlInsertColumns = [
139
+ {
140
+ name: 'rowsAffected',
141
+ tsType: 'number',
142
+ notNull: true
143
+ },
144
+ {
145
+ name: 'lastInsertRowid',
146
+ tsType: 'number',
147
+ notNull: true
148
+ }
149
+ ];
150
+ const d1InsertColumns = [
151
+ {
152
+ name: 'changes',
153
+ tsType: 'number',
154
+ notNull: true
155
+ },
156
+ {
157
+ name: 'last_row_id',
158
+ tsType: 'number',
159
+ notNull: true
160
+ }
161
+ ];
162
+ switch (client) {
163
+ case 'better-sqlite3':
164
+ case 'bun:sqlite':
165
+ return sqliteInsertColumns;
166
+ case 'libsql':
167
+ return libSqlInsertColumns;
168
+ case 'd1':
169
+ return d1InsertColumns;
170
+ }
171
+ }
172
+ function mapFieldToTsField(columns, field, client) {
173
+ const tsField = {
174
+ name: field.name,
175
+ index: field.index,
176
+ tsType: sqlite_1.mapper.mapColumnType(columns[field.index].type, client),
177
+ notNull: columns[field.index].intrinsicNotNull
178
+ };
179
+ return tsField;
180
+ }
181
+ function mapParameterToTsFieldDescriptor(col, client) {
182
+ const tsDesc = {
183
+ name: col.name,
184
+ tsType: sqlite_1.mapper.mapColumnType(col.columnType, client),
185
+ notNull: col.notNull ? col.notNull : false,
186
+ toDriver: parameterToDriver(col),
187
+ isArray: false
188
+ };
189
+ return tsDesc;
190
+ }
191
+ function parameterToDriver(param) {
192
+ if (param.columnType === 'DATE') {
193
+ return `${param.name}?.toISOString().split('T')[0]`;
194
+ }
195
+ if (param.columnType === 'DATE_TIME') {
196
+ return `${param.name}?.toISOString().split('.')[0].replace('T', ' ')`;
197
+ }
198
+ return param.name;
199
+ }
200
+ function columnToDriver(col) {
201
+ if (col.type === 'DATE') {
202
+ return `${col.name}?.toISOString().split('T')[0]`;
203
+ }
204
+ if (col.type === 'DATE_TIME') {
205
+ return `${col.name}?.toISOString().split('.')[0].replace('T', ' ')`;
206
+ }
207
+ return col.name;
208
+ }
209
+ function mapColumnToTsFieldDescriptor(col, client) {
210
+ const tsDesc = {
211
+ name: col.name,
212
+ tsType: sqlite_1.mapper.mapColumnType(col.type, client),
213
+ notNull: col.notNull,
214
+ optional: col.optional
215
+ };
216
+ return tsDesc;
217
+ }
218
+ function mapColumnToTsParameterDescriptor(col, client) {
219
+ const tsDesc = {
220
+ name: col.name,
221
+ tsType: sqlite_1.mapper.mapColumnType(col.type, client),
222
+ notNull: col.notNull,
223
+ optional: col.optional,
224
+ toDriver: columnToDriver(col),
225
+ isArray: false
226
+ };
227
+ return tsDesc;
228
+ }
229
+ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud = false, tableName = '') {
230
+ var _a, _b, _c;
231
+ const writer = (0, codegen_util_1.createCodeBlockWriter)();
232
+ const { camelCaseName, capitalizedName, dataTypeName, resultTypeName, paramsTypeName, orderByTypeName, dynamicParamsTypeName, selectColumnsTypeName, whereTypeName } = (0, codegen_util_1.createTypeNames)(queryName);
233
+ const queryType = tsDescriptor.queryType;
234
+ const sql = tsDescriptor.sql;
235
+ const generateOrderBy = tsDescriptor.orderByColumns != null && tsDescriptor.orderByColumns.length > 0;
236
+ const uniqueParams = (0, codegen_util_1.removeDuplicatedParameters2)(tsDescriptor.parameters);
237
+ const uniqueUpdateParams = (0, codegen_util_1.removeDuplicatedParameters2)(tsDescriptor.data || []);
238
+ const orderByField = generateOrderBy ? `orderBy` : undefined;
239
+ const paramsTypes = (0, codegen_util_1.removeDuplicatedParameters2)(tsDescriptor.dynamicQuery2 == null ? tsDescriptor.parameters : (0, ts_dynamic_query_descriptor_1.mapToDynamicParams)(tsDescriptor.parameters));
240
+ let functionArguments = client === 'better-sqlite3' || client === 'bun:sqlite'
241
+ ? 'db: Database'
242
+ : client === 'd1'
243
+ ? 'db: D1Database'
244
+ : 'client: Client | Transaction';
245
+ if (queryType === 'Update' && uniqueUpdateParams.length > 0) {
246
+ functionArguments += `, data: ${dataTypeName}`;
247
+ }
248
+ if (tsDescriptor.dynamicQuery2 == null) {
249
+ functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ? `, params: ${paramsTypeName}` : '';
250
+ }
251
+ else {
252
+ functionArguments += `, ${orderByField ? 'params' : 'params?'}: ${dynamicParamsTypeName}`;
253
+ }
254
+ const orNull = queryType === 'Select' ? ' | null' : '';
255
+ const returnType = tsDescriptor.multipleRowsResult ? `${resultTypeName}[]` : `${resultTypeName}${orNull}`;
256
+ const allParameters = (((_a = tsDescriptor.data) === null || _a === void 0 ? void 0 : _a.map((param) => toDriver('data', param))) || []).concat(tsDescriptor.parameters.map((param) => toDriver('params', param)));
257
+ const queryParamsWithoutBrackets = allParameters.length > 0 ? `${allParameters.join(', ')}` : '';
258
+ const queryParams = queryParamsWithoutBrackets !== '' ? `[${queryParamsWithoutBrackets}]` : '';
259
+ const isDynamicQuery = tsDescriptor.dynamicQuery2 != null;
260
+ writeImports(writer, client, isDynamicQuery);
261
+ if (tsDescriptor.dynamicQuery2 != null) {
262
+ writer.blankLine();
263
+ (0, codegen_util_1.writeDynamicQueryParamType)(writer, queryName, paramsTypes.length > 0, orderByField);
264
+ writer.blankLine();
265
+ (0, mysql2_1.writeTypeBlock)(writer, paramsTypes, paramsTypeName, false, tsDescriptor.dynamicQuery2 ? undefined : orderByField);
266
+ const resultTypes = tsDescriptor.dynamicQuery2 == null ? tsDescriptor.columns : (0, ts_dynamic_query_descriptor_1.mapToDynamicResultColumns)(tsDescriptor.columns);
267
+ (0, mysql2_1.writeTypeBlock)(writer, resultTypes, resultTypeName, false);
268
+ const selectFields = (0, ts_dynamic_query_descriptor_1.mapToDynamicSelectColumns)(tsDescriptor.columns);
269
+ (0, mysql2_1.writeTypeBlock)(writer, selectFields, selectColumnsTypeName, false);
270
+ (0, codegen_util_1.writeSelectFragements)(writer, tsDescriptor.dynamicQuery2.select, tsDescriptor.columns);
271
+ writer.blankLine();
272
+ (0, codegen_util_1.writeDynamicQueryOperators)(writer, whereTypeName, tsDescriptor.columns);
273
+ writer.blankLine();
274
+ const asyncModified = client === 'libsql' || client === 'd1' ? 'async ' : '';
275
+ const returnTypeModifier = client === 'libsql' || client === 'd1' ? `Promise<${returnType}>` : returnType;
276
+ writer.write(`export ${asyncModified}function ${camelCaseName}(${functionArguments}): ${returnTypeModifier}`).block(() => {
277
+ writer.blankLine();
278
+ writer.writeLine('const { sql, paramsValues } = buildSql(params);');
279
+ if (client === 'better-sqlite3') {
280
+ writer.write('return db.prepare(sql)').newLine();
281
+ writer.indent().write('.raw(true)').newLine();
282
+ writer.indent().write('.all(paramsValues)').newLine();
283
+ writer
284
+ .indent()
285
+ .write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
286
+ }
287
+ if (client === 'bun:sqlite') {
288
+ writer.write('return db.prepare(sql)').newLine();
289
+ writer.indent().write('.values(paramsValues)').newLine();
290
+ writer
291
+ .indent()
292
+ .write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
293
+ }
294
+ if (client === 'd1') {
295
+ writer.write('return db.prepare(sql)').newLine();
296
+ writer.indent().write('.bind(...paramsValues)').newLine();
297
+ writer.indent().write('.raw()').newLine();
298
+ writer
299
+ .indent()
300
+ .write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
301
+ }
302
+ if (client === 'libsql') {
303
+ writer.write('return client.execute({ sql, args: paramsValues })').newLine();
304
+ writer.indent().write('.then(res => res.rows)').newLine();
305
+ writer
306
+ .indent()
307
+ .write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
308
+ }
309
+ });
310
+ if (tsDescriptor.dynamicQuery2) {
311
+ writer.blankLine();
312
+ (0, codegen_util_1.writeBuildSqlFunction)(writer, {
313
+ dynamicParamsTypeName,
314
+ columns: tsDescriptor.columns,
315
+ parameters: tsDescriptor.parameters,
316
+ dynamicQueryInfo: tsDescriptor.dynamicQuery2,
317
+ dialect: 'sqlite',
318
+ hasOrderBy: orderByField != null,
319
+ toDrive: toDriver
320
+ });
321
+ }
322
+ writer.blankLine();
323
+ (0, codegen_util_1.writeMapToResultFunction)(writer, {
324
+ columns: tsDescriptor.columns,
325
+ resultTypeName,
326
+ selectColumnsTypeName,
327
+ fromDriver: fromDriver
328
+ });
329
+ if (orderByField != null) {
330
+ writer.blankLine();
331
+ (0, codegen_util_1.writeOrderByToObjectFunction)(writer, dynamicParamsTypeName);
332
+ }
333
+ writer.blankLine();
334
+ writer.write('type WhereConditionResult = ').block(() => {
335
+ writer.writeLine('sql: string;');
336
+ writer.writeLine('hasValue: boolean;');
337
+ writer.writeLine('values: any[];');
338
+ });
339
+ writer.blankLine();
340
+ (0, codegen_util_1.writeWhereConditionFunction)(writer, whereTypeName, tsDescriptor.columns);
341
+ if ((0, mysql2_1.hasDateColumn)(tsDescriptor.columns)) {
342
+ writer.blankLine();
343
+ writer.write('function isDate(value: any): value is Date').block(() => {
344
+ writer.writeLine('return value instanceof Date;');
345
+ });
346
+ }
347
+ }
348
+ if (tsDescriptor.dynamicQuery2 == null) {
349
+ if (uniqueUpdateParams.length > 0) {
350
+ writer.blankLine();
351
+ writer.write(`export type ${dataTypeName} =`).block(() => {
352
+ uniqueUpdateParams.forEach((field) => {
353
+ const optionalOp = field.optional ? '?' : '';
354
+ const orNull = field.notNull ? '' : ' | null';
355
+ writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${orNull};`);
356
+ });
357
+ });
358
+ }
359
+ if (uniqueParams.length > 0 || generateOrderBy) {
360
+ writer.blankLine();
361
+ writer.write(`export type ${paramsTypeName} =`).block(() => {
362
+ uniqueParams.forEach((field) => {
363
+ const optionalOp = field.optional ? '?' : '';
364
+ const orNull = field.notNull ? '' : ' | null';
365
+ writer.writeLine(`${field.name}${optionalOp}: ${field.tsType}${orNull};`);
366
+ });
367
+ if (generateOrderBy) {
368
+ writer.writeLine(`orderBy: ${orderByTypeName}[];`);
369
+ }
370
+ });
371
+ }
372
+ writer.blankLine();
373
+ writer.write(`export type ${resultTypeName} =`).block(() => {
374
+ tsDescriptor.columns.forEach((field) => {
375
+ const optionalOp = field.notNull ? '' : '?';
376
+ writer.writeLine(`${field.name}${optionalOp}: ${field.tsType};`);
377
+ });
378
+ });
379
+ writer.blankLine();
380
+ }
381
+ if (isCrud) {
382
+ const crudFunction = client === 'libsql' || client === 'd1'
383
+ ? `async function ${camelCaseName}(${functionArguments}): Promise<${returnType}>`
384
+ : `function ${camelCaseName}(${functionArguments}): ${returnType}`;
385
+ writer.write(`export ${crudFunction}`).block(() => {
386
+ const idColumn = tsDescriptor.parameters[0].name;
387
+ writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, client === 'bun:sqlite' || client === 'd1' ? queryParamsWithoutBrackets : queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
388
+ });
389
+ if (client !== 'd1' && (queryType === 'Select' || tsDescriptor.returning)) {
390
+ writer.blankLine();
391
+ writeMapFunction(writer, { resultTypeName, columns: tsDescriptor.columns });
392
+ }
393
+ if (client === 'libsql' && queryType !== 'Select' && !tsDescriptor.returning) {
394
+ writer.blankLine();
395
+ writeMapFunctionByName(writer, { resultTypeName, columns: tsDescriptor.columns });
396
+ }
397
+ }
398
+ const executeFunctionParams = {
399
+ functionName: camelCaseName,
400
+ returnType,
401
+ resultTypeName,
402
+ dataTypeName,
403
+ sql: (0, mysql2_1.replaceOrderByParam)(sql),
404
+ multipleRowsResult: tsDescriptor.multipleRowsResult,
405
+ parameters: allParameters,
406
+ columns: tsDescriptor.columns,
407
+ queryType,
408
+ paramsTypeName,
409
+ returning: tsDescriptor.returning || false,
410
+ orderBy: (((_b = tsDescriptor.orderByColumns) === null || _b === void 0 ? void 0 : _b.length) || 0) > 0,
411
+ uniqueUpdateParams
412
+ };
413
+ if (tsDescriptor.dynamicQuery2 == null && !isCrud) {
414
+ writeExecFunction(writer, client, executeFunctionParams);
415
+ }
416
+ if ((_c = tsDescriptor.orderByColumns) === null || _c === void 0 ? void 0 : _c.length) {
417
+ writer.blankLine();
418
+ (0, codegen_util_1.writeBuildOrderByBlock)(writer, tsDescriptor.orderByColumns, orderByTypeName);
419
+ }
420
+ if (tsDescriptor.nestedDescriptor2) {
421
+ const relations = tsDescriptor.nestedDescriptor2 || [];
422
+ (0, codegen_util_1.writeNestedTypes)(writer, relations, capitalizedName);
423
+ writer.blankLine();
424
+ relations.forEach((relation, index) => {
425
+ const relationType = (0, codegen_util_1.generateRelationType)(capitalizedName, relation.name);
426
+ if (index === 0) {
427
+ if (client === 'better-sqlite3' || client === 'bun:sqlite') {
428
+ writer.write(`export function ${camelCaseName}Nested(${functionArguments}): ${relationType}[]`).block(() => {
429
+ const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
430
+ writer.writeLine(`const selectResult = ${camelCaseName}(db${params});`);
431
+ writer.write('if (selectResult.length == 0)').block(() => {
432
+ writer.writeLine('return [];');
433
+ });
434
+ writer.writeLine(`return collect${relationType}(selectResult);`);
435
+ });
436
+ }
437
+ else if (client === 'libsql' || client === 'd1') {
438
+ writer.write(`export async function ${camelCaseName}Nested(${functionArguments}): Promise<${relationType}[]>`).block(() => {
439
+ const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
440
+ const functionParam = client === 'libsql' ? `client${params}` : `db${params}`;
441
+ writer.writeLine(`const selectResult = await ${camelCaseName}(${functionParam});`);
442
+ writer.write('if (selectResult.length == 0)').block(() => {
443
+ writer.writeLine('return [];');
444
+ });
445
+ writer.writeLine(`return collect${relationType}(selectResult);`);
446
+ });
447
+ }
448
+ }
449
+ (0, codegen_util_1.writeCollectFunction)(writer, relation, tsDescriptor.columns, capitalizedName, resultTypeName);
450
+ });
451
+ writer.blankLine();
452
+ (0, codegen_util_1.writeGroupByFunction)(writer);
453
+ }
454
+ return writer.toString();
455
+ }
456
+ function writeExecuteCrudBlock(client, queryType, tableName, columns, idColumn, queryParams, paramTypeName, dataTypeName, resultTypeName, writer) {
457
+ switch (queryType) {
458
+ case 'Select':
459
+ return writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryParams, resultTypeName, writer);
460
+ case 'Insert':
461
+ return writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTypeName, writer);
462
+ case 'Update':
463
+ return writeExecuteUpdateCrudBlock(client, tableName, idColumn, dataTypeName, resultTypeName, writer);
464
+ case 'Delete':
465
+ return writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, resultTypeName, writer);
466
+ }
467
+ }
468
+ function writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryParams, resultTypeName, writer) {
469
+ writer.blankLine();
470
+ writer.writeLine('const sql = `SELECT');
471
+ columns.forEach((col, index) => {
472
+ const separator = index < columns.length - 1 ? ',' : '';
473
+ writer.indent(2).write(`${col.name}${separator}`).newLine();
474
+ });
475
+ writer.indent().write(`FROM ${tableName}`).newLine();
476
+ writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
477
+ writer.blankLine();
478
+ if (client === 'better-sqlite3') {
479
+ writer.write('return db.prepare(sql)').newLine();
480
+ writer.indent().write('.raw(true)').newLine();
481
+ writer.indent().write(`.all(${queryParams})`).newLine();
482
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))[0];`);
483
+ }
484
+ else if (client === 'bun:sqlite') {
485
+ writer.write('return db.prepare(sql)').newLine();
486
+ writer.indent().write(`.values(${queryParams})`).newLine();
487
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))[0];`);
488
+ }
489
+ else if (client === 'd1') {
490
+ writer.write('return db.prepare(sql)').newLine();
491
+ writer.indent().write(`.bind(${queryParams})`).newLine();
492
+ writer.indent().write('.first();').newLine();
493
+ }
494
+ else {
495
+ writer.write(`return client.execute({ sql, args: ${queryParams} })`).newLine();
496
+ writer.indent().write('.then(res => res.rows)').newLine();
497
+ writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
498
+ }
499
+ }
500
+ function writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTypeName, writer) {
501
+ writer.blankLine();
502
+ writer.writeLine(`const keys = Object.keys(params) as Array<keyof ${paramTypeName}>;`);
503
+ writer.writeLine('const columns = keys.filter(key => params[key] !== undefined);');
504
+ writer.writeLine('const values = columns.map(col => params[col]!);');
505
+ writer.blankLine();
506
+ writer.writeLine('const sql = columns.length == 0');
507
+ writer.indent().write(`? \`INSERT INTO ${tableName} DEFAULT VALUES\``).newLine();
508
+ writer.indent().write(`: \`INSERT INTO ${tableName}(\${columns.join(',')}) VALUES(\${columns.map(_ => '?').join(',')})\``).newLine();
509
+ writer.blankLine();
510
+ if (client === 'better-sqlite3') {
511
+ writer.write('return db.prepare(sql)').newLine();
512
+ writer.indent().write(`.run(values) as ${resultTypeName};`);
513
+ }
514
+ else if (client === 'bun:sqlite') {
515
+ writer.write('return db.prepare(sql)').newLine();
516
+ writer.indent().write(`.run(...values) as ${resultTypeName};`);
517
+ }
518
+ else if (client === 'd1') {
519
+ writer.write('return db.prepare(sql)').newLine();
520
+ writer.indent().write('.bind(...values)').newLine();
521
+ writer.indent().write('.run()').newLine();
522
+ writer.indent().write('.then(res => res.meta);');
523
+ }
524
+ else {
525
+ writer.write('return client.execute({ sql, args: values })').newLine();
526
+ writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
527
+ }
528
+ }
529
+ function writeExecuteUpdateCrudBlock(client, tableName, idColumn, paramTypeName, resultTypeName, writer) {
530
+ writer.blankLine();
531
+ writer.writeLine(`const keys = Object.keys(data) as Array<keyof ${paramTypeName}>;`);
532
+ writer.writeLine('const columns = keys.filter(key => data[key] !== undefined);');
533
+ writer.writeLine(`const values = columns.map(col => data[col]!).concat(params.${idColumn});`);
534
+ writer.blankLine();
535
+ writer.writeLine('const sql = `');
536
+ writer.indent().write(`UPDATE ${tableName}`).newLine();
537
+ writer.indent().write(`SET \${columns.map(col => \`\${col} = ?\`).join(', ')}`).newLine();
538
+ writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
539
+ writer.blankLine();
540
+ if (client === 'better-sqlite3') {
541
+ writer.write('return db.prepare(sql)').newLine();
542
+ writer.indent().write(`.run(values) as ${resultTypeName};`);
543
+ }
544
+ else if (client === 'bun:sqlite') {
545
+ writer.write('return db.prepare(sql)').newLine();
546
+ writer.indent().write(`.run(...values) as ${resultTypeName};`);
547
+ }
548
+ else if (client === 'd1') {
549
+ writer.write('return db.prepare(sql)').newLine();
550
+ writer.indent().write(`.bind(params.${idColumn})`).newLine();
551
+ writer.indent().write('.run()').newLine();
552
+ writer.indent().write('.then(res => res.meta);');
553
+ }
554
+ else {
555
+ writer.write('return client.execute({ sql, args: values })').newLine();
556
+ writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
557
+ }
558
+ }
559
+ function writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, resultTypeName, writer) {
560
+ writer.blankLine();
561
+ writer.writeLine('const sql = `DELETE');
562
+ writer.indent().write(`FROM ${tableName}`).newLine();
563
+ writer.indent().write(`WHERE ${idColumn} = ?\``).newLine();
564
+ writer.blankLine();
565
+ if (client === 'better-sqlite3') {
566
+ writer.write('return db.prepare(sql)').newLine();
567
+ writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`).newLine();
568
+ }
569
+ else if (client === 'bun:sqlite') {
570
+ writer.write('return db.prepare(sql)').newLine();
571
+ writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`).newLine();
572
+ }
573
+ else if (client === 'd1') {
574
+ writer.write('return db.prepare(sql)').newLine();
575
+ writer.indent().write(`.bind(${queryParams})`).newLine();
576
+ writer.indent().write('.run()').newLine();
577
+ writer.indent().write('.then(res => res.meta);');
578
+ }
579
+ else {
580
+ writer.write(`return client.execute({ sql, args: ${queryParams} })`).newLine();
581
+ writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
582
+ }
583
+ }
584
+ function fromDriver(variableData, param) {
585
+ if (param.tsType === 'Date') {
586
+ if (param.notNull) {
587
+ return `new Date(${variableData})`;
588
+ }
589
+ return `${variableData} != null ? new Date(${variableData}) : ${variableData}`;
590
+ }
591
+ if (param.tsType === 'boolean') {
592
+ return `${variableData} != null ? Boolean(${variableData}) : ${variableData}`;
593
+ }
594
+ return variableData;
595
+ }
596
+ function toDriver(variableName, param) {
597
+ var _a;
598
+ if (param.tsType === 'Date') {
599
+ return `${variableName}.${param.toDriver}`;
600
+ }
601
+ if (param.tsType === 'boolean') {
602
+ const variable = `${variableName}.${param.name}`;
603
+ return `${variable} != null ? Number(${variable}) : ${variable}`;
604
+ }
605
+ if ((_a = param.tsType) === null || _a === void 0 ? void 0 : _a.endsWith('[]')) {
606
+ return `...${variableName}.${param.name}`;
607
+ }
608
+ return `${variableName}.${param.name}`;
609
+ }
610
+ function writeImports(writer, client, isDynamicQuery) {
611
+ switch (client) {
612
+ case 'better-sqlite3':
613
+ writer.writeLine(`import type { Database } from 'better-sqlite3';`);
614
+ if (isDynamicQuery) {
615
+ writer.writeLine(`import { EOL } from 'os';`);
616
+ }
617
+ return;
618
+ case 'libsql':
619
+ writer.writeLine(`import type { Client, Transaction } from '@libsql/client';`);
620
+ if (isDynamicQuery) {
621
+ writer.writeLine(`import { EOL } from 'os';`);
622
+ }
623
+ return;
624
+ case 'bun:sqlite':
625
+ writer.writeLine(`import type { Database } from 'bun:sqlite';`);
626
+ if (isDynamicQuery) {
627
+ writer.writeLine(`import { EOL } from 'os';`);
628
+ }
629
+ return;
630
+ case 'd1':
631
+ writer.writeLine(`import type { D1Database } from '@cloudflare/workers-types';`);
632
+ if (isDynamicQuery) {
633
+ writer.writeLine(`const EOL = '\\n';`);
634
+ }
635
+ return;
636
+ default:
637
+ return client;
638
+ }
639
+ }
640
+ function writeExecFunction(writer, client, params) {
641
+ const { functionName, returnType, sql, multipleRowsResult, parameters, columns, queryType, returning, paramsTypeName, resultTypeName, dataTypeName, orderBy, uniqueUpdateParams } = params;
642
+ let restParameters = queryType === 'Update' && uniqueUpdateParams.length > 0 ? `, data: ${dataTypeName}` : '';
643
+ const dynamicQuery = false;
644
+ if (!dynamicQuery) {
645
+ restParameters += parameters.length > 0 || orderBy ? `, params: ${paramsTypeName}` : '';
646
+ }
647
+ const queryParametersWithoutBrackes = parameters.join(', ');
648
+ const queryParams = queryParametersWithoutBrackes != '' ? `[${queryParametersWithoutBrackes}]` : '';
649
+ const mapFunctionParams = {
650
+ resultTypeName,
651
+ columns
652
+ };
653
+ switch (client) {
654
+ case 'better-sqlite3':
655
+ const betterSqliteArgs = 'db: Database' + restParameters;
656
+ if (queryType === 'Select') {
657
+ writer.write(`export function ${functionName}(${betterSqliteArgs}): ${returnType}`).block(() => {
658
+ writeSql(writer, sql);
659
+ if (multipleRowsResult) {
660
+ writer.write('return db.prepare(sql)').newLine();
661
+ writer.indent().write('.raw(true)').newLine();
662
+ writer.indent().write(`.all(${queryParams})`).newLine();
663
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data));`);
664
+ }
665
+ else {
666
+ writer.write('const res = db.prepare(sql)').newLine();
667
+ writer.indent().write('.raw(true)').newLine();
668
+ writer.indent().write(`.get(${queryParams});`).newLine();
669
+ writer.blankLine();
670
+ writer.write(`return res ? mapArrayTo${resultTypeName}(res) : null;`);
671
+ }
672
+ });
673
+ writer.blankLine();
674
+ writeMapFunction(writer, mapFunctionParams);
675
+ }
676
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
677
+ writer.write(`export function ${functionName}(${betterSqliteArgs}): ${resultTypeName}`).block(() => {
678
+ writeSql(writer, sql);
679
+ writer.write('return db.prepare(sql)').newLine();
680
+ writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`);
681
+ });
682
+ }
683
+ return;
684
+ case 'libsql':
685
+ const libSqlArgs = 'client: Client | Transaction' + restParameters;
686
+ writer.write(`export async function ${functionName}(${libSqlArgs}): Promise<${returnType}>`).block(() => {
687
+ writeSql(writer, sql);
688
+ const executeParams = queryParametersWithoutBrackes !== '' ? `{ sql, args: [${queryParametersWithoutBrackes}] }` : 'sql';
689
+ writer.write(`return client.execute(${executeParams})`).newLine();
690
+ if (queryType === 'Select') {
691
+ writer.indent().write('.then(res => res.rows)').newLine();
692
+ if (multipleRowsResult) {
693
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
694
+ }
695
+ else {
696
+ writer.indent().write(`.then(rows => rows.length > 0 ? mapArrayTo${resultTypeName}(rows[0]) : null);`);
697
+ }
698
+ }
699
+ if (queryType === 'Insert') {
700
+ if (returning) {
701
+ writer.indent().write('.then(res => res.rows)').newLine();
702
+ writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
703
+ }
704
+ }
705
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
706
+ writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`);
707
+ }
708
+ });
709
+ writer.blankLine();
710
+ if (queryType === 'Select' || returning) {
711
+ writeMapFunction(writer, mapFunctionParams);
712
+ }
713
+ else {
714
+ writeMapFunctionByName(writer, mapFunctionParams);
715
+ }
716
+ return;
717
+ case 'bun:sqlite':
718
+ const bunArgs = 'db: Database' + restParameters;
719
+ if (queryType === 'Select') {
720
+ writer.write(`export function ${functionName}(${bunArgs}): ${returnType}`).block(() => {
721
+ writeSql(writer, sql);
722
+ if (multipleRowsResult) {
723
+ writer.write('return db.prepare(sql)').newLine();
724
+ writer.indent().write(`.values(${queryParametersWithoutBrackes})`).newLine();
725
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${multipleRowsResult ? '' : '[0]'};`);
726
+ }
727
+ else {
728
+ writer.write('const res = db.prepare(sql)').newLine();
729
+ writer.indent().write(`.values(${queryParametersWithoutBrackes});`).newLine();
730
+ writer.blankLine();
731
+ writer.write(`return res.length > 0 ? mapArrayTo${resultTypeName}(res[0]) : null;`);
732
+ }
733
+ });
734
+ writer.blankLine();
735
+ writeMapFunction(writer, mapFunctionParams);
736
+ }
737
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
738
+ writer.write(`export function ${functionName}(${bunArgs}): ${resultTypeName}`).block(() => {
739
+ writeSql(writer, sql);
740
+ writer.write('return db.prepare(sql)').newLine();
741
+ writer.indent().write(`.run(${queryParametersWithoutBrackes}) as ${resultTypeName};`);
742
+ });
743
+ }
744
+ return;
745
+ case 'd1':
746
+ const d1Args = 'db: D1Database' + restParameters;
747
+ writer.write(`export async function ${functionName}(${d1Args}): Promise<${returnType}>`).block(() => {
748
+ writeSql(writer, sql);
749
+ writer.write('return db.prepare(sql)').newLine();
750
+ if (queryParametersWithoutBrackes !== '') {
751
+ writer.indent().write(`.bind(${queryParametersWithoutBrackes})`).newLine();
752
+ }
753
+ if (queryType === 'Select') {
754
+ writer.indent().write('.raw({ columnNames: false })').newLine();
755
+ if (multipleRowsResult) {
756
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
757
+ }
758
+ else {
759
+ writer.indent().write(`.then(rows => rows.length > 0 ? mapArrayTo${resultTypeName}(rows[0]) : null);`);
760
+ }
761
+ }
762
+ if (queryType === 'Insert' || queryType === 'Update' || queryType === 'Delete') {
763
+ if (returning) {
764
+ writer.indent().write('.raw({ columnNames: false })').newLine();
765
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row))[0]);`);
766
+ }
767
+ else {
768
+ writer.indent().write('.run()').newLine();
769
+ writer.indent().write(`.then(res => res.meta);`);
770
+ }
771
+ }
772
+ });
773
+ if (queryType === 'Select' || returning) {
774
+ writer.blankLine();
775
+ writeMapFunction(writer, mapFunctionParams);
776
+ }
777
+ return;
778
+ default:
779
+ return client;
780
+ }
781
+ }
782
+ function writeSql(writer, sql) {
783
+ const sqlSplit = sql.split('\n');
784
+ writer.write('const sql = `').newLine();
785
+ sqlSplit.forEach((sqlLine) => {
786
+ writer.indent().write(sqlLine.trimEnd()).newLine();
787
+ });
788
+ writer.indent().write('`').newLine();
789
+ }
790
+ function writeMapFunction(writer, params) {
791
+ const { resultTypeName, columns } = params;
792
+ writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
793
+ writer.write(`const result: ${resultTypeName} = `).block(() => {
794
+ columns.forEach((col, index) => {
795
+ const separator = index < columns.length - 1 ? ',' : '';
796
+ writer.writeLine(`${col.name}: ${fromDriver(`data[${index}]`, col)}${separator}`);
797
+ });
798
+ });
799
+ writer.writeLine('return result;');
800
+ });
801
+ }
802
+ function writeMapFunctionByName(writer, params) {
803
+ const { resultTypeName, columns } = params;
804
+ writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
805
+ writer.write(`const result: ${resultTypeName} = `).block(() => {
806
+ columns.forEach((col, index) => {
807
+ const separator = index < columns.length - 1 ? ',' : '';
808
+ writer.writeLine(`${col.name}: data.${col.name}${separator}`);
809
+ });
810
+ });
811
+ writer.writeLine('return result;');
812
+ });
813
+ }
814
+ //# sourceMappingURL=sqlite.js.map