@type32/tauri-sqlite-orm 0.1.18-5 → 0.1.18-6

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
@@ -38,6 +38,7 @@ declare class SQLiteColumn<TName extends string = string, TType extends ColumnDa
38
38
  unique(): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
39
39
  references<T extends AnyTable, K extends keyof T["_"]["columns"] & string>(ref: T, column: K): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
40
40
  $onUpdateFn(fn: () => ColumnValueTypes<TType, TMode>): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
41
+ as(alias: string): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
41
42
  }
42
43
  declare const text: <TName extends string>(name: TName) => SQLiteColumn<TName, "TEXT", "default", false, false, false>;
43
44
  declare const integer: <TName extends string, TMode extends Mode = "default">(name: TName, config?: {
@@ -77,6 +78,7 @@ type SQLCondition = {
77
78
  declare const eq: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
78
79
  declare const and: (...conditions: SQLCondition[]) => SQLCondition;
79
80
  declare const or: (...conditions: SQLCondition[]) => SQLCondition;
81
+ declare const not: (condition: SQLCondition) => SQLCondition;
80
82
  declare const gt: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
81
83
  declare const gte: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
82
84
  declare const lt: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
@@ -85,13 +87,35 @@ declare const like: (column: AnySQLiteColumn, pattern: string) => SQLCondition;
85
87
  declare const isNull: (column: AnySQLiteColumn) => SQLCondition;
86
88
  declare const isNotNull: (column: AnySQLiteColumn) => SQLCondition;
87
89
  declare const inArray: <T>(column: AnySQLiteColumn, values: T[]) => SQLCondition;
90
+ declare const asc: (column: AnySQLiteColumn) => {
91
+ sql: string;
92
+ params: never[];
93
+ };
94
+ declare const desc: (column: AnySQLiteColumn) => {
95
+ sql: string;
96
+ params: never[];
97
+ };
98
+ declare const count: (column?: AnySQLiteColumn) => SQLCondition;
99
+ declare const countDistinct: (column: AnySQLiteColumn) => SQLCondition;
100
+ declare const sum: (column: AnySQLiteColumn) => SQLCondition;
101
+ declare const avg: (column: AnySQLiteColumn) => SQLCondition;
102
+ declare const max: (column: AnySQLiteColumn) => SQLCondition;
103
+ declare const min: (column: AnySQLiteColumn) => SQLCondition;
104
+ declare const sql: <T = unknown>(strings: TemplateStringsArray, ...values: any[]) => {
105
+ sql: string;
106
+ params: any[];
107
+ mapWith?: (value: any) => T;
108
+ };
88
109
  declare class BaseQueryBuilder {
89
110
  protected db: Database;
90
111
  protected query: string;
91
112
  protected params: any[];
92
113
  constructor(db: Database);
93
114
  where(condition: SQLCondition): this;
94
- orderBy(column: AnySQLiteColumn, direction?: "ASC" | "DESC"): this;
115
+ orderBy(column: AnySQLiteColumn | {
116
+ sql: string;
117
+ params: any[];
118
+ }, direction?: "ASC" | "DESC"): this;
95
119
  limit(count: number): this;
96
120
  offset(count: number): this;
97
121
  build(): {
@@ -102,31 +126,69 @@ declare class BaseQueryBuilder {
102
126
  declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable["_"]["columns"])[] | undefined = undefined> extends BaseQueryBuilder {
103
127
  private table;
104
128
  private columns?;
129
+ private isDistinct;
130
+ private groupByColumns;
131
+ private havingCondition;
105
132
  constructor(db: Database, table: TTable, columns?: TSelectedColumns | undefined);
133
+ distinct(): this;
134
+ groupBy(...columns: AnySQLiteColumn[]): this;
135
+ having(condition: SQLCondition): this;
106
136
  execute(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]>[] : InferSelectModel<TTable>[]>;
137
+ all(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]>[] : InferSelectModel<TTable>[]>;
138
+ get(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]> | undefined : InferSelectModel<TTable> | undefined>;
107
139
  }
108
140
  declare class InsertQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
109
141
  private table;
110
142
  private dataSets;
143
+ private returningColumns;
144
+ private onConflictAction;
145
+ private conflictTarget;
146
+ private updateSet;
111
147
  constructor(db: Database, table: T);
112
148
  values(data: Partial<InferInsertModel<T>> | Partial<InferInsertModel<T>>[]): this;
113
- execute(): Promise<number>;
149
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
150
+ onConflictDoNothing(target?: AnySQLiteColumn | AnySQLiteColumn[]): this;
151
+ onConflictDoUpdate(config: {
152
+ target: AnySQLiteColumn | AnySQLiteColumn[];
153
+ set: Partial<InferInsertModel<T>>;
154
+ }): this;
155
+ private processDefaultValues;
156
+ private buildConflictClause;
157
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
158
+ returningAll(): Promise<InferSelectModel<T>[]>;
114
159
  }
115
160
  declare class UpdateQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
116
161
  private table;
117
162
  private updateData;
163
+ private returningColumns;
118
164
  constructor(db: Database, table: T);
119
165
  set(data: Partial<InferInsertModel<T>>): this;
120
- build(): {
121
- sql: string;
122
- params: any[];
123
- };
124
- execute(): Promise<number>;
166
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
167
+ private buildUpdateClause;
168
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
169
+ returningAll(): Promise<InferSelectModel<T>[]>;
125
170
  }
126
171
  declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
127
172
  private table;
173
+ private returningColumns;
128
174
  constructor(db: Database, table: T);
129
- execute(): Promise<number>;
175
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
176
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
177
+ returningAll(): Promise<InferSelectModel<T>[]>;
178
+ }
179
+ declare class WithQueryBuilder {
180
+ private db;
181
+ private ctes;
182
+ constructor(db: Database);
183
+ with(alias: string, query: {
184
+ sql: string;
185
+ params: any[];
186
+ }): this;
187
+ select<T extends AnyTable, C extends (keyof T["_"]["columns"])[] | undefined = undefined>(table: T, columns?: C): SelectQueryBuilder<T, C>;
188
+ insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
189
+ update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
190
+ delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
191
+ private applyWithClause;
130
192
  }
131
193
  declare class TauriORM {
132
194
  private db;
@@ -138,7 +200,14 @@ declare class TauriORM {
138
200
  insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
139
201
  update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
140
202
  delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
203
+ $with(alias: string): {
204
+ as: (query: {
205
+ sql: string;
206
+ params: any[];
207
+ }) => WithQueryBuilder;
208
+ };
141
209
  transaction<T>(callback: (tx: TauriORM) => Promise<T>): Promise<T>;
210
+ rollback(): never;
142
211
  private ensureSchemaMeta;
143
212
  private getSchemaMeta;
144
213
  private setSchemaMeta;
@@ -156,5 +225,7 @@ declare const relations: <T extends AnyTable, R extends Record<string, any>>(tab
156
225
  one: any;
157
226
  many: any;
158
227
  }) => R) => R;
228
+ declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
229
+ declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
159
230
 
160
- export { type AnySQLiteColumn, type AnyTable, type ColumnDataType, type ColumnOptions, DeleteQueryBuilder, type InferInsertModel, type InferSelectModel, InsertQueryBuilder, type Mode, type SQLCondition, SQLiteColumn, SelectQueryBuilder, Table, TauriORM, UpdateQueryBuilder, and, blob, boolean, eq, gt, gte, inArray, integer, isNotNull, isNull, like, lt, lte, or, real, relations, sqliteTable, text };
231
+ export { type AnySQLiteColumn, type AnyTable, type ColumnDataType, type ColumnOptions, DeleteQueryBuilder, type InferInsertModel, type InferSelectModel, InsertQueryBuilder, type Mode, type SQLCondition, SQLiteColumn, SelectQueryBuilder, Table, TauriORM, UpdateQueryBuilder, WithQueryBuilder, alias, and, asc, avg, blob, boolean, count, countDistinct, desc, eq, getTableColumns, gt, gte, inArray, integer, isNotNull, isNull, like, lt, lte, max, min, not, or, real, relations, sql, sqliteTable, sum, text };
package/dist/index.d.ts CHANGED
@@ -38,6 +38,7 @@ declare class SQLiteColumn<TName extends string = string, TType extends ColumnDa
38
38
  unique(): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
39
39
  references<T extends AnyTable, K extends keyof T["_"]["columns"] & string>(ref: T, column: K): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
40
40
  $onUpdateFn(fn: () => ColumnValueTypes<TType, TMode>): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
41
+ as(alias: string): SQLiteColumn<TName, TType, TMode, TNotNull, THasDefault, TAutoincrement>;
41
42
  }
42
43
  declare const text: <TName extends string>(name: TName) => SQLiteColumn<TName, "TEXT", "default", false, false, false>;
43
44
  declare const integer: <TName extends string, TMode extends Mode = "default">(name: TName, config?: {
@@ -77,6 +78,7 @@ type SQLCondition = {
77
78
  declare const eq: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
78
79
  declare const and: (...conditions: SQLCondition[]) => SQLCondition;
79
80
  declare const or: (...conditions: SQLCondition[]) => SQLCondition;
81
+ declare const not: (condition: SQLCondition) => SQLCondition;
80
82
  declare const gt: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
81
83
  declare const gte: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
82
84
  declare const lt: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
@@ -85,13 +87,35 @@ declare const like: (column: AnySQLiteColumn, pattern: string) => SQLCondition;
85
87
  declare const isNull: (column: AnySQLiteColumn) => SQLCondition;
86
88
  declare const isNotNull: (column: AnySQLiteColumn) => SQLCondition;
87
89
  declare const inArray: <T>(column: AnySQLiteColumn, values: T[]) => SQLCondition;
90
+ declare const asc: (column: AnySQLiteColumn) => {
91
+ sql: string;
92
+ params: never[];
93
+ };
94
+ declare const desc: (column: AnySQLiteColumn) => {
95
+ sql: string;
96
+ params: never[];
97
+ };
98
+ declare const count: (column?: AnySQLiteColumn) => SQLCondition;
99
+ declare const countDistinct: (column: AnySQLiteColumn) => SQLCondition;
100
+ declare const sum: (column: AnySQLiteColumn) => SQLCondition;
101
+ declare const avg: (column: AnySQLiteColumn) => SQLCondition;
102
+ declare const max: (column: AnySQLiteColumn) => SQLCondition;
103
+ declare const min: (column: AnySQLiteColumn) => SQLCondition;
104
+ declare const sql: <T = unknown>(strings: TemplateStringsArray, ...values: any[]) => {
105
+ sql: string;
106
+ params: any[];
107
+ mapWith?: (value: any) => T;
108
+ };
88
109
  declare class BaseQueryBuilder {
89
110
  protected db: Database;
90
111
  protected query: string;
91
112
  protected params: any[];
92
113
  constructor(db: Database);
93
114
  where(condition: SQLCondition): this;
94
- orderBy(column: AnySQLiteColumn, direction?: "ASC" | "DESC"): this;
115
+ orderBy(column: AnySQLiteColumn | {
116
+ sql: string;
117
+ params: any[];
118
+ }, direction?: "ASC" | "DESC"): this;
95
119
  limit(count: number): this;
96
120
  offset(count: number): this;
97
121
  build(): {
@@ -102,31 +126,69 @@ declare class BaseQueryBuilder {
102
126
  declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable["_"]["columns"])[] | undefined = undefined> extends BaseQueryBuilder {
103
127
  private table;
104
128
  private columns?;
129
+ private isDistinct;
130
+ private groupByColumns;
131
+ private havingCondition;
105
132
  constructor(db: Database, table: TTable, columns?: TSelectedColumns | undefined);
133
+ distinct(): this;
134
+ groupBy(...columns: AnySQLiteColumn[]): this;
135
+ having(condition: SQLCondition): this;
106
136
  execute(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]>[] : InferSelectModel<TTable>[]>;
137
+ all(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]>[] : InferSelectModel<TTable>[]>;
138
+ get(): Promise<TSelectedColumns extends (keyof TTable["_"]["columns"])[] ? Pick<InferSelectModel<TTable>, TSelectedColumns[number]> | undefined : InferSelectModel<TTable> | undefined>;
107
139
  }
108
140
  declare class InsertQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
109
141
  private table;
110
142
  private dataSets;
143
+ private returningColumns;
144
+ private onConflictAction;
145
+ private conflictTarget;
146
+ private updateSet;
111
147
  constructor(db: Database, table: T);
112
148
  values(data: Partial<InferInsertModel<T>> | Partial<InferInsertModel<T>>[]): this;
113
- execute(): Promise<number>;
149
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
150
+ onConflictDoNothing(target?: AnySQLiteColumn | AnySQLiteColumn[]): this;
151
+ onConflictDoUpdate(config: {
152
+ target: AnySQLiteColumn | AnySQLiteColumn[];
153
+ set: Partial<InferInsertModel<T>>;
154
+ }): this;
155
+ private processDefaultValues;
156
+ private buildConflictClause;
157
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
158
+ returningAll(): Promise<InferSelectModel<T>[]>;
114
159
  }
115
160
  declare class UpdateQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
116
161
  private table;
117
162
  private updateData;
163
+ private returningColumns;
118
164
  constructor(db: Database, table: T);
119
165
  set(data: Partial<InferInsertModel<T>>): this;
120
- build(): {
121
- sql: string;
122
- params: any[];
123
- };
124
- execute(): Promise<number>;
166
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
167
+ private buildUpdateClause;
168
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
169
+ returningAll(): Promise<InferSelectModel<T>[]>;
125
170
  }
126
171
  declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
127
172
  private table;
173
+ private returningColumns;
128
174
  constructor(db: Database, table: T);
129
- execute(): Promise<number>;
175
+ returning(...columns: (keyof T["_"]["columns"])[]): this;
176
+ execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
177
+ returningAll(): Promise<InferSelectModel<T>[]>;
178
+ }
179
+ declare class WithQueryBuilder {
180
+ private db;
181
+ private ctes;
182
+ constructor(db: Database);
183
+ with(alias: string, query: {
184
+ sql: string;
185
+ params: any[];
186
+ }): this;
187
+ select<T extends AnyTable, C extends (keyof T["_"]["columns"])[] | undefined = undefined>(table: T, columns?: C): SelectQueryBuilder<T, C>;
188
+ insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
189
+ update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
190
+ delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
191
+ private applyWithClause;
130
192
  }
131
193
  declare class TauriORM {
132
194
  private db;
@@ -138,7 +200,14 @@ declare class TauriORM {
138
200
  insert<T extends AnyTable>(table: T): InsertQueryBuilder<T>;
139
201
  update<T extends AnyTable>(table: T): UpdateQueryBuilder<T>;
140
202
  delete<T extends AnyTable>(table: T): DeleteQueryBuilder<T>;
203
+ $with(alias: string): {
204
+ as: (query: {
205
+ sql: string;
206
+ params: any[];
207
+ }) => WithQueryBuilder;
208
+ };
141
209
  transaction<T>(callback: (tx: TauriORM) => Promise<T>): Promise<T>;
210
+ rollback(): never;
142
211
  private ensureSchemaMeta;
143
212
  private getSchemaMeta;
144
213
  private setSchemaMeta;
@@ -156,5 +225,7 @@ declare const relations: <T extends AnyTable, R extends Record<string, any>>(tab
156
225
  one: any;
157
226
  many: any;
158
227
  }) => R) => R;
228
+ declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
229
+ declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
159
230
 
160
- export { type AnySQLiteColumn, type AnyTable, type ColumnDataType, type ColumnOptions, DeleteQueryBuilder, type InferInsertModel, type InferSelectModel, InsertQueryBuilder, type Mode, type SQLCondition, SQLiteColumn, SelectQueryBuilder, Table, TauriORM, UpdateQueryBuilder, and, blob, boolean, eq, gt, gte, inArray, integer, isNotNull, isNull, like, lt, lte, or, real, relations, sqliteTable, text };
231
+ export { type AnySQLiteColumn, type AnyTable, type ColumnDataType, type ColumnOptions, DeleteQueryBuilder, type InferInsertModel, type InferSelectModel, InsertQueryBuilder, type Mode, type SQLCondition, SQLiteColumn, SelectQueryBuilder, Table, TauriORM, UpdateQueryBuilder, WithQueryBuilder, alias, and, asc, avg, blob, boolean, count, countDistinct, desc, eq, getTableColumns, gt, gte, inArray, integer, isNotNull, isNull, like, lt, lte, max, min, not, or, real, relations, sql, sqliteTable, sum, text };
package/dist/index.js CHANGED
@@ -7,11 +7,11 @@ var __export = (target, all) => {
7
7
  for (var name in all)
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
- var __copyProps = (to, from, except, desc) => {
10
+ var __copyProps = (to, from, except, desc2) => {
11
11
  if (from && typeof from === "object" || typeof from === "function") {
12
12
  for (let key of __getOwnPropNames(from))
13
13
  if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable });
15
15
  }
16
16
  return to;
17
17
  };
@@ -27,10 +27,18 @@ __export(index_exports, {
27
27
  Table: () => Table,
28
28
  TauriORM: () => TauriORM,
29
29
  UpdateQueryBuilder: () => UpdateQueryBuilder,
30
+ WithQueryBuilder: () => WithQueryBuilder,
31
+ alias: () => alias,
30
32
  and: () => and,
33
+ asc: () => asc,
34
+ avg: () => avg,
31
35
  blob: () => blob,
32
36
  boolean: () => boolean,
37
+ count: () => count,
38
+ countDistinct: () => countDistinct,
39
+ desc: () => desc,
33
40
  eq: () => eq,
41
+ getTableColumns: () => getTableColumns,
34
42
  gt: () => gt,
35
43
  gte: () => gte,
36
44
  inArray: () => inArray,
@@ -40,10 +48,15 @@ __export(index_exports, {
40
48
  like: () => like,
41
49
  lt: () => lt,
42
50
  lte: () => lte,
51
+ max: () => max,
52
+ min: () => min,
53
+ not: () => not,
43
54
  or: () => or,
44
55
  real: () => real,
45
56
  relations: () => relations,
57
+ sql: () => sql,
46
58
  sqliteTable: () => sqliteTable,
59
+ sum: () => sum,
47
60
  text: () => text
48
61
  });
49
62
  module.exports = __toCommonJS(index_exports);
@@ -133,6 +146,9 @@ var SQLiteColumn = class _SQLiteColumn {
133
146
  this._.mode
134
147
  );
135
148
  }
149
+ as(alias2) {
150
+ return this;
151
+ }
136
152
  };
137
153
  var text = (name) => new SQLiteColumn(name, "TEXT");
138
154
  var integer = (name, config) => new SQLiteColumn(name, "INTEGER", {}, config?.mode || "default");
@@ -163,6 +179,10 @@ var or = (...conditions) => ({
163
179
  sql: conditions.map((c) => `(${c.sql})`).join(" OR "),
164
180
  params: conditions.flatMap((c) => c.params)
165
181
  });
182
+ var not = (condition) => ({
183
+ sql: `NOT (${condition.sql})`,
184
+ params: condition.params
185
+ });
166
186
  var gt = (column, value) => ({
167
187
  sql: `${column._.name} > ?`,
168
188
  params: [value]
@@ -195,6 +215,58 @@ var inArray = (column, values) => ({
195
215
  sql: `${column._.name} IN (${values.map(() => "?").join(",")})`,
196
216
  params: values
197
217
  });
218
+ var asc = (column) => ({
219
+ sql: `${column._.name} ASC`,
220
+ params: []
221
+ });
222
+ var desc = (column) => ({
223
+ sql: `${column._.name} DESC`,
224
+ params: []
225
+ });
226
+ var count = (column) => ({
227
+ sql: `COUNT(${column ? column._.name : "*"})`,
228
+ params: []
229
+ });
230
+ var countDistinct = (column) => ({
231
+ sql: `COUNT(DISTINCT ${column._.name})`,
232
+ params: []
233
+ });
234
+ var sum = (column) => ({
235
+ sql: `SUM(${column._.name})`,
236
+ params: []
237
+ });
238
+ var avg = (column) => ({
239
+ sql: `AVG(${column._.name})`,
240
+ params: []
241
+ });
242
+ var max = (column) => ({
243
+ sql: `MAX(${column._.name})`,
244
+ params: []
245
+ });
246
+ var min = (column) => ({
247
+ sql: `MIN(${column._.name})`,
248
+ params: []
249
+ });
250
+ var sql = (strings, ...values) => {
251
+ const queryParts = [];
252
+ const params = [];
253
+ strings.forEach((str, i) => {
254
+ queryParts.push(str);
255
+ if (values[i] !== void 0) {
256
+ if (typeof values[i] === "object" && values[i].sql) {
257
+ queryParts.push(values[i].sql);
258
+ params.push(...values[i].params);
259
+ } else {
260
+ queryParts.push("?");
261
+ params.push(values[i]);
262
+ }
263
+ }
264
+ });
265
+ return {
266
+ sql: queryParts.join(""),
267
+ params
268
+ };
269
+ };
198
270
  var BaseQueryBuilder = class {
199
271
  constructor(db) {
200
272
  this.db = db;
@@ -207,15 +279,20 @@ var BaseQueryBuilder = class {
207
279
  return this;
208
280
  }
209
281
  orderBy(column, direction = "ASC") {
210
- this.query += ` ORDER BY ${column._.name} ${direction}`;
282
+ if ("sql" in column) {
283
+ this.query += ` ORDER BY ${column.sql} ${direction}`;
284
+ this.params.push(...column.params);
285
+ } else {
286
+ this.query += ` ORDER BY ${column._.name} ${direction}`;
287
+ }
211
288
  return this;
212
289
  }
213
- limit(count) {
214
- this.query += ` LIMIT ${count}`;
290
+ limit(count2) {
291
+ this.query += ` LIMIT ${count2}`;
215
292
  return this;
216
293
  }
217
- offset(count) {
218
- this.query += ` OFFSET ${count}`;
294
+ offset(count2) {
295
+ this.query += ` OFFSET ${count2}`;
219
296
  return this;
220
297
  }
221
298
  build() {
@@ -233,9 +310,37 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
233
310
  const columnNames = columns ? columns.map((c) => table._.columns[c]._.name) : ["*"];
234
311
  this.query = `SELECT ${columnNames.join(", ")} FROM ${table._.name}`;
235
312
  }
313
+ isDistinct = false;
314
+ groupByColumns = [];
315
+ havingCondition = null;
316
+ distinct() {
317
+ this.isDistinct = true;
318
+ this.query = this.query.replace("SELECT", "SELECT DISTINCT");
319
+ return this;
320
+ }
321
+ groupBy(...columns) {
322
+ this.groupByColumns.push(...columns);
323
+ const columnNames = columns.map((col) => col._.name).join(", ");
324
+ this.query += ` GROUP BY ${columnNames}`;
325
+ return this;
326
+ }
327
+ having(condition) {
328
+ this.havingCondition = condition;
329
+ this.query += ` HAVING ${condition.sql}`;
330
+ this.params.push(...condition.params);
331
+ return this;
332
+ }
236
333
  async execute() {
237
- const { sql, params } = this.build();
238
- return this.db.select(sql, params);
334
+ const { sql: sql2, params } = this.build();
335
+ return this.db.select(sql2, params);
336
+ }
337
+ async all() {
338
+ return this.execute();
339
+ }
340
+ async get() {
341
+ this.limit(1);
342
+ const result = await this.execute();
343
+ return result[0];
239
344
  }
240
345
  };
241
346
  var InsertQueryBuilder = class extends BaseQueryBuilder {
@@ -245,26 +350,69 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
245
350
  this.query = `INSERT INTO ${table._.name}`;
246
351
  }
247
352
  dataSets = [];
353
+ returningColumns = [];
354
+ onConflictAction = null;
355
+ conflictTarget = [];
356
+ updateSet = {};
248
357
  values(data) {
249
358
  const dataArray = Array.isArray(data) ? data : [data];
250
359
  this.dataSets.push(...dataArray);
251
360
  return this;
252
361
  }
362
+ returning(...columns) {
363
+ this.returningColumns = columns;
364
+ return this;
365
+ }
366
+ onConflictDoNothing(target) {
367
+ this.onConflictAction = "nothing";
368
+ if (target) {
369
+ this.conflictTarget = Array.isArray(target) ? target : [target];
370
+ }
371
+ return this;
372
+ }
373
+ onConflictDoUpdate(config) {
374
+ this.onConflictAction = "update";
375
+ this.conflictTarget = Array.isArray(config.target) ? config.target : [config.target];
376
+ this.updateSet = config.set;
377
+ return this;
378
+ }
379
+ processDefaultValues(data) {
380
+ const finalData = { ...data };
381
+ for (const [key, column] of Object.entries(this.table._.columns)) {
382
+ const typedKey = key;
383
+ if (finalData[typedKey] === void 0) {
384
+ if (column.options.$defaultFn) {
385
+ finalData[typedKey] = column.options.$defaultFn();
386
+ }
387
+ }
388
+ }
389
+ return finalData;
390
+ }
391
+ buildConflictClause() {
392
+ if (!this.onConflictAction) return "";
393
+ let clause = " ON CONFLICT";
394
+ if (this.conflictTarget.length > 0) {
395
+ const targetNames = this.conflictTarget.map((col) => col._.name).join(", ");
396
+ clause += ` (${targetNames})`;
397
+ }
398
+ if (this.onConflictAction === "nothing") {
399
+ clause += " DO NOTHING";
400
+ } else if (this.onConflictAction === "update") {
401
+ const setEntries = Object.entries(this.updateSet);
402
+ if (setEntries.length > 0) {
403
+ const setClause = setEntries.map(([key]) => `${key} = ?`).join(", ");
404
+ clause += ` DO UPDATE SET ${setClause}`;
405
+ }
406
+ }
407
+ return clause;
408
+ }
253
409
  async execute() {
254
410
  if (this.dataSets.length === 0) {
255
411
  throw new Error("No data provided for insert");
256
412
  }
257
- const processedDataSets = this.dataSets.map((dataSet) => {
258
- const finalData = { ...dataSet };
259
- for (const [key, column] of Object.entries(this.table._.columns)) {
260
- if (finalData[key] === void 0) {
261
- if (column.options.$defaultFn) {
262
- finalData[key] = column.options.$defaultFn();
263
- }
264
- }
265
- }
266
- return finalData;
267
- });
413
+ const processedDataSets = this.dataSets.map(
414
+ (data) => this.processDefaultValues(data)
415
+ );
268
416
  const groups = /* @__PURE__ */ new Map();
269
417
  for (const dataSet of processedDataSets) {
270
418
  const keys = Object.keys(dataSet).sort().join(",");
@@ -273,7 +421,9 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
273
421
  }
274
422
  groups.get(keys).push(dataSet);
275
423
  }
276
- let lastInsertId = void 0;
424
+ let results = [];
425
+ let lastInsertId;
426
+ let rowsAffected = 0;
277
427
  for (const [_, dataSets] of groups) {
278
428
  const columns = Object.keys(dataSets[0]);
279
429
  const columnNames = columns.map(
@@ -281,16 +431,40 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
281
431
  );
282
432
  const placeholders = `(${columns.map(() => "?").join(", ")})`;
283
433
  const valuesSql = dataSets.map(() => placeholders).join(", ");
434
+ const conflictClause = this.buildConflictClause();
284
435
  const finalQuery = `${this.query} (${columnNames.join(
285
436
  ", "
286
- )}) VALUES ${valuesSql}`;
437
+ )}) VALUES ${valuesSql}${conflictClause}`;
287
438
  const params = dataSets.flatMap(
288
439
  (data) => columns.map((col) => data[col] ?? null)
289
440
  );
290
- const result = await this.db.execute(finalQuery, params);
291
- lastInsertId = result.lastInsertId;
441
+ if (this.onConflictAction === "update") {
442
+ const setValues = Object.entries(this.updateSet).map(
443
+ ([, value]) => value
444
+ );
445
+ params.push(...setValues);
446
+ }
447
+ if (this.returningColumns.length > 0) {
448
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
449
+ const queryWithReturning = `${finalQuery} RETURNING ${returningNames}`;
450
+ const rows = await this.db.select(queryWithReturning, params);
451
+ results = results.concat(rows);
452
+ } else {
453
+ const result = await this.db.execute(finalQuery, params);
454
+ lastInsertId = result.lastInsertId;
455
+ rowsAffected += result.rowsAffected;
456
+ }
457
+ }
458
+ if (this.returningColumns.length > 0) {
459
+ return results;
292
460
  }
293
- return lastInsertId ?? 0;
461
+ return [{ lastInsertId, rowsAffected }];
462
+ }
463
+ async returningAll() {
464
+ const allColumns = Object.keys(
465
+ this.table._.columns
466
+ );
467
+ return this.returning(...allColumns).execute();
294
468
  }
295
469
  };
296
470
  var UpdateQueryBuilder = class extends BaseQueryBuilder {
@@ -300,15 +474,21 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
300
474
  this.query = `UPDATE ${table._.name}`;
301
475
  }
302
476
  updateData = {};
477
+ returningColumns = [];
303
478
  set(data) {
304
479
  this.updateData = { ...this.updateData, ...data };
305
480
  return this;
306
481
  }
307
- build() {
482
+ returning(...columns) {
483
+ this.returningColumns = columns;
484
+ return this;
485
+ }
486
+ buildUpdateClause() {
308
487
  const finalUpdateData = { ...this.updateData };
309
488
  for (const [key, column] of Object.entries(this.table._.columns)) {
310
- if (finalUpdateData[key] === void 0 && column.options.$onUpdateFn) {
311
- finalUpdateData[key] = column.options.$onUpdateFn();
489
+ const typedKey = key;
490
+ if (finalUpdateData[typedKey] === void 0 && column.options.$onUpdateFn) {
491
+ finalUpdateData[typedKey] = column.options.$onUpdateFn();
312
492
  }
313
493
  }
314
494
  const baseQuery = this.query;
@@ -334,14 +514,26 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
334
514
  return `${column._.name} = ?`;
335
515
  }).join(", ");
336
516
  const setParams = entries.map(([, value]) => value);
337
- const sql = `${tablePart} SET ${setClause}${whereClause}`;
517
+ const sql2 = `${tablePart} SET ${setClause}${whereClause}`;
338
518
  const params = [...setParams, ...whereParams];
339
- return { sql, params };
519
+ return { sql: sql2, params };
340
520
  }
341
521
  async execute() {
342
- const { sql, params } = this.build();
343
- const result = await this.db.execute(sql, params);
344
- return result.rowsAffected;
522
+ const { sql: updateSql, params } = this.buildUpdateClause();
523
+ if (this.returningColumns.length > 0) {
524
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
525
+ const sqlWithReturning = `${updateSql} RETURNING ${returningNames}`;
526
+ return this.db.select(sqlWithReturning, params);
527
+ } else {
528
+ const result = await this.db.execute(updateSql, params);
529
+ return [{ rowsAffected: result.rowsAffected }];
530
+ }
531
+ }
532
+ async returningAll() {
533
+ const allColumns = Object.keys(
534
+ this.table._.columns
535
+ );
536
+ return this.returning(...allColumns).execute();
345
537
  }
346
538
  };
347
539
  var DeleteQueryBuilder = class extends BaseQueryBuilder {
@@ -350,10 +542,67 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
350
542
  this.table = table;
351
543
  this.query = `DELETE FROM ${table._.name}`;
352
544
  }
545
+ returningColumns = [];
546
+ returning(...columns) {
547
+ this.returningColumns = columns;
548
+ return this;
549
+ }
353
550
  async execute() {
354
- const { sql, params } = this.build();
355
- const result = await this.db.execute(sql, params);
356
- return result.rowsAffected;
551
+ const { sql: sql2, params } = this.build();
552
+ if (this.returningColumns.length > 0) {
553
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
554
+ const sqlWithReturning = `${sql2} RETURNING ${returningNames}`;
555
+ return this.db.select(sqlWithReturning, params);
556
+ } else {
557
+ const result = await this.db.execute(sql2, params);
558
+ return [{ rowsAffected: result.rowsAffected }];
559
+ }
560
+ }
561
+ async returningAll() {
562
+ const allColumns = Object.keys(
563
+ this.table._.columns
564
+ );
565
+ return this.returning(...allColumns).execute();
566
+ }
567
+ };
568
+ var WithQueryBuilder = class {
569
+ constructor(db) {
570
+ this.db = db;
571
+ }
572
+ ctes = [];
573
+ with(alias2, query) {
574
+ this.ctes.push({ alias: alias2, query: query.sql, params: query.params });
575
+ return this;
576
+ }
577
+ select(table, columns) {
578
+ const builder = new SelectQueryBuilder(this.db, table, columns);
579
+ this.applyWithClause(builder);
580
+ return builder;
581
+ }
582
+ insert(table) {
583
+ const builder = new InsertQueryBuilder(this.db, table);
584
+ this.applyWithClause(builder);
585
+ return builder;
586
+ }
587
+ update(table) {
588
+ const builder = new UpdateQueryBuilder(this.db, table);
589
+ this.applyWithClause(builder);
590
+ return builder;
591
+ }
592
+ delete(table) {
593
+ const builder = new DeleteQueryBuilder(this.db, table);
594
+ this.applyWithClause(builder);
595
+ return builder;
596
+ }
597
+ applyWithClause(builder) {
598
+ if (this.ctes.length > 0) {
599
+ const cteSql = this.ctes.map((cte) => `${cte.alias} AS (${cte.query})`).join(", ");
600
+ builder["query"] = `WITH ${cteSql} ${builder["query"]}`;
601
+ builder["params"] = [
602
+ ...this.ctes.flatMap((cte) => cte.params),
603
+ ...builder["params"]
604
+ ];
605
+ }
357
606
  }
358
607
  };
359
608
  var TauriORM = class {
@@ -367,23 +616,23 @@ var TauriORM = class {
367
616
  }
368
617
  tables = /* @__PURE__ */ new Map();
369
618
  buildColumnDefinition(col, forAlterTable = false) {
370
- let sql = `${col._.name} ${col.type}`;
619
+ let sql2 = `${col._.name} ${col.type}`;
371
620
  if (col.options.primaryKey && !forAlterTable) {
372
- sql += " PRIMARY KEY";
621
+ sql2 += " PRIMARY KEY";
373
622
  if (col._.autoincrement) {
374
- sql += " AUTOINCREMENT";
623
+ sql2 += " AUTOINCREMENT";
375
624
  }
376
625
  }
377
- if (col._.notNull) sql += " NOT NULL";
378
- if (col.options.unique) sql += " UNIQUE";
626
+ if (col._.notNull) sql2 += " NOT NULL";
627
+ if (col.options.unique) sql2 += " UNIQUE";
379
628
  if (col.options.default !== void 0) {
380
629
  const value = col.options.default;
381
- sql += ` DEFAULT ${typeof value === "string" ? `'${value.replace(/'/g, "''")}'` : value}`;
630
+ sql2 += ` DEFAULT ${typeof value === "string" ? `'${value.replace(/'/g, "''")}'` : value}`;
382
631
  }
383
632
  if (col.options.references) {
384
- sql += ` REFERENCES ${col.options.references.table._.name}(${col.options.references.column._.name})`;
633
+ sql2 += ` REFERENCES ${col.options.references.table._.name}(${col.options.references.column._.name})`;
385
634
  }
386
- return sql;
635
+ return sql2;
387
636
  }
388
637
  async migrate() {
389
638
  for (const table of this.tables.values()) {
@@ -420,6 +669,15 @@ var TauriORM = class {
420
669
  delete(table) {
421
670
  return new DeleteQueryBuilder(this.db, table);
422
671
  }
672
+ $with(alias2) {
673
+ const withBuilder = new WithQueryBuilder(this.db);
674
+ return {
675
+ as: (query) => {
676
+ withBuilder.with(alias2, query);
677
+ return withBuilder;
678
+ }
679
+ };
680
+ }
423
681
  async transaction(callback) {
424
682
  await this.db.execute("BEGIN TRANSACTION");
425
683
  try {
@@ -431,6 +689,9 @@ var TauriORM = class {
431
689
  throw error;
432
690
  }
433
691
  }
692
+ rollback() {
693
+ throw new Error("Transaction rolled back");
694
+ }
434
695
  // --- Schema detection / signature ---
435
696
  async ensureSchemaMeta() {
436
697
  await this.db.execute(
@@ -508,6 +769,12 @@ var relations = (table, relationsCallback) => {
508
769
  })
509
770
  });
510
771
  };
772
+ var getTableColumns = (table) => {
773
+ return table._.columns;
774
+ };
775
+ var alias = (table, alias2) => {
776
+ return table;
777
+ };
511
778
  // Annotate the CommonJS export names for ESM import in node:
512
779
  0 && (module.exports = {
513
780
  DeleteQueryBuilder,
@@ -517,10 +784,18 @@ var relations = (table, relationsCallback) => {
517
784
  Table,
518
785
  TauriORM,
519
786
  UpdateQueryBuilder,
787
+ WithQueryBuilder,
788
+ alias,
520
789
  and,
790
+ asc,
791
+ avg,
521
792
  blob,
522
793
  boolean,
794
+ count,
795
+ countDistinct,
796
+ desc,
523
797
  eq,
798
+ getTableColumns,
524
799
  gt,
525
800
  gte,
526
801
  inArray,
@@ -530,9 +805,14 @@ var relations = (table, relationsCallback) => {
530
805
  like,
531
806
  lt,
532
807
  lte,
808
+ max,
809
+ min,
810
+ not,
533
811
  or,
534
812
  real,
535
813
  relations,
814
+ sql,
536
815
  sqliteTable,
816
+ sum,
537
817
  text
538
818
  });
package/dist/index.mjs CHANGED
@@ -83,6 +83,9 @@ var SQLiteColumn = class _SQLiteColumn {
83
83
  this._.mode
84
84
  );
85
85
  }
86
+ as(alias2) {
87
+ return this;
88
+ }
86
89
  };
87
90
  var text = (name) => new SQLiteColumn(name, "TEXT");
88
91
  var integer = (name, config) => new SQLiteColumn(name, "INTEGER", {}, config?.mode || "default");
@@ -113,6 +116,10 @@ var or = (...conditions) => ({
113
116
  sql: conditions.map((c) => `(${c.sql})`).join(" OR "),
114
117
  params: conditions.flatMap((c) => c.params)
115
118
  });
119
+ var not = (condition) => ({
120
+ sql: `NOT (${condition.sql})`,
121
+ params: condition.params
122
+ });
116
123
  var gt = (column, value) => ({
117
124
  sql: `${column._.name} > ?`,
118
125
  params: [value]
@@ -145,6 +152,58 @@ var inArray = (column, values) => ({
145
152
  sql: `${column._.name} IN (${values.map(() => "?").join(",")})`,
146
153
  params: values
147
154
  });
155
+ var asc = (column) => ({
156
+ sql: `${column._.name} ASC`,
157
+ params: []
158
+ });
159
+ var desc = (column) => ({
160
+ sql: `${column._.name} DESC`,
161
+ params: []
162
+ });
163
+ var count = (column) => ({
164
+ sql: `COUNT(${column ? column._.name : "*"})`,
165
+ params: []
166
+ });
167
+ var countDistinct = (column) => ({
168
+ sql: `COUNT(DISTINCT ${column._.name})`,
169
+ params: []
170
+ });
171
+ var sum = (column) => ({
172
+ sql: `SUM(${column._.name})`,
173
+ params: []
174
+ });
175
+ var avg = (column) => ({
176
+ sql: `AVG(${column._.name})`,
177
+ params: []
178
+ });
179
+ var max = (column) => ({
180
+ sql: `MAX(${column._.name})`,
181
+ params: []
182
+ });
183
+ var min = (column) => ({
184
+ sql: `MIN(${column._.name})`,
185
+ params: []
186
+ });
187
+ var sql = (strings, ...values) => {
188
+ const queryParts = [];
189
+ const params = [];
190
+ strings.forEach((str, i) => {
191
+ queryParts.push(str);
192
+ if (values[i] !== void 0) {
193
+ if (typeof values[i] === "object" && values[i].sql) {
194
+ queryParts.push(values[i].sql);
195
+ params.push(...values[i].params);
196
+ } else {
197
+ queryParts.push("?");
198
+ params.push(values[i]);
199
+ }
200
+ }
201
+ });
202
+ return {
203
+ sql: queryParts.join(""),
204
+ params
205
+ };
206
+ };
148
207
  var BaseQueryBuilder = class {
149
208
  constructor(db) {
150
209
  this.db = db;
@@ -157,15 +216,20 @@ var BaseQueryBuilder = class {
157
216
  return this;
158
217
  }
159
218
  orderBy(column, direction = "ASC") {
160
- this.query += ` ORDER BY ${column._.name} ${direction}`;
219
+ if ("sql" in column) {
220
+ this.query += ` ORDER BY ${column.sql} ${direction}`;
221
+ this.params.push(...column.params);
222
+ } else {
223
+ this.query += ` ORDER BY ${column._.name} ${direction}`;
224
+ }
161
225
  return this;
162
226
  }
163
- limit(count) {
164
- this.query += ` LIMIT ${count}`;
227
+ limit(count2) {
228
+ this.query += ` LIMIT ${count2}`;
165
229
  return this;
166
230
  }
167
- offset(count) {
168
- this.query += ` OFFSET ${count}`;
231
+ offset(count2) {
232
+ this.query += ` OFFSET ${count2}`;
169
233
  return this;
170
234
  }
171
235
  build() {
@@ -183,9 +247,37 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
183
247
  const columnNames = columns ? columns.map((c) => table._.columns[c]._.name) : ["*"];
184
248
  this.query = `SELECT ${columnNames.join(", ")} FROM ${table._.name}`;
185
249
  }
250
+ isDistinct = false;
251
+ groupByColumns = [];
252
+ havingCondition = null;
253
+ distinct() {
254
+ this.isDistinct = true;
255
+ this.query = this.query.replace("SELECT", "SELECT DISTINCT");
256
+ return this;
257
+ }
258
+ groupBy(...columns) {
259
+ this.groupByColumns.push(...columns);
260
+ const columnNames = columns.map((col) => col._.name).join(", ");
261
+ this.query += ` GROUP BY ${columnNames}`;
262
+ return this;
263
+ }
264
+ having(condition) {
265
+ this.havingCondition = condition;
266
+ this.query += ` HAVING ${condition.sql}`;
267
+ this.params.push(...condition.params);
268
+ return this;
269
+ }
186
270
  async execute() {
187
- const { sql, params } = this.build();
188
- return this.db.select(sql, params);
271
+ const { sql: sql2, params } = this.build();
272
+ return this.db.select(sql2, params);
273
+ }
274
+ async all() {
275
+ return this.execute();
276
+ }
277
+ async get() {
278
+ this.limit(1);
279
+ const result = await this.execute();
280
+ return result[0];
189
281
  }
190
282
  };
191
283
  var InsertQueryBuilder = class extends BaseQueryBuilder {
@@ -195,26 +287,69 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
195
287
  this.query = `INSERT INTO ${table._.name}`;
196
288
  }
197
289
  dataSets = [];
290
+ returningColumns = [];
291
+ onConflictAction = null;
292
+ conflictTarget = [];
293
+ updateSet = {};
198
294
  values(data) {
199
295
  const dataArray = Array.isArray(data) ? data : [data];
200
296
  this.dataSets.push(...dataArray);
201
297
  return this;
202
298
  }
299
+ returning(...columns) {
300
+ this.returningColumns = columns;
301
+ return this;
302
+ }
303
+ onConflictDoNothing(target) {
304
+ this.onConflictAction = "nothing";
305
+ if (target) {
306
+ this.conflictTarget = Array.isArray(target) ? target : [target];
307
+ }
308
+ return this;
309
+ }
310
+ onConflictDoUpdate(config) {
311
+ this.onConflictAction = "update";
312
+ this.conflictTarget = Array.isArray(config.target) ? config.target : [config.target];
313
+ this.updateSet = config.set;
314
+ return this;
315
+ }
316
+ processDefaultValues(data) {
317
+ const finalData = { ...data };
318
+ for (const [key, column] of Object.entries(this.table._.columns)) {
319
+ const typedKey = key;
320
+ if (finalData[typedKey] === void 0) {
321
+ if (column.options.$defaultFn) {
322
+ finalData[typedKey] = column.options.$defaultFn();
323
+ }
324
+ }
325
+ }
326
+ return finalData;
327
+ }
328
+ buildConflictClause() {
329
+ if (!this.onConflictAction) return "";
330
+ let clause = " ON CONFLICT";
331
+ if (this.conflictTarget.length > 0) {
332
+ const targetNames = this.conflictTarget.map((col) => col._.name).join(", ");
333
+ clause += ` (${targetNames})`;
334
+ }
335
+ if (this.onConflictAction === "nothing") {
336
+ clause += " DO NOTHING";
337
+ } else if (this.onConflictAction === "update") {
338
+ const setEntries = Object.entries(this.updateSet);
339
+ if (setEntries.length > 0) {
340
+ const setClause = setEntries.map(([key]) => `${key} = ?`).join(", ");
341
+ clause += ` DO UPDATE SET ${setClause}`;
342
+ }
343
+ }
344
+ return clause;
345
+ }
203
346
  async execute() {
204
347
  if (this.dataSets.length === 0) {
205
348
  throw new Error("No data provided for insert");
206
349
  }
207
- const processedDataSets = this.dataSets.map((dataSet) => {
208
- const finalData = { ...dataSet };
209
- for (const [key, column] of Object.entries(this.table._.columns)) {
210
- if (finalData[key] === void 0) {
211
- if (column.options.$defaultFn) {
212
- finalData[key] = column.options.$defaultFn();
213
- }
214
- }
215
- }
216
- return finalData;
217
- });
350
+ const processedDataSets = this.dataSets.map(
351
+ (data) => this.processDefaultValues(data)
352
+ );
218
353
  const groups = /* @__PURE__ */ new Map();
219
354
  for (const dataSet of processedDataSets) {
220
355
  const keys = Object.keys(dataSet).sort().join(",");
@@ -223,7 +358,9 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
223
358
  }
224
359
  groups.get(keys).push(dataSet);
225
360
  }
226
- let lastInsertId = void 0;
361
+ let results = [];
362
+ let lastInsertId;
363
+ let rowsAffected = 0;
227
364
  for (const [_, dataSets] of groups) {
228
365
  const columns = Object.keys(dataSets[0]);
229
366
  const columnNames = columns.map(
@@ -231,16 +368,40 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
231
368
  );
232
369
  const placeholders = `(${columns.map(() => "?").join(", ")})`;
233
370
  const valuesSql = dataSets.map(() => placeholders).join(", ");
371
+ const conflictClause = this.buildConflictClause();
234
372
  const finalQuery = `${this.query} (${columnNames.join(
235
373
  ", "
236
- )}) VALUES ${valuesSql}`;
374
+ )}) VALUES ${valuesSql}${conflictClause}`;
237
375
  const params = dataSets.flatMap(
238
376
  (data) => columns.map((col) => data[col] ?? null)
239
377
  );
240
- const result = await this.db.execute(finalQuery, params);
241
- lastInsertId = result.lastInsertId;
378
+ if (this.onConflictAction === "update") {
379
+ const setValues = Object.entries(this.updateSet).map(
380
+ ([, value]) => value
381
+ );
382
+ params.push(...setValues);
383
+ }
384
+ if (this.returningColumns.length > 0) {
385
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
386
+ const queryWithReturning = `${finalQuery} RETURNING ${returningNames}`;
387
+ const rows = await this.db.select(queryWithReturning, params);
388
+ results = results.concat(rows);
389
+ } else {
390
+ const result = await this.db.execute(finalQuery, params);
391
+ lastInsertId = result.lastInsertId;
392
+ rowsAffected += result.rowsAffected;
393
+ }
394
+ }
395
+ if (this.returningColumns.length > 0) {
396
+ return results;
242
397
  }
243
- return lastInsertId ?? 0;
398
+ return [{ lastInsertId, rowsAffected }];
399
+ }
400
+ async returningAll() {
401
+ const allColumns = Object.keys(
402
+ this.table._.columns
403
+ );
404
+ return this.returning(...allColumns).execute();
244
405
  }
245
406
  };
246
407
  var UpdateQueryBuilder = class extends BaseQueryBuilder {
@@ -250,15 +411,21 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
250
411
  this.query = `UPDATE ${table._.name}`;
251
412
  }
252
413
  updateData = {};
414
+ returningColumns = [];
253
415
  set(data) {
254
416
  this.updateData = { ...this.updateData, ...data };
255
417
  return this;
256
418
  }
257
- build() {
419
+ returning(...columns) {
420
+ this.returningColumns = columns;
421
+ return this;
422
+ }
423
+ buildUpdateClause() {
258
424
  const finalUpdateData = { ...this.updateData };
259
425
  for (const [key, column] of Object.entries(this.table._.columns)) {
260
- if (finalUpdateData[key] === void 0 && column.options.$onUpdateFn) {
261
- finalUpdateData[key] = column.options.$onUpdateFn();
426
+ const typedKey = key;
427
+ if (finalUpdateData[typedKey] === void 0 && column.options.$onUpdateFn) {
428
+ finalUpdateData[typedKey] = column.options.$onUpdateFn();
262
429
  }
263
430
  }
264
431
  const baseQuery = this.query;
@@ -284,14 +451,26 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
284
451
  return `${column._.name} = ?`;
285
452
  }).join(", ");
286
453
  const setParams = entries.map(([, value]) => value);
287
- const sql = `${tablePart} SET ${setClause}${whereClause}`;
454
+ const sql2 = `${tablePart} SET ${setClause}${whereClause}`;
288
455
  const params = [...setParams, ...whereParams];
289
- return { sql, params };
456
+ return { sql: sql2, params };
290
457
  }
291
458
  async execute() {
292
- const { sql, params } = this.build();
293
- const result = await this.db.execute(sql, params);
294
- return result.rowsAffected;
459
+ const { sql: updateSql, params } = this.buildUpdateClause();
460
+ if (this.returningColumns.length > 0) {
461
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
462
+ const sqlWithReturning = `${updateSql} RETURNING ${returningNames}`;
463
+ return this.db.select(sqlWithReturning, params);
464
+ } else {
465
+ const result = await this.db.execute(updateSql, params);
466
+ return [{ rowsAffected: result.rowsAffected }];
467
+ }
468
+ }
469
+ async returningAll() {
470
+ const allColumns = Object.keys(
471
+ this.table._.columns
472
+ );
473
+ return this.returning(...allColumns).execute();
295
474
  }
296
475
  };
297
476
  var DeleteQueryBuilder = class extends BaseQueryBuilder {
@@ -300,10 +479,67 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
300
479
  this.table = table;
301
480
  this.query = `DELETE FROM ${table._.name}`;
302
481
  }
482
+ returningColumns = [];
483
+ returning(...columns) {
484
+ this.returningColumns = columns;
485
+ return this;
486
+ }
303
487
  async execute() {
304
- const { sql, params } = this.build();
305
- const result = await this.db.execute(sql, params);
306
- return result.rowsAffected;
488
+ const { sql: sql2, params } = this.build();
489
+ if (this.returningColumns.length > 0) {
490
+ const returningNames = this.returningColumns.map((col) => this.table._.columns[col]._.name).join(", ");
491
+ const sqlWithReturning = `${sql2} RETURNING ${returningNames}`;
492
+ return this.db.select(sqlWithReturning, params);
493
+ } else {
494
+ const result = await this.db.execute(sql2, params);
495
+ return [{ rowsAffected: result.rowsAffected }];
496
+ }
497
+ }
498
+ async returningAll() {
499
+ const allColumns = Object.keys(
500
+ this.table._.columns
501
+ );
502
+ return this.returning(...allColumns).execute();
503
+ }
504
+ };
505
+ var WithQueryBuilder = class {
506
+ constructor(db) {
507
+ this.db = db;
508
+ }
509
+ ctes = [];
510
+ with(alias2, query) {
511
+ this.ctes.push({ alias: alias2, query: query.sql, params: query.params });
512
+ return this;
513
+ }
514
+ select(table, columns) {
515
+ const builder = new SelectQueryBuilder(this.db, table, columns);
516
+ this.applyWithClause(builder);
517
+ return builder;
518
+ }
519
+ insert(table) {
520
+ const builder = new InsertQueryBuilder(this.db, table);
521
+ this.applyWithClause(builder);
522
+ return builder;
523
+ }
524
+ update(table) {
525
+ const builder = new UpdateQueryBuilder(this.db, table);
526
+ this.applyWithClause(builder);
527
+ return builder;
528
+ }
529
+ delete(table) {
530
+ const builder = new DeleteQueryBuilder(this.db, table);
531
+ this.applyWithClause(builder);
532
+ return builder;
533
+ }
534
+ applyWithClause(builder) {
535
+ if (this.ctes.length > 0) {
536
+ const cteSql = this.ctes.map((cte) => `${cte.alias} AS (${cte.query})`).join(", ");
537
+ builder["query"] = `WITH ${cteSql} ${builder["query"]}`;
538
+ builder["params"] = [
539
+ ...this.ctes.flatMap((cte) => cte.params),
540
+ ...builder["params"]
541
+ ];
542
+ }
307
543
  }
308
544
  };
309
545
  var TauriORM = class {
@@ -317,23 +553,23 @@ var TauriORM = class {
317
553
  }
318
554
  tables = /* @__PURE__ */ new Map();
319
555
  buildColumnDefinition(col, forAlterTable = false) {
320
- let sql = `${col._.name} ${col.type}`;
556
+ let sql2 = `${col._.name} ${col.type}`;
321
557
  if (col.options.primaryKey && !forAlterTable) {
322
- sql += " PRIMARY KEY";
558
+ sql2 += " PRIMARY KEY";
323
559
  if (col._.autoincrement) {
324
- sql += " AUTOINCREMENT";
560
+ sql2 += " AUTOINCREMENT";
325
561
  }
326
562
  }
327
- if (col._.notNull) sql += " NOT NULL";
328
- if (col.options.unique) sql += " UNIQUE";
563
+ if (col._.notNull) sql2 += " NOT NULL";
564
+ if (col.options.unique) sql2 += " UNIQUE";
329
565
  if (col.options.default !== void 0) {
330
566
  const value = col.options.default;
331
- sql += ` DEFAULT ${typeof value === "string" ? `'${value.replace(/'/g, "''")}'` : value}`;
567
+ sql2 += ` DEFAULT ${typeof value === "string" ? `'${value.replace(/'/g, "''")}'` : value}`;
332
568
  }
