@type32/tauri-sqlite-orm 0.2.2 → 0.2.4

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/dist/index.d.mts CHANGED
@@ -80,10 +80,23 @@ declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns exten
80
80
  innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
81
81
  include(relations: IncludeRelations<TTable>): this;
82
82
  private buildJoins;
83
- execute(): Promise<any[]>;
83
+ execute(): Promise<InferSelectModel<TTable>[]>;
84
84
  private processRelationResults;
85
- all(): Promise<any[]>;
86
- get(): Promise<any | undefined>;
85
+ all(): Promise<InferSelectModel<TTable>[]>;
86
+ get(): Promise<InferSelectModel<TTable> | undefined>;
87
+ exists(): Promise<boolean>;
88
+ count(): Promise<number>;
89
+ first(): Promise<InferSelectModel<TTable> | undefined>;
90
+ pluck<K extends keyof TTable['_']['columns']>(column: K): Promise<InferSelectModel<TTable>[K][]>;
91
+ paginate(page?: number, pageSize?: number): Promise<{
92
+ data: InferSelectModel<TTable>[];
93
+ total: number;
94
+ page: number;
95
+ pageSize: number;
96
+ totalPages: number;
97
+ hasNextPage: boolean;
98
+ hasPrevPage: boolean;
99
+ }>;
87
100
  toSQL(): {
88
101
  sql: string;
89
102
  params: any[];
@@ -107,6 +120,7 @@ declare class UpdateQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
107
120
  private buildUpdateClause;
108
121
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
109
122
  returningAll(): Promise<InferSelectModel<T>[]>;
123
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
110
124
  toSQL(): {
111
125
  sql: string;
112
126
  params: any[];
@@ -132,6 +146,7 @@ declare class InsertQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
132
146
  private buildConflictClause;
133
147
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
134
148
  returningAll(): Promise<InferSelectModel<T>[]>;
149
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
135
150
  toSQL(): {
136
151
  sql: string;
137
152
  params: any[];
@@ -149,6 +164,7 @@ declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
149
164
  returning(...columns: (keyof T['_']['columns'])[]): this;
150
165
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
151
166
  returningAll(): Promise<InferSelectModel<T>[]>;
167
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
152
168
  toSQL(): {
153
169
  sql: string;
154
170
  params: any[];
@@ -268,6 +284,10 @@ declare class TauriORM {
268
284
  insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
269
285
  update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
270
286
  delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
287
+ upsert<T extends AnyTable>(table: T, data: InferInsertModel<T>, conflictTarget: (keyof T['_']['columns'])[]): Promise<T extends AnyTable ? {
288
+ lastInsertId: number;
289
+ rowsAffected: number;
290
+ }[] : never>;
271
291
  $with(alias: string): {
272
292
  as: (query: {
273
293
  sql: string;
package/dist/index.d.ts CHANGED
@@ -80,10 +80,23 @@ declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns exten
80
80
  innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
81
81
  include(relations: IncludeRelations<TTable>): this;
82
82
  private buildJoins;
83
- execute(): Promise<any[]>;
83
+ execute(): Promise<InferSelectModel<TTable>[]>;
84
84
  private processRelationResults;
85
- all(): Promise<any[]>;
86
- get(): Promise<any | undefined>;
85
+ all(): Promise<InferSelectModel<TTable>[]>;
86
+ get(): Promise<InferSelectModel<TTable> | undefined>;
87
+ exists(): Promise<boolean>;
88
+ count(): Promise<number>;
89
+ first(): Promise<InferSelectModel<TTable> | undefined>;
90
+ pluck<K extends keyof TTable['_']['columns']>(column: K): Promise<InferSelectModel<TTable>[K][]>;
91
+ paginate(page?: number, pageSize?: number): Promise<{
92
+ data: InferSelectModel<TTable>[];
93
+ total: number;
94
+ page: number;
95
+ pageSize: number;
96
+ totalPages: number;
97
+ hasNextPage: boolean;
98
+ hasPrevPage: boolean;
99
+ }>;
87
100
  toSQL(): {
88
101
  sql: string;
89
102
  params: any[];
@@ -107,6 +120,7 @@ declare class UpdateQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
107
120
  private buildUpdateClause;
108
121
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
109
122
  returningAll(): Promise<InferSelectModel<T>[]>;
123
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
110
124
  toSQL(): {
111
125
  sql: string;
112
126
  params: any[];
@@ -132,6 +146,7 @@ declare class InsertQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
132
146
  private buildConflictClause;
133
147
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
134
148
  returningAll(): Promise<InferSelectModel<T>[]>;
149
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
135
150
  toSQL(): {
136
151
  sql: string;
137
152
  params: any[];
@@ -149,6 +164,7 @@ declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
149
164
  returning(...columns: (keyof T['_']['columns'])[]): this;
150
165
  execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
151
166
  returningAll(): Promise<InferSelectModel<T>[]>;
167
+ returningFirst(): Promise<InferSelectModel<T> | undefined>;
152
168
  toSQL(): {
153
169
  sql: string;
154
170
  params: any[];
@@ -268,6 +284,10 @@ declare class TauriORM {
268
284
  insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
269
285
  update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
270
286
  delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
287
+ upsert<T extends AnyTable>(table: T, data: InferInsertModel<T>, conflictTarget: (keyof T['_']['columns'])[]): Promise<T extends AnyTable ? {
288
+ lastInsertId: number;
289
+ rowsAffected: number;
290
+ }[] : never>;
271
291
  $with(alias: string): {
272
292
  as: (query: {
273
293
  sql: string;
package/dist/index.js CHANGED
@@ -594,6 +594,57 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
594
594
  const result = await this.execute();
595
595
  return result[0];
596
596
  }
597
+ async exists() {
598
+ const originalColumns = this.selectedColumns;
599
+ this.selectedColumns = ["1"];
600
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
601
+ const query = `SELECT 1 ${this.query}${joinSql} LIMIT 1`;
602
+ const params = [...this.params, ...joinParams];
603
+ this.selectedColumns = originalColumns;
604
+ const result = await this.db.select(query, params);
605
+ return result.length > 0;
606
+ }
607
+ async count() {
608
+ const originalColumns = this.selectedColumns;
609
+ this.selectedColumns = ["COUNT(*) as count"];
610
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
611
+ const query = `SELECT COUNT(*) as count ${this.query}${joinSql}`;
612
+ const params = [...this.params, ...joinParams];
613
+ this.selectedColumns = originalColumns;
614
+ const result = await this.db.select(query, params);
615
+ return result[0]?.count || 0;
616
+ }
617
+ async first() {
618
+ return this.get();
619
+ }
620
+ async pluck(column) {
621
+ const columnName = this.table._.columns[column]._.name;
622
+ const originalColumns = this.selectedColumns;
623
+ this.selectedColumns = [`${this.selectedTableAlias}.${columnName} AS "${columnName}"`];
624
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
625
+ const query = `SELECT ${this.selectedColumns.join(", ")} ${this.query}${joinSql}`;
626
+ const params = [...this.params, ...joinParams];
627
+ this.selectedColumns = originalColumns;
628
+ const results = await this.db.select(query, params);
629
+ return results.map((row) => row[columnName]);
630
+ }
631
+ async paginate(page = 1, pageSize = 10) {
632
+ if (page < 1) page = 1;
633
+ if (pageSize < 1) pageSize = 10;
634
+ const total = await this.count();
635
+ const totalPages = Math.ceil(total / pageSize);
636
+ const offset = (page - 1) * pageSize;
637
+ const data = await this.limit(pageSize).offset(offset).all();
638
+ return {
639
+ data,
640
+ total,
641
+ page,
642
+ pageSize,
643
+ totalPages,
644
+ hasNextPage: page < totalPages,
645
+ hasPrevPage: page > 1
646
+ };
647
+ }
597
648
  toSQL() {
598
649
  const { sql: joinSql, params: joinParams } = this.buildJoins();
599
650
  const distinct = this.isDistinct ? "DISTINCT " : "";
@@ -781,6 +832,13 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
781
832
  );
782
833
  return this.returning(...allColumns).execute();
783
834
  }
835
+ async returningFirst() {
836
+ const allColumns = Object.keys(
837
+ this.table._.columns
838
+ );
839
+ const results = await this.returning(...allColumns).execute();
840
+ return results[0];
841
+ }
784
842
  toSQL() {
785
843
  const { sql: updateSql, params } = this.buildUpdateClause();
786
844
  if (this.returningColumns.length > 0) {
@@ -918,6 +976,13 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
918
976
  );
919
977
  return this.returning(...allColumns).execute();
920
978
  }
979
+ async returningFirst() {
980
+ const allColumns = Object.keys(
981
+ this.table._.columns
982
+ );
983
+ const results = await this.returning(...allColumns).execute();
984
+ return results[0];
985
+ }
921
986
  toSQL() {
922
987
  if (this.dataSets.length === 0) {
923
988
  throw new InsertValidationError("No data provided for insert. Use .values() to provide data.");
@@ -996,6 +1061,11 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
996
1061
  const allColumns = Object.keys(this.table._.columns);
997
1062
  return this.returning(...allColumns).execute();
998
1063
  }
1064
+ async returningFirst() {
1065
+ const allColumns = Object.keys(this.table._.columns);
1066
+ const results = await this.returning(...allColumns).execute();
1067
+ return results[0];
1068
+ }
999
1069
  toSQL() {
1000
1070
  const { sql: sql2, params } = this.build();
1001
1071
  if (this.returningColumns.length > 0) {
@@ -1253,6 +1323,13 @@ var TauriORM = class {
1253
1323
  delete(table) {
1254
1324
  return new DeleteQueryBuilder(this.db, table);
1255
1325
  }
1326
+ async upsert(table, data, conflictTarget) {
1327
+ const columns = conflictTarget.map((col) => table._.columns[col]);
1328
+ return this.insert(table).values(data).onConflictDoUpdate({
1329
+ target: columns.length === 1 ? columns[0] : columns,
1330
+ set: data
1331
+ }).execute();
1332
+ }
1256
1333
  $with(alias2) {
1257
1334
  const withBuilder = new WithQueryBuilder(this.db);
1258
1335
  return {
package/dist/index.mjs CHANGED
@@ -495,6 +495,57 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
495
495
  const result = await this.execute();
496
496
  return result[0];
497
497
  }
498
+ async exists() {
499
+ const originalColumns = this.selectedColumns;
500
+ this.selectedColumns = ["1"];
501
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
502
+ const query = `SELECT 1 ${this.query}${joinSql} LIMIT 1`;
503
+ const params = [...this.params, ...joinParams];
504
+ this.selectedColumns = originalColumns;
505
+ const result = await this.db.select(query, params);
506
+ return result.length > 0;
507
+ }
508
+ async count() {
509
+ const originalColumns = this.selectedColumns;
510
+ this.selectedColumns = ["COUNT(*) as count"];
511
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
512
+ const query = `SELECT COUNT(*) as count ${this.query}${joinSql}`;
513
+ const params = [...this.params, ...joinParams];
514
+ this.selectedColumns = originalColumns;
515
+ const result = await this.db.select(query, params);
516
+ return result[0]?.count || 0;
517
+ }
518
+ async first() {
519
+ return this.get();
520
+ }
521
+ async pluck(column) {
522
+ const columnName = this.table._.columns[column]._.name;
523
+ const originalColumns = this.selectedColumns;
524
+ this.selectedColumns = [`${this.selectedTableAlias}.${columnName} AS "${columnName}"`];
525
+ const { sql: joinSql, params: joinParams } = this.buildJoins();
526
+ const query = `SELECT ${this.selectedColumns.join(", ")} ${this.query}${joinSql}`;
527
+ const params = [...this.params, ...joinParams];
528
+ this.selectedColumns = originalColumns;
529
+ const results = await this.db.select(query, params);
530
+ return results.map((row) => row[columnName]);
531
+ }
532
+ async paginate(page = 1, pageSize = 10) {
533
+ if (page < 1) page = 1;
534
+ if (pageSize < 1) pageSize = 10;
535
+ const total = await this.count();
536
+ const totalPages = Math.ceil(total / pageSize);
537
+ const offset = (page - 1) * pageSize;
538
+ const data = await this.limit(pageSize).offset(offset).all();
539
+ return {
540
+ data,
541
+ total,
542
+ page,
543
+ pageSize,
544
+ totalPages,
545
+ hasNextPage: page < totalPages,
546
+ hasPrevPage: page > 1
547
+ };
548
+ }
498
549
  toSQL() {
499
550
  const { sql: joinSql, params: joinParams } = this.buildJoins();
500
551
  const distinct = this.isDistinct ? "DISTINCT " : "";
@@ -682,6 +733,13 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
682
733
  );
683
734
  return this.returning(...allColumns).execute();
684
735
  }
736
+ async returningFirst() {
737
+ const allColumns = Object.keys(
738
+ this.table._.columns
739
+ );
740
+ const results = await this.returning(...allColumns).execute();
741
+ return results[0];
742
+ }
685
743
  toSQL() {
686
744
  const { sql: updateSql, params } = this.buildUpdateClause();
687
745
  if (this.returningColumns.length > 0) {
@@ -819,6 +877,13 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
819
877
  );
820
878
  return this.returning(...allColumns).execute();
821
879
  }
880
+ async returningFirst() {
881
+ const allColumns = Object.keys(
882
+ this.table._.columns
883
+ );
884
+ const results = await this.returning(...allColumns).execute();
885
+ return results[0];
886
+ }
822
887
  toSQL() {
823
888
  if (this.dataSets.length === 0) {
824
889
  throw new InsertValidationError("No data provided for insert. Use .values() to provide data.");
@@ -897,6 +962,11 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
897
962
  const allColumns = Object.keys(this.table._.columns);
898
963
  return this.returning(...allColumns).execute();
899
964
  }
965
+ async returningFirst() {
966
+ const allColumns = Object.keys(this.table._.columns);
967
+ const results = await this.returning(...allColumns).execute();
968
+ return results[0];
969
+ }
900
970
  toSQL() {
901
971
  const { sql: sql2, params } = this.build();
902
972
  if (this.returningColumns.length > 0) {
@@ -1154,6 +1224,13 @@ var TauriORM = class {
1154
1224
  delete(table) {
1155
1225
  return new DeleteQueryBuilder(this.db, table);
1156
1226
  }
1227
+ async upsert(table, data, conflictTarget) {
1228
+ const columns = conflictTarget.map((col) => table._.columns[col]);
1229
+ return this.insert(table).values(data).onConflictDoUpdate({
1230
+ target: columns.length === 1 ? columns[0] : columns,
1231
+ set: data
1232
+ }).execute();
1233
+ }
1157
1234
  $with(alias2) {
1158
1235
  const withBuilder = new WithQueryBuilder(this.db);
1159
1236
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@type32/tauri-sqlite-orm",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "A Drizzle-like ORM for Tauri v2's SQL JS API plugin.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",