@type32/tauri-sqlite-orm 0.1.18-17 → 0.1.18-19
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 +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +82 -43
- package/dist/index.mjs +82 -43
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -246,7 +246,7 @@ declare class OneRelation<T extends AnyTable = AnyTable> extends Relation<T> {
|
|
|
246
246
|
declare class ManyRelation<T extends AnyTable = AnyTable> extends Relation<T> {
|
|
247
247
|
constructor(foreignTable: T);
|
|
248
248
|
}
|
|
249
|
-
declare const relations: <T extends AnyTable, R extends Record<string, Relation>>(
|
|
249
|
+
declare const relations: <T extends AnyTable, R extends Record<string, Relation>>(table: T, relationsCallback: (helpers: RelationsBuilder) => R) => R;
|
|
250
250
|
declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
|
|
251
251
|
declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
|
|
252
252
|
|
package/dist/index.d.ts
CHANGED
|
@@ -246,7 +246,7 @@ declare class OneRelation<T extends AnyTable = AnyTable> extends Relation<T> {
|
|
|
246
246
|
declare class ManyRelation<T extends AnyTable = AnyTable> extends Relation<T> {
|
|
247
247
|
constructor(foreignTable: T);
|
|
248
248
|
}
|
|
249
|
-
declare const relations: <T extends AnyTable, R extends Record<string, Relation>>(
|
|
249
|
+
declare const relations: <T extends AnyTable, R extends Record<string, Relation>>(table: T, relationsCallback: (helpers: RelationsBuilder) => R) => R;
|
|
250
250
|
declare const getTableColumns: <T extends AnyTable>(table: T) => Record<string, AnySQLiteColumn>;
|
|
251
251
|
declare const alias: <T extends AnyTable>(table: T, alias: string) => Table<T["_"]["columns"], T["_"]["name"]>;
|
|
252
252
|
|
package/dist/index.js
CHANGED
|
@@ -186,7 +186,10 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
186
186
|
this.table = table;
|
|
187
187
|
this.columns = columns;
|
|
188
188
|
this.selectedTableAlias = table._.name;
|
|
189
|
-
|
|
189
|
+
const selected = columns ? columns.map((c) => this.table._.columns[c]) : Object.values(this.table._.columns);
|
|
190
|
+
this.selectedColumns = selected.map(
|
|
191
|
+
(col) => `${this.selectedTableAlias}.${col._.name} AS "${this.selectedTableAlias}.${col._.name}"`
|
|
192
|
+
);
|
|
190
193
|
this.query = `FROM ${table._.name} ${this.selectedTableAlias}`;
|
|
191
194
|
}
|
|
192
195
|
isDistinct = false;
|
|
@@ -214,12 +217,18 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
214
217
|
}
|
|
215
218
|
leftJoin(table, condition, alias2) {
|
|
216
219
|
this.joins.push({ type: "LEFT", table, condition, alias: alias2 });
|
|
217
|
-
|
|
220
|
+
const aliasedColumns = Object.values(table._.columns).map(
|
|
221
|
+
(col) => `${alias2}.${col._.name} AS "${alias2}.${col._.name}"`
|
|
222
|
+
);
|
|
223
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
218
224
|
return this;
|
|
219
225
|
}
|
|
220
226
|
innerJoin(table, condition, alias2) {
|
|
221
227
|
this.joins.push({ type: "INNER", table, condition, alias: alias2 });
|
|
222
|
-
|
|
228
|
+
const aliasedColumns = Object.values(table._.columns).map(
|
|
229
|
+
(col) => `${alias2}.${col._.name} AS "${alias2}.${col._.name}"`
|
|
230
|
+
);
|
|
231
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
223
232
|
return this;
|
|
224
233
|
}
|
|
225
234
|
include(relations2) {
|
|
@@ -244,7 +253,10 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
244
253
|
}
|
|
245
254
|
const foreignTable = relation.foreignTable;
|
|
246
255
|
const foreignAlias = `${this.selectedTableAlias}_${relationName}`;
|
|
247
|
-
|
|
256
|
+
const aliasedColumns = Object.values(foreignTable._.columns).map(
|
|
257
|
+
(col) => `${foreignAlias}.${col._.name} AS "${foreignAlias}.${col._.name}"`
|
|
258
|
+
);
|
|
259
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
248
260
|
if (relation.type === "one" && relation.fields && relation.references) {
|
|
249
261
|
const conditions = relation.fields.map((field, i) => {
|
|
250
262
|
const localColumn = `${this.selectedTableAlias}.${field._.name}`;
|
|
@@ -289,16 +301,40 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
289
301
|
const { sql: sql2, params } = this.build();
|
|
290
302
|
console.log("Executing SQL:", sql2, "with params:", params);
|
|
291
303
|
const rawResults = await this.db.select(sql2, params);
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
return
|
|
304
|
+
const hasIncludes = Object.values(this.includeRelations).some((i) => i);
|
|
305
|
+
if (hasIncludes) {
|
|
306
|
+
return this.processRelationResults(rawResults);
|
|
295
307
|
}
|
|
296
|
-
|
|
308
|
+
const hasJoins = this.joins.length > 0;
|
|
309
|
+
if (hasJoins) {
|
|
310
|
+
return rawResults;
|
|
311
|
+
}
|
|
312
|
+
const prefix = `${this.selectedTableAlias}.`;
|
|
313
|
+
return rawResults.map((row) => {
|
|
314
|
+
const newRow = {};
|
|
315
|
+
for (const key in row) {
|
|
316
|
+
if (key.startsWith(prefix)) {
|
|
317
|
+
newRow[key.substring(prefix.length)] = row[key];
|
|
318
|
+
} else {
|
|
319
|
+
newRow[key] = row[key];
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return newRow;
|
|
323
|
+
});
|
|
297
324
|
}
|
|
298
325
|
processRelationResults(rawResults) {
|
|
299
|
-
if (!rawResults.length) return
|
|
300
|
-
|
|
301
|
-
|
|
326
|
+
if (!rawResults.length) return [];
|
|
327
|
+
const mainTablePks = Object.values(this.table._.columns).filter((c) => c.options.primaryKey).map((c) => c._.name);
|
|
328
|
+
if (mainTablePks.length === 0) {
|
|
329
|
+
return rawResults;
|
|
330
|
+
}
|
|
331
|
+
const groupedResults = /* @__PURE__ */ new Map();
|
|
332
|
+
for (const row of rawResults) {
|
|
333
|
+
const mainTableKey = mainTablePks.map((pk) => row[`${this.selectedTableAlias}.${pk}`] ?? row[pk]).join("_");
|
|
334
|
+
if (!groupedResults.has(mainTableKey)) {
|
|
335
|
+
groupedResults.set(mainTableKey, {});
|
|
336
|
+
}
|
|
337
|
+
const result = groupedResults.get(mainTableKey);
|
|
302
338
|
const relations2 = {};
|
|
303
339
|
for (const [key, value] of Object.entries(row)) {
|
|
304
340
|
if (key.includes(".")) {
|
|
@@ -321,15 +357,25 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
321
357
|
}
|
|
322
358
|
}
|
|
323
359
|
for (const [relName, relData] of Object.entries(relations2)) {
|
|
360
|
+
const relationConfig = this.table.relations[relName];
|
|
361
|
+
if (!relationConfig) continue;
|
|
324
362
|
const hasData = Object.values(relData).some(
|
|
325
363
|
(v) => v !== null && v !== void 0 && v !== ""
|
|
326
364
|
);
|
|
327
|
-
if (hasData)
|
|
365
|
+
if (!hasData) continue;
|
|
366
|
+
if (relationConfig.type === "many") {
|
|
367
|
+
if (!result[relName]) result[relName] = [];
|
|
368
|
+
const relatedPks = Object.values(relationConfig.foreignTable._.columns).filter((c) => c.options.primaryKey).map((c) => c._.name);
|
|
369
|
+
const relDataKey = relatedPks.map((pk) => relData[pk]).join("_");
|
|
370
|
+
if (relatedPks.length === 0 || !result[relName].some((r) => relatedPks.map((pk) => r[pk]).join("_") === relDataKey)) {
|
|
371
|
+
result[relName].push(relData);
|
|
372
|
+
}
|
|
373
|
+
} else {
|
|
328
374
|
result[relName] = relData;
|
|
329
375
|
}
|
|
330
376
|
}
|
|
331
|
-
|
|
332
|
-
|
|
377
|
+
}
|
|
378
|
+
return Array.from(groupedResults.values());
|
|
333
379
|
}
|
|
334
380
|
// Update the return type signatures
|
|
335
381
|
async all() {
|
|
@@ -719,29 +765,6 @@ var TauriORM = class {
|
|
|
719
765
|
this.tables.set(value._.name, value);
|
|
720
766
|
}
|
|
721
767
|
}
|
|
722
|
-
for (const [key, value] of Object.entries(schema)) {
|
|
723
|
-
if (!(value instanceof Table) && typeof value === "object") {
|
|
724
|
-
const tableName = key.replace("Relations", "");
|
|
725
|
-
const table = Array.from(this.tables.values()).find((t) => t._.name === tableName);
|
|
726
|
-
if (table) {
|
|
727
|
-
for (const [relName, rel] of Object.entries(value)) {
|
|
728
|
-
if (rel instanceof OneRelation) {
|
|
729
|
-
table.relations[relName] = {
|
|
730
|
-
type: "one",
|
|
731
|
-
foreignTable: rel.foreignTable,
|
|
732
|
-
fields: rel.config?.fields,
|
|
733
|
-
references: rel.config?.references
|
|
734
|
-
};
|
|
735
|
-
} else if (rel instanceof ManyRelation) {
|
|
736
|
-
table.relations[relName] = {
|
|
737
|
-
type: "many",
|
|
738
|
-
foreignTable: rel.foreignTable
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
768
|
}
|
|
746
769
|
}
|
|
747
770
|
tables = /* @__PURE__ */ new Map();
|
|
@@ -920,15 +943,31 @@ var ManyRelation = class extends Relation {
|
|
|
920
943
|
super(foreignTable);
|
|
921
944
|
}
|
|
922
945
|
};
|
|
923
|
-
var relations = (
|
|
924
|
-
|
|
925
|
-
one: (
|
|
926
|
-
return new OneRelation(
|
|
946
|
+
var relations = (table, relationsCallback) => {
|
|
947
|
+
const builtRelations = relationsCallback({
|
|
948
|
+
one: (foreignTable, config) => {
|
|
949
|
+
return new OneRelation(foreignTable, config);
|
|
927
950
|
},
|
|
928
|
-
many: (
|
|
929
|
-
return new ManyRelation(
|
|
951
|
+
many: (foreignTable) => {
|
|
952
|
+
return new ManyRelation(foreignTable);
|
|
930
953
|
}
|
|
931
954
|
});
|
|
955
|
+
for (const [name, relation] of Object.entries(builtRelations)) {
|
|
956
|
+
if (relation instanceof OneRelation) {
|
|
957
|
+
table.relations[name] = {
|
|
958
|
+
type: "one",
|
|
959
|
+
foreignTable: relation.foreignTable,
|
|
960
|
+
fields: relation.config?.fields,
|
|
961
|
+
references: relation.config?.references
|
|
962
|
+
};
|
|
963
|
+
} else if (relation instanceof ManyRelation) {
|
|
964
|
+
table.relations[name] = {
|
|
965
|
+
type: "many",
|
|
966
|
+
foreignTable: relation.foreignTable
|
|
967
|
+
};
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
return builtRelations;
|
|
932
971
|
};
|
|
933
972
|
var getTableColumns = (table) => {
|
|
934
973
|
return table._.columns;
|
package/dist/index.mjs
CHANGED
|
@@ -119,7 +119,10 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
119
119
|
this.table = table;
|
|
120
120
|
this.columns = columns;
|
|
121
121
|
this.selectedTableAlias = table._.name;
|
|
122
|
-
|
|
122
|
+
const selected = columns ? columns.map((c) => this.table._.columns[c]) : Object.values(this.table._.columns);
|
|
123
|
+
this.selectedColumns = selected.map(
|
|
124
|
+
(col) => `${this.selectedTableAlias}.${col._.name} AS "${this.selectedTableAlias}.${col._.name}"`
|
|
125
|
+
);
|
|
123
126
|
this.query = `FROM ${table._.name} ${this.selectedTableAlias}`;
|
|
124
127
|
}
|
|
125
128
|
isDistinct = false;
|
|
@@ -147,12 +150,18 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
147
150
|
}
|
|
148
151
|
leftJoin(table, condition, alias2) {
|
|
149
152
|
this.joins.push({ type: "LEFT", table, condition, alias: alias2 });
|
|
150
|
-
|
|
153
|
+
const aliasedColumns = Object.values(table._.columns).map(
|
|
154
|
+
(col) => `${alias2}.${col._.name} AS "${alias2}.${col._.name}"`
|
|
155
|
+
);
|
|
156
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
151
157
|
return this;
|
|
152
158
|
}
|
|
153
159
|
innerJoin(table, condition, alias2) {
|
|
154
160
|
this.joins.push({ type: "INNER", table, condition, alias: alias2 });
|
|
155
|
-
|
|
161
|
+
const aliasedColumns = Object.values(table._.columns).map(
|
|
162
|
+
(col) => `${alias2}.${col._.name} AS "${alias2}.${col._.name}"`
|
|
163
|
+
);
|
|
164
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
156
165
|
return this;
|
|
157
166
|
}
|
|
158
167
|
include(relations2) {
|
|
@@ -177,7 +186,10 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
177
186
|
}
|
|
178
187
|
const foreignTable = relation.foreignTable;
|
|
179
188
|
const foreignAlias = `${this.selectedTableAlias}_${relationName}`;
|
|
180
|
-
|
|
189
|
+
const aliasedColumns = Object.values(foreignTable._.columns).map(
|
|
190
|
+
(col) => `${foreignAlias}.${col._.name} AS "${foreignAlias}.${col._.name}"`
|
|
191
|
+
);
|
|
192
|
+
this.selectedColumns.push(...aliasedColumns);
|
|
181
193
|
if (relation.type === "one" && relation.fields && relation.references) {
|
|
182
194
|
const conditions = relation.fields.map((field, i) => {
|
|
183
195
|
const localColumn = `${this.selectedTableAlias}.${field._.name}`;
|
|
@@ -222,16 +234,40 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
222
234
|
const { sql: sql2, params } = this.build();
|
|
223
235
|
console.log("Executing SQL:", sql2, "with params:", params);
|
|
224
236
|
const rawResults = await this.db.select(sql2, params);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
return
|
|
237
|
+
const hasIncludes = Object.values(this.includeRelations).some((i) => i);
|
|
238
|
+
if (hasIncludes) {
|
|
239
|
+
return this.processRelationResults(rawResults);
|
|
228
240
|
}
|
|
229
|
-
|
|
241
|
+
const hasJoins = this.joins.length > 0;
|
|
242
|
+
if (hasJoins) {
|
|
243
|
+
return rawResults;
|
|
244
|
+
}
|
|
245
|
+
const prefix = `${this.selectedTableAlias}.`;
|
|
246
|
+
return rawResults.map((row) => {
|
|
247
|
+
const newRow = {};
|
|
248
|
+
for (const key in row) {
|
|
249
|
+
if (key.startsWith(prefix)) {
|
|
250
|
+
newRow[key.substring(prefix.length)] = row[key];
|
|
251
|
+
} else {
|
|
252
|
+
newRow[key] = row[key];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return newRow;
|
|
256
|
+
});
|
|
230
257
|
}
|
|
231
258
|
processRelationResults(rawResults) {
|
|
232
|
-
if (!rawResults.length) return
|
|
233
|
-
|
|
234
|
-
|
|
259
|
+
if (!rawResults.length) return [];
|
|
260
|
+
const mainTablePks = Object.values(this.table._.columns).filter((c) => c.options.primaryKey).map((c) => c._.name);
|
|
261
|
+
if (mainTablePks.length === 0) {
|
|
262
|
+
return rawResults;
|
|
263
|
+
}
|
|
264
|
+
const groupedResults = /* @__PURE__ */ new Map();
|
|
265
|
+
for (const row of rawResults) {
|
|
266
|
+
const mainTableKey = mainTablePks.map((pk) => row[`${this.selectedTableAlias}.${pk}`] ?? row[pk]).join("_");
|
|
267
|
+
if (!groupedResults.has(mainTableKey)) {
|
|
268
|
+
groupedResults.set(mainTableKey, {});
|
|
269
|
+
}
|
|
270
|
+
const result = groupedResults.get(mainTableKey);
|
|
235
271
|
const relations2 = {};
|
|
236
272
|
for (const [key, value] of Object.entries(row)) {
|
|
237
273
|
if (key.includes(".")) {
|
|
@@ -254,15 +290,25 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
254
290
|
}
|
|
255
291
|
}
|
|
256
292
|
for (const [relName, relData] of Object.entries(relations2)) {
|
|
293
|
+
const relationConfig = this.table.relations[relName];
|
|
294
|
+
if (!relationConfig) continue;
|
|
257
295
|
const hasData = Object.values(relData).some(
|
|
258
296
|
(v) => v !== null && v !== void 0 && v !== ""
|
|
259
297
|
);
|
|
260
|
-
if (hasData)
|
|
298
|
+
if (!hasData) continue;
|
|
299
|
+
if (relationConfig.type === "many") {
|
|
300
|
+
if (!result[relName]) result[relName] = [];
|
|
301
|
+
const relatedPks = Object.values(relationConfig.foreignTable._.columns).filter((c) => c.options.primaryKey).map((c) => c._.name);
|
|
302
|
+
const relDataKey = relatedPks.map((pk) => relData[pk]).join("_");
|
|
303
|
+
if (relatedPks.length === 0 || !result[relName].some((r) => relatedPks.map((pk) => r[pk]).join("_") === relDataKey)) {
|
|
304
|
+
result[relName].push(relData);
|
|
305
|
+
}
|
|
306
|
+
} else {
|
|
261
307
|
result[relName] = relData;
|
|
262
308
|
}
|
|
263
309
|
}
|
|
264
|
-
|
|
265
|
-
|
|
310
|
+
}
|
|
311
|
+
return Array.from(groupedResults.values());
|
|
266
312
|
}
|
|
267
313
|
// Update the return type signatures
|
|
268
314
|
async all() {
|
|
@@ -652,29 +698,6 @@ var TauriORM = class {
|
|
|
652
698
|
this.tables.set(value._.name, value);
|
|
653
699
|
}
|
|
654
700
|
}
|
|
655
|
-
for (const [key, value] of Object.entries(schema)) {
|
|
656
|
-
if (!(value instanceof Table) && typeof value === "object") {
|
|
657
|
-
const tableName = key.replace("Relations", "");
|
|
658
|
-
const table = Array.from(this.tables.values()).find((t) => t._.name === tableName);
|
|
659
|
-
if (table) {
|
|
660
|
-
for (const [relName, rel] of Object.entries(value)) {
|
|
661
|
-
if (rel instanceof OneRelation) {
|
|
662
|
-
table.relations[relName] = {
|
|
663
|
-
type: "one",
|
|
664
|
-
foreignTable: rel.foreignTable,
|
|
665
|
-
fields: rel.config?.fields,
|
|
666
|
-
references: rel.config?.references
|
|
667
|
-
};
|
|
668
|
-
} else if (rel instanceof ManyRelation) {
|
|
669
|
-
table.relations[relName] = {
|
|
670
|
-
type: "many",
|
|
671
|
-
foreignTable: rel.foreignTable
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
701
|
}
|
|
679
702
|
}
|
|
680
703
|
tables = /* @__PURE__ */ new Map();
|
|
@@ -853,15 +876,31 @@ var ManyRelation = class extends Relation {
|
|
|
853
876
|
super(foreignTable);
|
|
854
877
|
}
|
|
855
878
|
};
|
|
856
|
-
var relations = (
|
|
857
|
-
|
|
858
|
-
one: (
|
|
859
|
-
return new OneRelation(
|
|
879
|
+
var relations = (table, relationsCallback) => {
|
|
880
|
+
const builtRelations = relationsCallback({
|
|
881
|
+
one: (foreignTable, config) => {
|
|
882
|
+
return new OneRelation(foreignTable, config);
|
|
860
883
|
},
|
|
861
|
-
many: (
|
|
862
|
-
return new ManyRelation(
|
|
884
|
+
many: (foreignTable) => {
|
|
885
|
+
return new ManyRelation(foreignTable);
|
|
863
886
|
}
|
|
864
887
|
});
|
|
888
|
+
for (const [name, relation] of Object.entries(builtRelations)) {
|
|
889
|
+
if (relation instanceof OneRelation) {
|
|
890
|
+
table.relations[name] = {
|
|
891
|
+
type: "one",
|
|
892
|
+
foreignTable: relation.foreignTable,
|
|
893
|
+
fields: relation.config?.fields,
|
|
894
|
+
references: relation.config?.references
|
|
895
|
+
};
|
|
896
|
+
} else if (relation instanceof ManyRelation) {
|
|
897
|
+
table.relations[name] = {
|
|
898
|
+
type: "many",
|
|
899
|
+
foreignTable: relation.foreignTable
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return builtRelations;
|
|
865
904
|
};
|
|
866
905
|
var getTableColumns = (table) => {
|
|
867
906
|
return table._.columns;
|