333
569
  if (col.options.references) {
334
- sql += ` REFERENCES ${col.options.references.table._.name}(${col.options.references.column._.name})`;
570
+ sql2 += ` REFERENCES ${col.options.references.table._.name}(${col.options.references.column._.name})`;
335
571
  }
336
- return sql;
572
+ return sql2;
337
573
  }
338
574
  async migrate() {
339
575
  for (const table of this.tables.values()) {
@@ -370,6 +606,15 @@ var TauriORM = class {
370
606
  delete(table) {
371
607
  return new DeleteQueryBuilder(this.db, table);
372
608
  }
609
+ $with(alias2) {
610
+ const withBuilder = new WithQueryBuilder(this.db);
611
+ return {
612
+ as: (query) => {
613
+ withBuilder.with(alias2, query);
614
+ return withBuilder;
615
+ }
616
+ };
617
+ }
373
618
  async transaction(callback) {
374
619
  await this.db.execute("BEGIN TRANSACTION");
375
620
  try {
@@ -381,6 +626,9 @@ var TauriORM = class {
381
626
  throw error;
382
627
  }
383
628
  }
629
+ rollback() {
630
+ throw new Error("Transaction rolled back");
631
+ }
384
632
  // --- Schema detection / signature ---
385
633
  async ensureSchemaMeta() {
386
634
  await this.db.execute(
@@ -458,6 +706,12 @@ var relations = (table, relationsCallback) => {
458
706
  })
459
707
  });
460
708
  };
709
+ var getTableColumns = (table) => {
710
+ return table._.columns;
711
+ };
712
+ var alias = (table, alias2) => {
713
+ return table;
714
+ };
461
715
  export {
462
716
  DeleteQueryBuilder,
463
717
  InsertQueryBuilder,
@@ -466,10 +720,18 @@ export {
466
720
  Table,
467
721
  TauriORM,
468
722
  UpdateQueryBuilder,
723
+ WithQueryBuilder,
724
+ alias,
469
725
  and,
726
+ asc,
727
+ avg,
470
728
  blob,
471
729
  boolean,
730
+ count,
731
+ countDistinct,
732
+ desc,
472
733
  eq,
734
+ getTableColumns,
473
735
  gt,
474
736
  gte,
475
737
  inArray,
@@ -479,9 +741,14 @@ export {
479
741
  like,
480
742
  lt,
481
743
  lte,
744
+ max,
745
+ min,
746
+ not,
482
747
  or,
483
748
  real,
484
749
  relations,
750
+ sql,
485
751
  sqliteTable,
752
+ sum,
486
753
  text
487
754
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@type32/tauri-sqlite-orm",
3
- "version": "0.1.18-5",
3
+ "version": "0.1.18-6",
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",