typesql-cli 0.11.1 → 0.12.0-next2

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.
@@ -113,6 +113,17 @@ function createTsDescriptor(queryInfo, client) {
113
113
  return tsDescriptor;
114
114
  }
115
115
  function mapColumns(client, queryType, columns, returning = false) {
116
+ const resultColumns = getInsertUpdateResult(client);
117
+ if (queryType === 'Insert' && !returning) {
118
+ return resultColumns;
119
+ }
120
+ if (queryType === 'Update' || queryType === 'Delete') {
121
+ return [resultColumns[0]];
122
+ }
123
+ const escapedColumnsNames = (0, code_generator_1.renameInvalidNames)(columns.map((col) => col.columnName));
124
+ return columns.map((col, index) => mapColumnToTsFieldDescriptor(Object.assign(Object.assign({}, col), { columnName: escapedColumnsNames[index] }), client));
125
+ }
126
+ function getInsertUpdateResult(client) {
116
127
  const sqliteInsertColumns = [
117
128
  {
118
129
  name: 'changes',
@@ -137,14 +148,27 @@ function mapColumns(client, queryType, columns, returning = false) {
137
148
  notNull: true
138
149
  }
139
150
  ];
140
- if (queryType === 'Insert' && !returning) {
141
- return client === 'better-sqlite3' || client == 'bun:sqlite' ? sqliteInsertColumns : libSqlInsertColumns;
142
- }
143
- if (queryType === 'Update' || queryType === 'Delete') {
144
- return client === 'better-sqlite3' || client == 'bun:sqlite' ? [sqliteInsertColumns[0]] : [libSqlInsertColumns[0]];
151
+ const d1InsertColumns = [
152
+ {
153
+ name: 'changes',
154
+ tsType: 'number',
155
+ notNull: true
156
+ },
157
+ {
158
+ name: 'last_row_id',
159
+ tsType: 'number',
160
+ notNull: true
161
+ }
162
+ ];
163
+ switch (client) {
164
+ case 'better-sqlite3':
165
+ case 'bun:sqlite':
166
+ return sqliteInsertColumns;
167
+ case 'libsql':
168
+ return libSqlInsertColumns;
169
+ case 'd1:sqlite':
170
+ return d1InsertColumns;
145
171
  }
146
- const escapedColumnsNames = (0, code_generator_1.renameInvalidNames)(columns.map((col) => col.columnName));
147
- return columns.map((col, index) => mapColumnToTsFieldDescriptor(Object.assign(Object.assign({}, col), { columnName: escapedColumnsNames[index] }), client));
148
172
  }
149
173
  function mapFieldToTsField(columns, field, client) {
150
174
  const tsField = {
@@ -227,8 +251,6 @@ function mapColumnType(sqliteType, client) {
227
251
  return client === 'better-sqlite3' ? 'Uint8Array' : 'ArrayBuffer';
228
252
  case 'BOOLEAN':
229
253
  return 'boolean';
230
- case 'BOOLEAN':
231
- return 'boolean';
232
254
  }
233
255
  if (sqliteType.startsWith('ENUM')) {
234
256
  const enumValues = sqliteType.substring(sqliteType.indexOf('(') + 1, sqliteType.indexOf(')'));
@@ -237,7 +259,7 @@ function mapColumnType(sqliteType, client) {
237
259
  return 'any';
238
260
  }
239
261
  function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud = false, tableName = '') {
240
- var _a;
262
+ var _a, _b;
241
263
  const writer = new code_block_writer_1.default({
242
264
  useTabs: true
243
265
  });
@@ -257,7 +279,11 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
257
279
  const uniqueUpdateParams = (0, code_generator_1.removeDuplicatedParameters2)(tsDescriptor.data || []);
258
280
  const orderByField = generateOrderBy ? `orderBy: [${orderByTypeName}, 'asc' | 'desc'][]` : undefined;
259
281
  const paramsTypes = (0, code_generator_1.removeDuplicatedParameters2)(tsDescriptor.dynamicQuery2 == null ? tsDescriptor.parameters : (0, ts_dynamic_query_descriptor_1.mapToDynamicParams)(tsDescriptor.parameters));
260
- let functionArguments = client === 'better-sqlite3' || client == 'bun:sqlite' ? 'db: Database' : 'client: Client | Transaction';
282
+ let functionArguments = client === 'better-sqlite3' || client === 'bun:sqlite'
283
+ ? 'db: Database'
284
+ : client === 'd1:sqlite'
285
+ ? 'db: D1Database'
286
+ : 'client: Client | Transaction';
261
287
  functionArguments += queryType === 'Update' ? `, data: ${dataTypeName}` : '';
262
288
  if (tsDescriptor.dynamicQuery2 == null) {
263
289
  functionArguments += tsDescriptor.parameters.length > 0 || generateOrderBy ? `, params: ${paramsTypeName}` : '';
@@ -270,17 +296,9 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
270
296
  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)));
271
297
  const queryParamsWithoutBrackets = allParameters.length > 0 ? `${allParameters.join(', ')}` : '';
272
298
  const queryParams = queryParamsWithoutBrackets !== '' ? `[${queryParamsWithoutBrackets}]` : '';
273
- if (client === 'better-sqlite3') {
274
- writer.writeLine(`import type { Database } from 'better-sqlite3';`);
275
- }
276
- if (client === 'bun:sqlite') {
277
- writer.writeLine(`import type { Database } from 'bun:sqlite';`);
278
- }
279
- if (client === 'libsql') {
280
- writer.writeLine(`import type { Client, Transaction } from '@libsql/client';`);
281
- }
299
+ const isDynamicQuery = tsDescriptor.dynamicQuery2 != null;
300
+ writeImports(writer, client, isDynamicQuery);
282
301
  if (tsDescriptor.dynamicQuery2 != null) {
283
- writer.writeLine(`import { EOL } from 'os';`);
284
302
  writer.blankLine();
285
303
  writer.write(`export type ${dynamicParamsTypeName} = `).block(() => {
286
304
  writer.writeLine(`select?: ${selectColumnsTypeName};`);
@@ -323,8 +341,8 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
323
341
  });
324
342
  });
325
343
  writer.blankLine();
326
- const asyncModified = client === 'libsql' ? 'async ' : '';
327
- const returnTypeModifier = client === 'libsql' ? `Promise<${returnType}>` : returnType;
344
+ const asyncModified = client === 'libsql' || client === 'd1:sqlite' ? 'async ' : '';
345
+ const returnTypeModifier = client === 'libsql' || client === 'd1:sqlite' ? `Promise<${returnType}>` : returnType;
328
346
  writer.write(`export ${asyncModified}function ${camelCaseName}(${functionArguments}): ${returnTypeModifier}`).block(() => {
329
347
  var _a, _b, _c, _d, _e, _f;
330
348
  writer.write('const where = whereConditionsToObject(params?.where);').newLine();
@@ -334,7 +352,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
334
352
  writer.write('const paramsValues: any = [];').newLine();
335
353
  const hasCte = (((_a = tsDescriptor.dynamicQuery2) === null || _a === void 0 ? void 0 : _a.with.length) || 0) > 0;
336
354
  if (hasCte) {
337
- writer.writeLine(`const withClause = [];`);
355
+ writer.writeLine('const withClause = [];');
338
356
  (_b = tsDescriptor.dynamicQuery2) === null || _b === void 0 ? void 0 : _b.with.forEach((withFragment, index, array) => {
339
357
  var _a;
340
358
  const selectConditions = withFragment.dependOnFields.map((fieldIndex) => `params.select.${tsDescriptor.columns[fieldIndex].name}`);
@@ -463,6 +481,14 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
463
481
  .indent()
464
482
  .write(`.map(data => mapArrayTo${resultTypeName}(data, params?.select))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
465
483
  }
484
+ if (client === 'd1:sqlite') {
485
+ writer.write('return db.prepare(sql)').newLine();
486
+ writer.indent().write('.bind(...paramsValues)').newLine();
487
+ writer.indent().write('.raw()').newLine();
488
+ writer
489
+ .indent()
490
+ .write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row, params?.select)))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
491
+ }
466
492
  if (client === 'libsql') {
467
493
  writer.write('return client.execute({ sql, args: paramsValues })').newLine();
468
494
  writer.indent().write('.then(res => res.rows)').newLine();
@@ -631,120 +657,38 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
631
657
  writer.blankLine();
632
658
  }
633
659
  if (isCrud) {
634
- const crudFunction = client === 'libsql'
660
+ const crudFunction = client === 'libsql' || client === 'd1:sqlite'
635
661
  ? `async function ${camelCaseName}(${functionArguments}): Promise<${returnType}>`
636
662
  : `function ${camelCaseName}(${functionArguments}): ${returnType}`;
637
663
  writer.write(`export ${crudFunction}`).block(() => {
638
664
  const idColumn = tsDescriptor.parameters[0].name;
639
- writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, client == 'bun:sqlite' ? queryParamsWithoutBrackets : queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
665
+ writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, client === 'bun:sqlite' || client === 'd1:sqlite' ? queryParamsWithoutBrackets : queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
640
666
  });
641
- }
642
- if (tsDescriptor.dynamicQuery2 == null && !isCrud && (queryType === 'Select' || (queryType === 'Insert' && tsDescriptor.returning))) {
643
- if (client === 'better-sqlite3') {
644
- writer.write(`export function ${camelCaseName}(${functionArguments}): ${returnType}`).block(() => {
645
- const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
646
- const sqlSplit = processedSql.split('\n');
647
- writer.write('const sql = `').newLine();
648
- sqlSplit.forEach((sqlLine) => {
649
- writer.indent().write(sqlLine).newLine();
650
- });
651
- writer.indent().write('`').newLine();
652
- writer.write('return db.prepare(sql)').newLine();
653
- writer.indent().write('.raw(true)').newLine();
654
- writer.indent().write(`.all(${queryParams})`).newLine();
655
- writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
656
- });
657
- }
658
- if (client === 'bun:sqlite') {
659
- writer.write(`export function ${camelCaseName}(${functionArguments}): ${returnType}`).block(() => {
660
- const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
661
- const sqlSplit = processedSql.split('\n');
662
- writer.write('const sql = `').newLine();
663
- sqlSplit.forEach((sqlLine) => {
664
- writer.indent().write(sqlLine).newLine();
665
- });
666
- writer.indent().write('`').newLine();
667
- writer.write('return db.prepare(sql)').newLine();
668
- writer.indent().write(`.values(${queryParamsWithoutBrackets})`).newLine();
669
- writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${tsDescriptor.multipleRowsResult ? '' : '[0]'};`);
670
- });
671
- }
672
- if (!isCrud && client === 'libsql') {
673
- writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${returnType}>`).block(() => {
674
- const processedSql = tsDescriptor.orderByColumns ? (0, code_generator_1.replaceOrderByParam)(sql) : sql;
675
- const sqlSplit = processedSql.split('\n');
676
- writer.write('const sql = `').newLine();
677
- sqlSplit.forEach((sqlLine) => {
678
- writer.indent().write(sqlLine).newLine();
679
- });
680
- writer.indent().write('`').newLine();
681
- const executeParams = queryParams !== '' ? `{ sql, args: ${queryParams} }` : 'sql';
682
- writer.write(`return client.execute(${executeParams})`).newLine();
683
- if (queryType === 'Select') {
684
- writer.indent().write('.then(res => res.rows)').newLine();
685
- if (tsDescriptor.multipleRowsResult) {
686
- writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
687
- }
688
- else {
689
- writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
690
- }
691
- }
692
- if (queryType === 'Insert') {
693
- if (tsDescriptor.returning) {
694
- writer.indent().write('.then(res => res.rows)').newLine();
695
- writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
696
- }
697
- else {
698
- writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`);
699
- }
700
- }
701
- });
702
- }
703
- }
704
- if (!isCrud && (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !tsDescriptor.returning))) {
705
- if (client === 'better-sqlite3' || client === 'bun:sqlite') {
706
- writer.write(`export function ${camelCaseName}(${functionArguments}): ${resultTypeName}`).block(() => {
707
- const params = client === 'better-sqlite3' ? queryParams : queryParamsWithoutBrackets;
708
- writeExecuteBlock(sql, params, resultTypeName, writer);
709
- });
667
+ if (client !== 'd1:sqlite' && (queryType === 'Select' || tsDescriptor.returning)) {
668
+ writer.blankLine();
669
+ writeMapFunction(writer, { resultTypeName, columns: tsDescriptor.columns });
710
670
  }
711
- if (client === 'libsql') {
712
- writer.write(`export async function ${camelCaseName}(${functionArguments}): Promise<${resultTypeName}>`).block(() => {
713
- const sqlSplit = sql.split('\n');
714
- writer.write('const sql = `').newLine();
715
- sqlSplit.forEach((sqlLine) => {
716
- writer.indent().write(sqlLine).newLine();
717
- });
718
- writer.indent().write('`').newLine();
719
- const executeParams = queryParams !== '' ? `{ sql, args: ${queryParams} }` : 'sql';
720
- writer.write(`return client.execute(${executeParams})`).newLine();
721
- writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`);
722
- });
671
+ if (client === 'libsql' && queryType !== 'Select' && !tsDescriptor.returning) {
672
+ writer.blankLine();
673
+ writeMapFunctionByName(writer, { resultTypeName, columns: tsDescriptor.columns });
723
674
  }
724
675
  }
725
- if ((queryType === 'Select' || tsDescriptor.returning) && tsDescriptor.dynamicQuery2 == null) {
726
- writer.blankLine();
727
- writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
728
- writer.write(`const result: ${resultTypeName} = `).block(() => {
729
- tsDescriptor.columns.forEach((col, index) => {
730
- const separator = index < tsDescriptor.columns.length - 1 ? ',' : '';
731
- writer.writeLine(`${col.name}: ${toDriver(`data[${index}]`, col)}${separator}`);
732
- });
733
- });
734
- writer.writeLine('return result;');
735
- });
736
- }
737
- else if (client === 'libsql' && !tsDescriptor.returning && tsDescriptor.dynamicQuery2 == null) {
738
- writer.blankLine();
739
- writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
740
- writer.write(`const result: ${resultTypeName} = `).block(() => {
741
- tsDescriptor.columns.forEach((col, index) => {
742
- const separator = index < tsDescriptor.columns.length - 1 ? ',' : '';
743
- writer.writeLine(`${col.name}: data.${col.name}${separator}`);
744
- });
745
- });
746
- writer.writeLine('return result;');
747
- });
676
+ const executeFunctionParams = {
677
+ functionName: camelCaseName,
678
+ returnType,
679
+ resultTypeName,
680
+ dataTypeName,
681
+ sql: (0, code_generator_1.replaceOrderByParam)(sql),
682
+ multipleRowsResult: tsDescriptor.multipleRowsResult,
683
+ parameters: allParameters,
684
+ columns: tsDescriptor.columns,
685
+ queryType,
686
+ paramsTypeName,
687
+ returning: tsDescriptor.returning || false,
688
+ orderBy: (((_b = tsDescriptor.orderByColumns) === null || _b === void 0 ? void 0 : _b.length) || 0) > 0
689
+ };
690
+ if (tsDescriptor.dynamicQuery2 == null && !isCrud) {
691
+ writeExecFunction(writer, client, executeFunctionParams);
748
692
  }
749
693
  if (tsDescriptor.orderByColumns) {
750
694
  const orderByType = tsDescriptor.dynamicQuery2 == null ? paramsTypeName : dynamicParamsTypeName;
@@ -786,7 +730,7 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
786
730
  relations.forEach((relation, index) => {
787
731
  const relationType = (0, code_generator_1.generateRelationType)(capitalizedName, relation.name);
788
732
  if (index === 0) {
789
- if (client === 'better-sqlite3' || client == 'bun:sqlite') {
733
+ if (client === 'better-sqlite3' || client === 'bun:sqlite') {
790
734
  writer.write(`export function ${camelCaseName}Nested(${functionArguments}): ${relationType}[]`).block(() => {
791
735
  const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
792
736
  writer.writeLine(`const selectResult = ${camelCaseName}(db${params});`);
@@ -796,10 +740,11 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
796
740
  writer.writeLine(`return collect${relationType}(selectResult);`);
797
741
  });
798
742
  }
799
- else if (client === 'libsql') {
743
+ else if (client === 'libsql' || client === 'd1:sqlite') {
800
744
  writer.write(`export async function ${camelCaseName}Nested(${functionArguments}): Promise<${relationType}[]>`).block(() => {
801
745
  const params = tsDescriptor.parameters.length > 0 ? ', params' : '';
802
- writer.writeLine(`const selectResult = await ${camelCaseName}(client${params});`);
746
+ const functionParam = client === 'libsql' ? `client${params}` : `db${params}`;
747
+ writer.writeLine(`const selectResult = await ${camelCaseName}(${functionParam});`);
803
748
  writer.write('if (selectResult.length == 0)').block(() => {
804
749
  writer.writeLine('return [];');
805
750
  });
@@ -823,16 +768,6 @@ function generateCodeFromTsDescriptor(client, queryName, tsDescriptor, isCrud =
823
768
  }
824
769
  return writer.toString();
825
770
  }
826
- function writeExecuteBlock(sql, queryParams, resultTypeName, writer) {
827
- const sqlSplit = sql.split('\n');
828
- writer.write('const sql = `').newLine();
829
- sqlSplit.forEach((sqlLine) => {
830
- writer.indent().write(sqlLine).newLine();
831
- });
832
- writer.indent().write('`').newLine();
833
- writer.write('return db.prepare(sql)').newLine();
834
- writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`);
835
- }
836
771
  function writeExecuteCrudBlock(client, queryType, tableName, columns, idColumn, queryParams, paramTypeName, dataTypeName, resultTypeName, writer) {
837
772
  switch (queryType) {
838
773
  case 'Select':
@@ -866,6 +801,11 @@ function writeExecutSelectCrudBlock(client, tableName, idColumn, columns, queryP
866
801
  writer.indent().write(`.values(${queryParams})`).newLine();
867
802
  writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))[0];`);
868
803
  }
804
+ else if (client === 'd1:sqlite') {
805
+ writer.write('return db.prepare(sql)').newLine();
806
+ writer.indent().write(`.bind(${queryParams})`).newLine();
807
+ writer.indent().write('.first();').newLine();
808
+ }
869
809
  else {
870
810
  writer.write(`return client.execute({ sql, args: ${queryParams} })`).newLine();
871
811
  writer.indent().write('.then(res => res.rows)').newLine();
@@ -886,10 +826,16 @@ function writeExecuteInsertCrudBlock(client, tableName, paramTypeName, resultTyp
886
826
  writer.write('return db.prepare(sql)').newLine();
887
827
  writer.indent().write(`.run(values) as ${resultTypeName};`);
888
828
  }
889
- else if (client == 'bun:sqlite') {
829
+ else if (client === 'bun:sqlite') {
890
830
  writer.write('return db.prepare(sql)').newLine();
891
831
  writer.indent().write(`.run(...values) as ${resultTypeName};`);
892
832
  }
833
+ else if (client === 'd1:sqlite') {
834
+ writer.write('return db.prepare(sql)').newLine();
835
+ writer.indent().write('.bind(...values)').newLine();
836
+ writer.indent().write('.run()').newLine();
837
+ writer.indent().write('.then(res => res.meta);');
838
+ }
893
839
  else {
894
840
  writer.write('return client.execute({ sql, args: values })').newLine();
895
841
  writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
@@ -914,6 +860,12 @@ function writeExecuteUpdateCrudBlock(client, tableName, idColumn, paramTypeName,
914
860
  writer.write('return db.prepare(sql)').newLine();
915
861
  writer.indent().write(`.run(...values) as ${resultTypeName};`);
916
862
  }
863
+ else if (client === 'd1:sqlite') {
864
+ writer.write('return db.prepare(sql)').newLine();
865
+ writer.indent().write(`.bind(params.${idColumn})`).newLine();
866
+ writer.indent().write('.run()').newLine();
867
+ writer.indent().write('.then(res => res.meta);');
868
+ }
917
869
  else {
918
870
  writer.write('return client.execute({ sql, args: values })').newLine();
919
871
  writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
@@ -933,6 +885,12 @@ function writeExecutDeleteCrudBlock(client, tableName, idColumn, queryParams, re
933
885
  writer.write('return db.prepare(sql)').newLine();
934
886
  writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`).newLine();
935
887
  }
888
+ else if (client === 'd1:sqlite') {
889
+ writer.write('return db.prepare(sql)').newLine();
890
+ writer.indent().write(`.bind(${queryParams})`).newLine();
891
+ writer.indent().write('.run()').newLine();
892
+ writer.indent().write('.then(res => res.meta);');
893
+ }
936
894
  else {
937
895
  writer.write(`return client.execute({ sql, args: ${queryParams} })`).newLine();
938
896
  writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`).newLine();
@@ -989,4 +947,191 @@ function writeCollectFunction(writer, relation, columns, capitalizedName, result
989
947
  .write('))');
990
948
  });
991
949
  }
950
+ function writeImports(writer, client, isDynamicQuery) {
951
+ switch (client) {
952
+ case 'better-sqlite3':
953
+ writer.writeLine(`import type { Database } from 'better-sqlite3';`);
954
+ if (isDynamicQuery) {
955
+ writer.writeLine(`import { EOL } from 'os';`);
956
+ }
957
+ return;
958
+ case 'libsql':
959
+ writer.writeLine(`import type { Client, Transaction } from '@libsql/client';`);
960
+ if (isDynamicQuery) {
961
+ writer.writeLine(`import { EOL } from 'os';`);
962
+ }
963
+ return;
964
+ case 'bun:sqlite':
965
+ writer.writeLine(`import type { Database } from 'bun:sqlite';`);
966
+ if (isDynamicQuery) {
967
+ writer.writeLine(`import { EOL } from 'os';`);
968
+ }
969
+ return;
970
+ case 'd1:sqlite':
971
+ writer.writeLine(`import type { D1Database } from '@cloudflare/workers-types';`);
972
+ if (isDynamicQuery) {
973
+ writer.writeLine(`const EOL = '\\n';`);
974
+ }
975
+ return;
976
+ default:
977
+ return client;
978
+ }
979
+ }
980
+ function writeExecFunction(writer, client, params) {
981
+ const { functionName, returnType, sql, multipleRowsResult, parameters, columns, queryType, returning, paramsTypeName, resultTypeName, dataTypeName, orderBy } = params;
982
+ let restParameters = queryType === 'Update' ? `, data: ${dataTypeName}` : '';
983
+ const dynamicQuery = false;
984
+ if (!dynamicQuery) {
985
+ restParameters += parameters.length > 0 || orderBy ? `, params: ${paramsTypeName}` : '';
986
+ }
987
+ const queryParametersWithoutBrackes = parameters.join(', ');
988
+ const queryParams = queryParametersWithoutBrackes != '' ? `[${queryParametersWithoutBrackes}]` : '';
989
+ const mapFunctionParams = {
990
+ resultTypeName,
991
+ columns
992
+ };
993
+ switch (client) {
994
+ case 'better-sqlite3':
995
+ const betterSqliteArgs = 'db: Database' + restParameters;
996
+ if (queryType === 'Select') {
997
+ writer.write(`export function ${functionName}(${betterSqliteArgs}): ${returnType}`).block(() => {
998
+ writeSql(writer, sql);
999
+ writer.write('return db.prepare(sql)').newLine();
1000
+ writer.indent().write('.raw(true)').newLine();
1001
+ writer.indent().write(`.all(${queryParams})`).newLine();
1002
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${multipleRowsResult ? '' : '[0]'};`);
1003
+ });
1004
+ writer.blankLine();
1005
+ writeMapFunction(writer, mapFunctionParams);
1006
+ }
1007
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
1008
+ writer.write(`export function ${functionName}(${betterSqliteArgs}): ${resultTypeName}`).block(() => {
1009
+ writeSql(writer, sql);
1010
+ writer.write('return db.prepare(sql)').newLine();
1011
+ writer.indent().write(`.run(${queryParams}) as ${resultTypeName};`);
1012
+ });
1013
+ }
1014
+ return;
1015
+ case 'libsql':
1016
+ const libSqlArgs = 'client: Client | Transaction' + restParameters;
1017
+ writer.write(`export async function ${functionName}(${libSqlArgs}): Promise<${returnType}>`).block(() => {
1018
+ writeSql(writer, sql);
1019
+ const executeParams = queryParametersWithoutBrackes !== '' ? `{ sql, args: [${queryParametersWithoutBrackes}] }` : 'sql';
1020
+ writer.write(`return client.execute(${executeParams})`).newLine();
1021
+ if (queryType === 'Select') {
1022
+ writer.indent().write('.then(res => res.rows)').newLine();
1023
+ if (multipleRowsResult) {
1024
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
1025
+ }
1026
+ else {
1027
+ writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
1028
+ }
1029
+ }
1030
+ if (queryType === 'Insert') {
1031
+ if (returning) {
1032
+ writer.indent().write('.then(res => res.rows)').newLine();
1033
+ writer.indent().write(`.then(rows => mapArrayTo${resultTypeName}(rows[0]));`);
1034
+ }
1035
+ }
1036
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
1037
+ writer.indent().write(`.then(res => mapArrayTo${resultTypeName}(res));`);
1038
+ }
1039
+ });
1040
+ writer.blankLine();
1041
+ if (queryType === 'Select' || returning) {
1042
+ writeMapFunction(writer, mapFunctionParams);
1043
+ }
1044
+ else {
1045
+ writeMapFunctionByName(writer, mapFunctionParams);
1046
+ }
1047
+ return;
1048
+ case 'bun:sqlite':
1049
+ const bunArgs = 'db: Database' + restParameters;
1050
+ if (queryType === 'Select') {
1051
+ writer.write(`export function ${functionName}(${bunArgs}): ${returnType}`).block(() => {
1052
+ writeSql(writer, sql);
1053
+ writer.write('return db.prepare(sql)').newLine();
1054
+ writer.indent().write(`.values(${queryParametersWithoutBrackes})`).newLine();
1055
+ writer.indent().write(`.map(data => mapArrayTo${resultTypeName}(data))${multipleRowsResult ? '' : '[0]'};`);
1056
+ });
1057
+ writer.blankLine();
1058
+ writeMapFunction(writer, mapFunctionParams);
1059
+ }
1060
+ if (queryType === 'Update' || queryType === 'Delete' || (queryType === 'Insert' && !returning)) {
1061
+ writer.write(`export function ${functionName}(${bunArgs}): ${resultTypeName}`).block(() => {
1062
+ writeSql(writer, sql);
1063
+ writer.write('return db.prepare(sql)').newLine();
1064
+ writer.indent().write(`.run(${queryParametersWithoutBrackes}) as ${resultTypeName};`);
1065
+ });
1066
+ }
1067
+ return;
1068
+ case 'd1:sqlite':
1069
+ const d1Args = 'db: D1Database' + restParameters;
1070
+ writer.write(`export async function ${functionName}(${d1Args}): Promise<${returnType}>`).block(() => {
1071
+ writeSql(writer, sql);
1072
+ writer.write('return db.prepare(sql)').newLine();
1073
+ if (queryParametersWithoutBrackes !== '') {
1074
+ writer.indent().write(`.bind(${queryParametersWithoutBrackes})`).newLine();
1075
+ }
1076
+ if (queryType === 'Select') {
1077
+ writer.indent().write('.raw({ columnNames: false })').newLine();
1078
+ if (multipleRowsResult) {
1079
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row)));`);
1080
+ }
1081
+ else {
1082
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row))[0]);`);
1083
+ }
1084
+ }
1085
+ if (queryType === 'Insert' || queryType === 'Update' || queryType === 'Delete') {
1086
+ if (returning) {
1087
+ writer.indent().write('.raw({ columnNames: false })').newLine();
1088
+ writer.indent().write(`.then(rows => rows.map(row => mapArrayTo${resultTypeName}(row))[0]);`);
1089
+ }
1090
+ else {
1091
+ writer.indent().write('.run()').newLine();
1092
+ writer.indent().write(`.then(res => res.meta);`);
1093
+ }
1094
+ }
1095
+ });
1096
+ if (queryType === 'Select' || returning) {
1097
+ writer.blankLine();
1098
+ writeMapFunction(writer, mapFunctionParams);
1099
+ }
1100
+ return;
1101
+ default:
1102
+ return client;
1103
+ }
1104
+ }
1105
+ function writeSql(writer, sql) {
1106
+ const sqlSplit = sql.split('\n');
1107
+ writer.write('const sql = `').newLine();
1108
+ sqlSplit.forEach((sqlLine) => {
1109
+ writer.indent().write(sqlLine).newLine();
1110
+ });
1111
+ writer.indent().write('`').newLine();
1112
+ }
1113
+ function writeMapFunction(writer, params) {
1114
+ const { resultTypeName, columns } = params;
1115
+ writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
1116
+ writer.write(`const result: ${resultTypeName} = `).block(() => {
1117
+ columns.forEach((col, index) => {
1118
+ const separator = index < columns.length - 1 ? ',' : '';
1119
+ writer.writeLine(`${col.name}: ${toDriver(`data[${index}]`, col)}${separator}`);
1120
+ });
1121
+ });
1122
+ writer.writeLine('return result;');
1123
+ });
1124
+ }
1125
+ function writeMapFunctionByName(writer, params) {
1126
+ const { resultTypeName, columns } = params;
1127
+ writer.write(`function mapArrayTo${resultTypeName}(data: any) `).block(() => {
1128
+ writer.write(`const result: ${resultTypeName} = `).block(() => {
1129
+ columns.forEach((col, index) => {
1130
+ const separator = index < columns.length - 1 ? ',' : '';
1131
+ writer.writeLine(`${col.name}: data.${col.name}${separator}`);
1132
+ });
1133
+ });
1134
+ writer.writeLine('return result;');
1135
+ });
1136
+ }
992
1137
  //# sourceMappingURL=code-generator.js.map