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.
- package/cli.js +17 -11
- package/cli.js.map +1 -1
- package/code-generator.d.ts +1 -1
- package/code-generator.d.ts.map +1 -1
- package/code-generator.js +11 -3
- package/code-generator.js.map +1 -1
- package/package.json +4 -2
- package/sqlite-query-analyzer/code-generator.d.ts.map +1 -1
- package/sqlite-query-analyzer/code-generator.js +289 -144
- package/sqlite-query-analyzer/code-generator.js.map +1 -1
- package/sqlite-query-analyzer/query-executor.d.ts +1 -0
- package/sqlite-query-analyzer/query-executor.d.ts.map +1 -1
- package/sqlite-query-analyzer/query-executor.js +11 -0
- package/sqlite-query-analyzer/query-executor.js.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js +7 -3
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
- package/types.d.ts +7 -2
- package/types.d.ts.map +1 -1
@@ -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
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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
|
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
|
-
|
274
|
-
|
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(
|
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
|
665
|
+
writeExecuteCrudBlock(client, queryType, tableName, tsDescriptor.columns, idColumn, client === 'bun:sqlite' || client === 'd1:sqlite' ? queryParamsWithoutBrackets : queryParams, paramsTypeName, dataTypeName, resultTypeName, writer);
|
640
666
|
});
|
641
|
-
|
642
|
-
|
643
|
-
|
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.
|
713
|
-
|
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
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
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
|
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
|
-
|
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
|
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
|