@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 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>>(_table: T, relationsCallback: (helpers: RelationsBuilder) => R) => R;
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>>(_table: T, relationsCallback: (helpers: RelationsBuilder) => R) => R;
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
- this.selectedColumns = columns ? columns.map((c) => `${this.selectedTableAlias}.${table._.columns[c]._.name}`) : [`${this.selectedTableAlias}.*`];
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
- this.selectedColumns.push(`${alias2}.*`);
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
- this.selectedColumns.push(`${alias2}.*`);
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
- this.selectedColumns.push(`${foreignAlias}.*`);
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
- if (Object.keys(this.includeRelations).some((key) => this.includeRelations[key])) {
293
- const processed = this.processRelationResults(rawResults);
294
- return processed;
304
+ const hasIncludes = Object.values(this.includeRelations).some((i) => i);
305
+ if (hasIncludes) {
306
+ return this.processRelationResults(rawResults);
295
307
  }
296
- return rawResults;
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 rawResults;
300
- return rawResults.map((row) => {
301
- const result = {};
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
- return result;
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 = (_table, relationsCallback) => {
924
- return relationsCallback({
925
- one: (table, config) => {
926
- return new OneRelation(table, config);
946
+ var relations = (table, relationsCallback) => {
947
+ const builtRelations = relationsCallback({
948
+ one: (foreignTable, config) => {
949
+ return new OneRelation(foreignTable, config);
927
950
  },
928
- many: (table) => {
929
- return new ManyRelation(table);
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
- this.selectedColumns = columns ? columns.map((c) => `${this.selectedTableAlias}.${table._.columns[c]._.name}`) : [`${this.selectedTableAlias}.*`];
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
- this.selectedColumns.push(`${alias2}.*`);
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
- this.selectedColumns.push(`${alias2}.*`);
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
- this.selectedColumns.push(`${foreignAlias}.*`);
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
- if (Object.keys(this.includeRelations).some((key) => this.includeRelations[key])) {
226
- const processed = this.processRelationResults(rawResults);
227
- return processed;
237
+ const hasIncludes = Object.values(this.includeRelations).some((i) => i);
238
+ if (hasIncludes) {
239
+ return this.processRelationResults(rawResults);
228
240
  }
229
- return rawResults;
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 rawResults;
233
- return rawResults.map((row) => {
234
- const result = {};
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
- return result;
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 = (_table, relationsCallback) => {
857
- return relationsCallback({
858
- one: (table, config) => {
859
- return new OneRelation(table, config);
879
+ var relations = (table, relationsCallback) => {
880
+ const builtRelations = relationsCallback({
881
+ one: (foreignTable, config) => {
882
+ return new OneRelation(foreignTable, config);
860
883
  },
861
- many: (table) => {
862
- return new ManyRelation(table);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@type32/tauri-sqlite-orm",
3
- "version": "0.1.18-17",
3
+ "version": "0.1.18-19",
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",