@type32/tauri-sqlite-orm 0.1.18-11 → 0.1.18-13
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 +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +109 -34
- package/dist/index.mjs +109 -34
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -49,7 +49,7 @@ declare class BaseQueryBuilder {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable[
|
|
52
|
+
declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable['_']['columns'])[] | undefined = undefined> extends BaseQueryBuilder {
|
|
53
53
|
private table;
|
|
54
54
|
private columns?;
|
|
55
55
|
private isDistinct;
|
|
@@ -57,15 +57,17 @@ declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns exten
|
|
|
57
57
|
private havingCondition;
|
|
58
58
|
private joins;
|
|
59
59
|
private includeRelations;
|
|
60
|
+
private selectedTableAlias;
|
|
60
61
|
constructor(db: Database, table: TTable, columns?: TSelectedColumns | undefined);
|
|
61
62
|
distinct(): this;
|
|
62
63
|
groupBy(...columns: AnySQLiteColumn[]): this;
|
|
63
64
|
having(condition: SQLCondition): this;
|
|
64
|
-
leftJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias
|
|
65
|
-
innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias
|
|
65
|
+
leftJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
|
|
66
|
+
innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
|
|
66
67
|
include(relations: Record<string, boolean>): this;
|
|
67
68
|
private buildJoins;
|
|
68
69
|
execute(): Promise<any[]>;
|
|
70
|
+
private processRelationResults;
|
|
69
71
|
all(): Promise<any[]>;
|
|
70
72
|
get(): Promise<any | undefined>;
|
|
71
73
|
}
|
|
@@ -107,7 +109,7 @@ declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
|
|
|
107
109
|
private table;
|
|
108
110
|
private returningColumns;
|
|
109
111
|
constructor(db: Database, table: T);
|
|
110
|
-
returning(...columns: (keyof T[
|
|
112
|
+
returning(...columns: (keyof T['_']['columns'])[]): this;
|
|
111
113
|
execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
|
|
112
114
|
returningAll(): Promise<InferSelectModel<T>[]>;
|
|
113
115
|
}
|
|
@@ -247,7 +249,7 @@ declare const relations: <T extends AnyTable, R extends Record<string, Relation>
|
|
|
247
249
|
declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
|
|
248
250
|
declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
|
|
249
251
|
|
|
250
|
-
declare const eq: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
|
|
252
|
+
declare const eq: <T>(column: AnySQLiteColumn, value: T, tableAlias?: string) => SQLCondition;
|
|
251
253
|
declare const and: (...conditions: SQLCondition[]) => SQLCondition;
|
|
252
254
|
declare const or: (...conditions: SQLCondition[]) => SQLCondition;
|
|
253
255
|
declare const not: (condition: SQLCondition) => SQLCondition;
|
package/dist/index.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ declare class BaseQueryBuilder {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable[
|
|
52
|
+
declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns extends (keyof TTable['_']['columns'])[] | undefined = undefined> extends BaseQueryBuilder {
|
|
53
53
|
private table;
|
|
54
54
|
private columns?;
|
|
55
55
|
private isDistinct;
|
|
@@ -57,15 +57,17 @@ declare class SelectQueryBuilder<TTable extends AnyTable, TSelectedColumns exten
|
|
|
57
57
|
private havingCondition;
|
|
58
58
|
private joins;
|
|
59
59
|
private includeRelations;
|
|
60
|
+
private selectedTableAlias;
|
|
60
61
|
constructor(db: Database, table: TTable, columns?: TSelectedColumns | undefined);
|
|
61
62
|
distinct(): this;
|
|
62
63
|
groupBy(...columns: AnySQLiteColumn[]): this;
|
|
63
64
|
having(condition: SQLCondition): this;
|
|
64
|
-
leftJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias
|
|
65
|
-
innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias
|
|
65
|
+
leftJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
|
|
66
|
+
innerJoin<T extends AnyTable>(table: T, condition: SQLCondition, alias: string): this;
|
|
66
67
|
include(relations: Record<string, boolean>): this;
|
|
67
68
|
private buildJoins;
|
|
68
69
|
execute(): Promise<any[]>;
|
|
70
|
+
private processRelationResults;
|
|
69
71
|
all(): Promise<any[]>;
|
|
70
72
|
get(): Promise<any | undefined>;
|
|
71
73
|
}
|
|
@@ -107,7 +109,7 @@ declare class DeleteQueryBuilder<T extends AnyTable> extends BaseQueryBuilder {
|
|
|
107
109
|
private table;
|
|
108
110
|
private returningColumns;
|
|
109
111
|
constructor(db: Database, table: T);
|
|
110
|
-
returning(...columns: (keyof T[
|
|
112
|
+
returning(...columns: (keyof T['_']['columns'])[]): this;
|
|
111
113
|
execute(): Promise<T extends AnyTable ? (InferSelectModel<T> & Record<string, any>)[] : never>;
|
|
112
114
|
returningAll(): Promise<InferSelectModel<T>[]>;
|
|
113
115
|
}
|
|
@@ -247,7 +249,7 @@ declare const relations: <T extends AnyTable, R extends Record<string, Relation>
|
|
|
247
249
|
declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
|
|
248
250
|
declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
|
|
249
251
|
|
|
250
|
-
declare const eq: <T>(column: AnySQLiteColumn, value: T) => SQLCondition;
|
|
252
|
+
declare const eq: <T>(column: AnySQLiteColumn, value: T, tableAlias?: string) => SQLCondition;
|
|
251
253
|
declare const and: (...conditions: SQLCondition[]) => SQLCondition;
|
|
252
254
|
declare const or: (...conditions: SQLCondition[]) => SQLCondition;
|
|
253
255
|
declare const not: (condition: SQLCondition) => SQLCondition;
|
package/dist/index.js
CHANGED
|
@@ -103,10 +103,13 @@ var BaseQueryBuilder = class {
|
|
|
103
103
|
};
|
|
104
104
|
|
|
105
105
|
// src/operators.ts
|
|
106
|
-
var eq = (column, value) =>
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
106
|
+
var eq = (column, value, tableAlias) => {
|
|
107
|
+
const columnName = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
108
|
+
return {
|
|
109
|
+
sql: `${columnName} = ?`,
|
|
110
|
+
params: [value]
|
|
111
|
+
};
|
|
112
|
+
};
|
|
110
113
|
var and = (...conditions) => ({
|
|
111
114
|
sql: conditions.map((c) => `(${c.sql})`).join(" AND "),
|
|
112
115
|
params: conditions.flatMap((c) => c.params)
|
|
@@ -182,14 +185,16 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
182
185
|
super(db);
|
|
183
186
|
this.table = table;
|
|
184
187
|
this.columns = columns;
|
|
185
|
-
|
|
186
|
-
|
|
188
|
+
this.selectedTableAlias = table._.name;
|
|
189
|
+
const columnNames = columns ? columns.map((c) => `${this.selectedTableAlias}.${table._.columns[c]._.name}`) : [`${this.selectedTableAlias}.*`];
|
|
190
|
+
this.query = `SELECT ${columnNames.join(", ")} FROM ${table._.name} ${this.selectedTableAlias}`;
|
|
187
191
|
}
|
|
188
192
|
isDistinct = false;
|
|
189
193
|
groupByColumns = [];
|
|
190
194
|
havingCondition = null;
|
|
191
195
|
joins = [];
|
|
192
196
|
includeRelations = {};
|
|
197
|
+
selectedTableAlias;
|
|
193
198
|
distinct() {
|
|
194
199
|
this.isDistinct = true;
|
|
195
200
|
this.query = this.query.replace("SELECT", "SELECT DISTINCT");
|
|
@@ -197,7 +202,7 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
197
202
|
}
|
|
198
203
|
groupBy(...columns) {
|
|
199
204
|
this.groupByColumns.push(...columns);
|
|
200
|
-
const columnNames = columns.map((col) => col._.name).join(", ");
|
|
205
|
+
const columnNames = columns.map((col) => `${this.selectedTableAlias}.${col._.name}`).join(", ");
|
|
201
206
|
this.query += ` GROUP BY ${columnNames}`;
|
|
202
207
|
return this;
|
|
203
208
|
}
|
|
@@ -223,48 +228,103 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
223
228
|
let sql2 = "";
|
|
224
229
|
const params = [];
|
|
225
230
|
for (const join of this.joins) {
|
|
226
|
-
|
|
227
|
-
sql2 += ` ${join.type} JOIN ${join.table._.name} ${tableAlias} ON ${join.condition.sql}`;
|
|
231
|
+
sql2 += ` ${join.type} JOIN ${join.table._.name} ${join.alias} ON ${join.condition.sql}`;
|
|
228
232
|
params.push(...join.condition.params);
|
|
229
233
|
}
|
|
230
|
-
for (const [relationName, include] of Object.entries(
|
|
231
|
-
this.includeRelations
|
|
232
|
-
)) {
|
|
234
|
+
for (const [relationName, include] of Object.entries(this.includeRelations)) {
|
|
233
235
|
if (!include) continue;
|
|
234
236
|
const relation = this.table.relations[relationName];
|
|
235
237
|
if (!relation) continue;
|
|
236
238
|
const foreignTable = relation.foreignTable;
|
|
237
|
-
const foreignAlias = `${this.
|
|
239
|
+
const foreignAlias = `${this.selectedTableAlias}_${relationName}`;
|
|
238
240
|
if (relation.type === "one" && relation.fields && relation.references) {
|
|
239
|
-
const conditions = relation.fields.map(
|
|
240
|
-
|
|
241
|
-
|
|
241
|
+
const conditions = relation.fields.map((field, i) => {
|
|
242
|
+
const localColumn = `${this.selectedTableAlias}.${field._.name}`;
|
|
243
|
+
const foreignColumn = `${foreignAlias}.${relation.references[i]._.name}`;
|
|
244
|
+
return {
|
|
245
|
+
sql: `${localColumn} = ${foreignColumn}`,
|
|
246
|
+
params: []
|
|
247
|
+
};
|
|
248
|
+
});
|
|
242
249
|
const condition = conditions.length > 1 ? and(...conditions) : conditions[0];
|
|
243
250
|
sql2 += ` LEFT JOIN ${foreignTable._.name} ${foreignAlias} ON ${condition.sql}`;
|
|
244
251
|
params.push(...condition.params);
|
|
245
252
|
} else if (relation.type === "many") {
|
|
246
|
-
const refRelation = Object.
|
|
247
|
-
(r) => r.foreignTable === this.table
|
|
253
|
+
const refRelation = Object.entries(foreignTable.relations).find(
|
|
254
|
+
([_, r]) => r.foreignTable === this.table
|
|
248
255
|
);
|
|
249
|
-
if (refRelation && refRelation.fields && refRelation.references) {
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
256
|
+
if (refRelation && refRelation[1].fields && refRelation[1].references) {
|
|
257
|
+
const [_, relationConfig] = refRelation;
|
|
258
|
+
const conditions = relationConfig.fields.map((field, i) => {
|
|
259
|
+
const localColumn = `${foreignAlias}.${field._.name}`;
|
|
260
|
+
const foreignColumn = `${this.selectedTableAlias}.${relationConfig.references[i]._.name}`;
|
|
261
|
+
return {
|
|
262
|
+
sql: `${localColumn} = ${foreignColumn}`,
|
|
263
|
+
params: []
|
|
264
|
+
};
|
|
265
|
+
});
|
|
253
266
|
const condition = conditions.length > 1 ? and(...conditions) : conditions[0];
|
|
254
267
|
sql2 += ` LEFT JOIN ${foreignTable._.name} ${foreignAlias} ON ${condition.sql}`;
|
|
255
268
|
params.push(...condition.params);
|
|
269
|
+
this.query = this.query.replace("SELECT ", `SELECT ${this.selectedTableAlias}.*, ${foreignAlias}.* `).replace(
|
|
270
|
+
`SELECT ${this.selectedTableAlias}.*, `,
|
|
271
|
+
`SELECT ${this.selectedTableAlias}.*, ${foreignAlias}.*, `
|
|
272
|
+
);
|
|
256
273
|
}
|
|
257
274
|
}
|
|
258
275
|
}
|
|
259
276
|
return { sql: sql2, params };
|
|
260
277
|
}
|
|
278
|
+
// Enhanced execute method that handles relation data mapping
|
|
261
279
|
async execute() {
|
|
262
280
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
263
281
|
this.query += joinSql;
|
|
264
282
|
this.params.push(...joinParams);
|
|
265
283
|
const { sql: sql2, params } = this.build();
|
|
266
|
-
|
|
284
|
+
const rawResults = await this.db.select(sql2, params);
|
|
285
|
+
if (Object.keys(this.includeRelations).some((key) => this.includeRelations[key])) {
|
|
286
|
+
const processed = this.processRelationResults(rawResults);
|
|
287
|
+
return processed;
|
|
288
|
+
}
|
|
289
|
+
return rawResults;
|
|
290
|
+
}
|
|
291
|
+
processRelationResults(rawResults) {
|
|
292
|
+
if (!rawResults.length) return rawResults;
|
|
293
|
+
return rawResults.map((row) => {
|
|
294
|
+
const result = {};
|
|
295
|
+
const relations2 = {};
|
|
296
|
+
for (const [key, value] of Object.entries(row)) {
|
|
297
|
+
if (key.includes(".")) {
|
|
298
|
+
const [tableAlias, columnName] = key.split(".");
|
|
299
|
+
if (tableAlias === this.selectedTableAlias) {
|
|
300
|
+
result[columnName] = value;
|
|
301
|
+
} else {
|
|
302
|
+
const parts = tableAlias.split("_");
|
|
303
|
+
if (parts.length >= 2 && parts[0] === this.selectedTableAlias) {
|
|
304
|
+
const relationName = parts.slice(1).join("_");
|
|
305
|
+
if (!relations2[relationName]) relations2[relationName] = {};
|
|
306
|
+
relations2[relationName][columnName] = value;
|
|
307
|
+
} else {
|
|
308
|
+
if (!result[tableAlias]) result[tableAlias] = {};
|
|
309
|
+
result[tableAlias][columnName] = value;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
} else {
|
|
313
|
+
result[key] = value;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
for (const [relName, relData] of Object.entries(relations2)) {
|
|
317
|
+
const hasData = Object.values(relData).some(
|
|
318
|
+
(v) => v !== null && v !== void 0 && v !== ""
|
|
319
|
+
);
|
|
320
|
+
if (hasData) {
|
|
321
|
+
result[relName] = relData;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return result;
|
|
325
|
+
});
|
|
267
326
|
}
|
|
327
|
+
// Update the return type signatures
|
|
268
328
|
async all() {
|
|
269
329
|
return this.execute();
|
|
270
330
|
}
|
|
@@ -496,9 +556,7 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
|
|
|
496
556
|
}
|
|
497
557
|
}
|
|
498
558
|
async returningAll() {
|
|
499
|
-
const allColumns = Object.keys(
|
|
500
|
-
this.table._.columns
|
|
501
|
-
);
|
|
559
|
+
const allColumns = Object.keys(this.table._.columns);
|
|
502
560
|
return this.returning(...allColumns).execute();
|
|
503
561
|
}
|
|
504
562
|
};
|
|
@@ -687,9 +745,7 @@ var TauriORM = class {
|
|
|
687
745
|
for (const [key, value] of Object.entries(schema)) {
|
|
688
746
|
if (!(value instanceof Table) && typeof value === "object") {
|
|
689
747
|
const tableName = key.replace("Relations", "");
|
|
690
|
-
const table = Array.from(this.tables.values()).find(
|
|
691
|
-
(t) => t._.name === tableName
|
|
692
|
-
);
|
|
748
|
+
const table = Array.from(this.tables.values()).find((t) => t._.name === tableName);
|
|
693
749
|
if (table) {
|
|
694
750
|
for (const [relName, rel] of Object.entries(value)) {
|
|
695
751
|
if (rel instanceof OneRelation) {
|
|
@@ -738,7 +794,10 @@ var TauriORM = class {
|
|
|
738
794
|
);
|
|
739
795
|
if (existingTableInfo.length === 0) {
|
|
740
796
|
const columnsSql = Object.values(table._.columns).map((col) => this.buildColumnDefinition(col)).join(", ");
|
|
741
|
-
const createSql = `CREATE TABLE ${table._.name}
|
|
797
|
+
const createSql = `CREATE TABLE ${table._.name}
|
|
798
|
+
(
|
|
799
|
+
${columnsSql}
|
|
800
|
+
)`;
|
|
742
801
|
await this.db.execute(createSql);
|
|
743
802
|
} else {
|
|
744
803
|
const existingColumnNames = new Set(
|
|
@@ -747,7 +806,8 @@ var TauriORM = class {
|
|
|
747
806
|
for (const column of Object.values(table._.columns)) {
|
|
748
807
|
if (!existingColumnNames.has(column._.name)) {
|
|
749
808
|
const columnSql = this.buildColumnDefinition(column, true);
|
|
750
|
-
const alterSql = `ALTER TABLE ${table._.name}
|
|
809
|
+
const alterSql = `ALTER TABLE ${table._.name}
|
|
810
|
+
ADD COLUMN ${columnSql}`;
|
|
751
811
|
await this.db.execute(alterSql);
|
|
752
812
|
}
|
|
753
813
|
}
|
|
@@ -792,13 +852,25 @@ var TauriORM = class {
|
|
|
792
852
|
// --- Schema detection / signature ---
|
|
793
853
|
async ensureSchemaMeta() {
|
|
794
854
|
await this.db.execute(
|
|
795
|
-
`CREATE TABLE IF NOT EXISTS _schema_meta
|
|
855
|
+
`CREATE TABLE IF NOT EXISTS _schema_meta
|
|
856
|
+
(
|
|
857
|
+
key
|
|
858
|
+
TEXT
|
|
859
|
+
PRIMARY
|
|
860
|
+
KEY,
|
|
861
|
+
value
|
|
862
|
+
TEXT
|
|
863
|
+
NOT
|
|
864
|
+
NULL
|
|
865
|
+
)`
|
|
796
866
|
);
|
|
797
867
|
}
|
|
798
868
|
async getSchemaMeta(key) {
|
|
799
869
|
await this.ensureSchemaMeta();
|
|
800
870
|
const rows = await this.db.select(
|
|
801
|
-
`SELECT value
|
|
871
|
+
`SELECT value
|
|
872
|
+
FROM _schema_meta
|
|
873
|
+
WHERE key = ?`,
|
|
802
874
|
[key]
|
|
803
875
|
);
|
|
804
876
|
return rows?.[0]?.value ?? null;
|
|
@@ -806,7 +878,10 @@ var TauriORM = class {
|
|
|
806
878
|
async setSchemaMeta(key, value) {
|
|
807
879
|
await this.ensureSchemaMeta();
|
|
808
880
|
await this.db.execute(
|
|
809
|
-
`INSERT INTO _schema_meta(key, value)
|
|
881
|
+
`INSERT INTO _schema_meta(key, value)
|
|
882
|
+
VALUES (?, ?) ON CONFLICT(key) DO
|
|
883
|
+
UPDATE
|
|
884
|
+
SET value = excluded.value`,
|
|
810
885
|
[key, value]
|
|
811
886
|
);
|
|
812
887
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -36,10 +36,13 @@ var BaseQueryBuilder = class {
|
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
// src/operators.ts
|
|
39
|
-
var eq = (column, value) =>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
39
|
+
var eq = (column, value, tableAlias) => {
|
|
40
|
+
const columnName = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
41
|
+
return {
|
|
42
|
+
sql: `${columnName} = ?`,
|
|
43
|
+
params: [value]
|
|
44
|
+
};
|
|
45
|
+
};
|
|
43
46
|
var and = (...conditions) => ({
|
|
44
47
|
sql: conditions.map((c) => `(${c.sql})`).join(" AND "),
|
|
45
48
|
params: conditions.flatMap((c) => c.params)
|
|
@@ -115,14 +118,16 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
115
118
|
super(db);
|
|
116
119
|
this.table = table;
|
|
117
120
|
this.columns = columns;
|
|
118
|
-
|
|
119
|
-
|
|
121
|
+
this.selectedTableAlias = table._.name;
|
|
122
|
+
const columnNames = columns ? columns.map((c) => `${this.selectedTableAlias}.${table._.columns[c]._.name}`) : [`${this.selectedTableAlias}.*`];
|
|
123
|
+
this.query = `SELECT ${columnNames.join(", ")} FROM ${table._.name} ${this.selectedTableAlias}`;
|
|
120
124
|
}
|
|
121
125
|
isDistinct = false;
|
|
122
126
|
groupByColumns = [];
|
|
123
127
|
havingCondition = null;
|
|
124
128
|
joins = [];
|
|
125
129
|
includeRelations = {};
|
|
130
|
+
selectedTableAlias;
|
|
126
131
|
distinct() {
|
|
127
132
|
this.isDistinct = true;
|
|
128
133
|
this.query = this.query.replace("SELECT", "SELECT DISTINCT");
|
|
@@ -130,7 +135,7 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
130
135
|
}
|
|
131
136
|
groupBy(...columns) {
|
|
132
137
|
this.groupByColumns.push(...columns);
|
|
133
|
-
const columnNames = columns.map((col) => col._.name).join(", ");
|
|
138
|
+
const columnNames = columns.map((col) => `${this.selectedTableAlias}.${col._.name}`).join(", ");
|
|
134
139
|
this.query += ` GROUP BY ${columnNames}`;
|
|
135
140
|
return this;
|
|
136
141
|
}
|
|
@@ -156,48 +161,103 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
156
161
|
let sql2 = "";
|
|
157
162
|
const params = [];
|
|
158
163
|
for (const join of this.joins) {
|
|
159
|
-
|
|
160
|
-
sql2 += ` ${join.type} JOIN ${join.table._.name} ${tableAlias} ON ${join.condition.sql}`;
|
|
164
|
+
sql2 += ` ${join.type} JOIN ${join.table._.name} ${join.alias} ON ${join.condition.sql}`;
|
|
161
165
|
params.push(...join.condition.params);
|
|
162
166
|
}
|
|
163
|
-
for (const [relationName, include] of Object.entries(
|
|
164
|
-
this.includeRelations
|
|
165
|
-
)) {
|
|
167
|
+
for (const [relationName, include] of Object.entries(this.includeRelations)) {
|
|
166
168
|
if (!include) continue;
|
|
167
169
|
const relation = this.table.relations[relationName];
|
|
168
170
|
if (!relation) continue;
|
|
169
171
|
const foreignTable = relation.foreignTable;
|
|
170
|
-
const foreignAlias = `${this.
|
|
172
|
+
const foreignAlias = `${this.selectedTableAlias}_${relationName}`;
|
|
171
173
|
if (relation.type === "one" && relation.fields && relation.references) {
|
|
172
|
-
const conditions = relation.fields.map(
|
|
173
|
-
|
|
174
|
-
|
|
174
|
+
const conditions = relation.fields.map((field, i) => {
|
|
175
|
+
const localColumn = `${this.selectedTableAlias}.${field._.name}`;
|
|
176
|
+
const foreignColumn = `${foreignAlias}.${relation.references[i]._.name}`;
|
|
177
|
+
return {
|
|
178
|
+
sql: `${localColumn} = ${foreignColumn}`,
|
|
179
|
+
params: []
|
|
180
|
+
};
|
|
181
|
+
});
|
|
175
182
|
const condition = conditions.length > 1 ? and(...conditions) : conditions[0];
|
|
176
183
|
sql2 += ` LEFT JOIN ${foreignTable._.name} ${foreignAlias} ON ${condition.sql}`;
|
|
177
184
|
params.push(...condition.params);
|
|
178
185
|
} else if (relation.type === "many") {
|
|
179
|
-
const refRelation = Object.
|
|
180
|
-
(r) => r.foreignTable === this.table
|
|
186
|
+
const refRelation = Object.entries(foreignTable.relations).find(
|
|
187
|
+
([_, r]) => r.foreignTable === this.table
|
|
181
188
|
);
|
|
182
|
-
if (refRelation && refRelation.fields && refRelation.references) {
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
189
|
+
if (refRelation && refRelation[1].fields && refRelation[1].references) {
|
|
190
|
+
const [_, relationConfig] = refRelation;
|
|
191
|
+
const conditions = relationConfig.fields.map((field, i) => {
|
|
192
|
+
const localColumn = `${foreignAlias}.${field._.name}`;
|
|
193
|
+
const foreignColumn = `${this.selectedTableAlias}.${relationConfig.references[i]._.name}`;
|
|
194
|
+
return {
|
|
195
|
+
sql: `${localColumn} = ${foreignColumn}`,
|
|
196
|
+
params: []
|
|
197
|
+
};
|
|
198
|
+
});
|
|
186
199
|
const condition = conditions.length > 1 ? and(...conditions) : conditions[0];
|
|
187
200
|
sql2 += ` LEFT JOIN ${foreignTable._.name} ${foreignAlias} ON ${condition.sql}`;
|
|
188
201
|
params.push(...condition.params);
|
|
202
|
+
this.query = this.query.replace("SELECT ", `SELECT ${this.selectedTableAlias}.*, ${foreignAlias}.* `).replace(
|
|
203
|
+
`SELECT ${this.selectedTableAlias}.*, `,
|
|
204
|
+
`SELECT ${this.selectedTableAlias}.*, ${foreignAlias}.*, `
|
|
205
|
+
);
|
|
189
206
|
}
|
|
190
207
|
}
|
|
191
208
|
}
|
|
192
209
|
return { sql: sql2, params };
|
|
193
210
|
}
|
|
211
|
+
// Enhanced execute method that handles relation data mapping
|
|
194
212
|
async execute() {
|
|
195
213
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
196
214
|
this.query += joinSql;
|
|
197
215
|
this.params.push(...joinParams);
|
|
198
216
|
const { sql: sql2, params } = this.build();
|
|
199
|
-
|
|
217
|
+
const rawResults = await this.db.select(sql2, params);
|
|
218
|
+
if (Object.keys(this.includeRelations).some((key) => this.includeRelations[key])) {
|
|
219
|
+
const processed = this.processRelationResults(rawResults);
|
|
220
|
+
return processed;
|
|
221
|
+
}
|
|
222
|
+
return rawResults;
|
|
223
|
+
}
|
|
224
|
+
processRelationResults(rawResults) {
|
|
225
|
+
if (!rawResults.length) return rawResults;
|
|
226
|
+
return rawResults.map((row) => {
|
|
227
|
+
const result = {};
|
|
228
|
+
const relations2 = {};
|
|
229
|
+
for (const [key, value] of Object.entries(row)) {
|
|
230
|
+
if (key.includes(".")) {
|
|
231
|
+
const [tableAlias, columnName] = key.split(".");
|
|
232
|
+
if (tableAlias === this.selectedTableAlias) {
|
|
233
|
+
result[columnName] = value;
|
|
234
|
+
} else {
|
|
235
|
+
const parts = tableAlias.split("_");
|
|
236
|
+
if (parts.length >= 2 && parts[0] === this.selectedTableAlias) {
|
|
237
|
+
const relationName = parts.slice(1).join("_");
|
|
238
|
+
if (!relations2[relationName]) relations2[relationName] = {};
|
|
239
|
+
relations2[relationName][columnName] = value;
|
|
240
|
+
} else {
|
|
241
|
+
if (!result[tableAlias]) result[tableAlias] = {};
|
|
242
|
+
result[tableAlias][columnName] = value;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
result[key] = value;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
for (const [relName, relData] of Object.entries(relations2)) {
|
|
250
|
+
const hasData = Object.values(relData).some(
|
|
251
|
+
(v) => v !== null && v !== void 0 && v !== ""
|
|
252
|
+
);
|
|
253
|
+
if (hasData) {
|
|
254
|
+
result[relName] = relData;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
});
|
|
200
259
|
}
|
|
260
|
+
// Update the return type signatures
|
|
201
261
|
async all() {
|
|
202
262
|
return this.execute();
|
|
203
263
|
}
|
|
@@ -429,9 +489,7 @@ var DeleteQueryBuilder = class extends BaseQueryBuilder {
|
|
|
429
489
|
}
|
|
430
490
|
}
|
|
431
491
|
async returningAll() {
|
|
432
|
-
const allColumns = Object.keys(
|
|
433
|
-
this.table._.columns
|
|
434
|
-
);
|
|
492
|
+
const allColumns = Object.keys(this.table._.columns);
|
|
435
493
|
return this.returning(...allColumns).execute();
|
|
436
494
|
}
|
|
437
495
|
};
|
|
@@ -620,9 +678,7 @@ var TauriORM = class {
|
|
|
620
678
|
for (const [key, value] of Object.entries(schema)) {
|
|
621
679
|
if (!(value instanceof Table) && typeof value === "object") {
|
|
622
680
|
const tableName = key.replace("Relations", "");
|
|
623
|
-
const table = Array.from(this.tables.values()).find(
|
|
624
|
-
(t) => t._.name === tableName
|
|
625
|
-
);
|
|
681
|
+
const table = Array.from(this.tables.values()).find((t) => t._.name === tableName);
|
|
626
682
|
if (table) {
|
|
627
683
|
for (const [relName, rel] of Object.entries(value)) {
|
|
628
684
|
if (rel instanceof OneRelation) {
|
|
@@ -671,7 +727,10 @@ var TauriORM = class {
|
|
|
671
727
|
);
|
|
672
728
|
if (existingTableInfo.length === 0) {
|
|
673
729
|
const columnsSql = Object.values(table._.columns).map((col) => this.buildColumnDefinition(col)).join(", ");
|
|
674
|
-
const createSql = `CREATE TABLE ${table._.name}
|
|
730
|
+
const createSql = `CREATE TABLE ${table._.name}
|
|
731
|
+
(
|
|
732
|
+
${columnsSql}
|
|
733
|
+
)`;
|
|
675
734
|
await this.db.execute(createSql);
|
|
676
735
|
} else {
|
|
677
736
|
const existingColumnNames = new Set(
|
|
@@ -680,7 +739,8 @@ var TauriORM = class {
|
|
|
680
739
|
for (const column of Object.values(table._.columns)) {
|
|
681
740
|
if (!existingColumnNames.has(column._.name)) {
|
|
682
741
|
const columnSql = this.buildColumnDefinition(column, true);
|
|
683
|
-
const alterSql = `ALTER TABLE ${table._.name}
|
|
742
|
+
const alterSql = `ALTER TABLE ${table._.name}
|
|
743
|
+
ADD COLUMN ${columnSql}`;
|
|
684
744
|
await this.db.execute(alterSql);
|
|
685
745
|
}
|
|
686
746
|
}
|
|
@@ -725,13 +785,25 @@ var TauriORM = class {
|
|
|
725
785
|
// --- Schema detection / signature ---
|
|
726
786
|
async ensureSchemaMeta() {
|
|
727
787
|
await this.db.execute(
|
|
728
|
-
`CREATE TABLE IF NOT EXISTS _schema_meta
|
|
788
|
+
`CREATE TABLE IF NOT EXISTS _schema_meta
|
|
789
|
+
(
|
|
790
|
+
key
|
|
791
|
+
TEXT
|
|
792
|
+
PRIMARY
|
|
793
|
+
KEY,
|
|
794
|
+
value
|
|
795
|
+
TEXT
|
|
796
|
+
NOT
|
|
797
|
+
NULL
|
|
798
|
+
)`
|
|
729
799
|
);
|
|
730
800
|
}
|
|
731
801
|
async getSchemaMeta(key) {
|
|
732
802
|
await this.ensureSchemaMeta();
|
|
733
803
|
const rows = await this.db.select(
|
|
734
|
-
`SELECT value
|
|
804
|
+
`SELECT value
|
|
805
|
+
FROM _schema_meta
|
|
806
|
+
WHERE key = ?`,
|
|
735
807
|
[key]
|
|
736
808
|
);
|
|
737
809
|
return rows?.[0]?.value ?? null;
|
|
@@ -739,7 +811,10 @@ var TauriORM = class {
|
|
|
739
811
|
async setSchemaMeta(key, value) {
|
|
740
812
|
await this.ensureSchemaMeta();
|
|
741
813
|
await this.db.execute(
|
|
742
|
-
`INSERT INTO _schema_meta(key, value)
|
|
814
|
+
`INSERT INTO _schema_meta(key, value)
|
|
815
|
+
VALUES (?, ?) ON CONFLICT(key) DO
|
|
816
|
+
UPDATE
|
|
817
|
+
SET value = excluded.value`,
|
|
743
818
|
[key, value]
|
|
744
819
|
);
|
|
745
820
|
}
|