@type32/tauri-sqlite-orm 0.2.15 → 0.4.0
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/aggregates.d.ts +12 -0
- package/dist/aggregates.js +9 -0
- package/dist/builders/delete.d.ts +23 -0
- package/dist/builders/delete.js +73 -0
- package/dist/builders/index.d.ts +7 -0
- package/dist/builders/index.js +7 -0
- package/dist/builders/insert.d.ts +31 -0
- package/dist/builders/insert.js +141 -0
- package/dist/builders/query-base.d.ts +1 -0
- package/dist/builders/query-base.js +1 -0
- package/dist/builders/relations.d.ts +11 -0
- package/dist/builders/relations.js +1 -0
- package/dist/builders/select.d.ts +54 -0
- package/dist/builders/select.js +427 -0
- package/dist/builders/update.d.ts +30 -0
- package/dist/builders/update.js +124 -0
- package/dist/builders/with.d.ts +17 -0
- package/dist/builders/with.js +34 -0
- package/dist/column-helpers.d.ts +22 -0
- package/dist/column-helpers.js +17 -0
- package/dist/dialect.d.ts +21 -0
- package/dist/dialect.js +67 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.js +66 -0
- package/dist/index.d.mts +150 -4
- package/dist/index.d.ts +150 -4
- package/dist/index.js +270 -108
- package/dist/index.mjs +263 -104
- package/dist/operators.d.ts +30 -0
- package/dist/operators.js +84 -0
- package/dist/orm.d.ts +180 -0
- package/dist/orm.js +556 -0
- package/dist/relational-types.d.ts +87 -0
- package/dist/relational-types.js +1 -0
- package/dist/relations-v2.d.ts +77 -0
- package/dist/relations-v2.js +157 -0
- package/dist/serialization.d.ts +14 -0
- package/dist/serialization.js +135 -0
- package/dist/subquery.d.ts +5 -0
- package/dist/subquery.js +6 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +1 -0
- package/package.json +2 -1
package/dist/index.mjs
CHANGED
|
@@ -75,7 +75,10 @@ var TauriDialect = class {
|
|
|
75
75
|
};
|
|
76
76
|
|
|
77
77
|
// src/builders/select.ts
|
|
78
|
-
import { sql } from "kysely";
|
|
78
|
+
import { sql as sql2 } from "kysely";
|
|
79
|
+
|
|
80
|
+
// src/operators.ts
|
|
81
|
+
import { isExpression, sql } from "kysely";
|
|
79
82
|
|
|
80
83
|
// src/serialization.ts
|
|
81
84
|
function serializeValue(value, column) {
|
|
@@ -178,6 +181,83 @@ function deserializeValue(value, column) {
|
|
|
178
181
|
return value;
|
|
179
182
|
}
|
|
180
183
|
|
|
184
|
+
// src/operators.ts
|
|
185
|
+
var eq = (column, value, tableAlias) => {
|
|
186
|
+
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
187
|
+
const serialized = serializeValue(value, column);
|
|
188
|
+
return sql`${sql.ref(colRef)} = ${sql.val(serialized)}`;
|
|
189
|
+
};
|
|
190
|
+
var ne = (column, value, tableAlias) => {
|
|
191
|
+
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
192
|
+
const serialized = serializeValue(value, column);
|
|
193
|
+
return sql`${sql.ref(colRef)} != ${sql.val(serialized)}`;
|
|
194
|
+
};
|
|
195
|
+
var and = (...conditions) => {
|
|
196
|
+
if (conditions.length === 0) return sql`1 = 1`;
|
|
197
|
+
if (conditions.length === 1) return conditions[0];
|
|
198
|
+
return sql`(${sql.join(conditions.map((c) => sql`(${c})`), sql` AND `)})`;
|
|
199
|
+
};
|
|
200
|
+
var or = (...conditions) => {
|
|
201
|
+
if (conditions.length === 0) return sql`1 = 1`;
|
|
202
|
+
if (conditions.length === 1) return conditions[0];
|
|
203
|
+
return sql`(${sql.join(conditions.map((c) => sql`(${c})`), sql` OR `)})`;
|
|
204
|
+
};
|
|
205
|
+
var not = (condition) => sql`NOT (${condition})`;
|
|
206
|
+
var gt = (column, value) => {
|
|
207
|
+
const serialized = serializeValue(value, column);
|
|
208
|
+
return sql`${sql.ref(column._.name)} > ${sql.val(serialized)}`;
|
|
209
|
+
};
|
|
210
|
+
var gte = (column, value) => {
|
|
211
|
+
const serialized = serializeValue(value, column);
|
|
212
|
+
return sql`${sql.ref(column._.name)} >= ${sql.val(serialized)}`;
|
|
213
|
+
};
|
|
214
|
+
var lt = (column, value) => {
|
|
215
|
+
const serialized = serializeValue(value, column);
|
|
216
|
+
return sql`${sql.ref(column._.name)} < ${sql.val(serialized)}`;
|
|
217
|
+
};
|
|
218
|
+
var lte = (column, value) => {
|
|
219
|
+
const serialized = serializeValue(value, column);
|
|
220
|
+
return sql`${sql.ref(column._.name)} <= ${sql.val(serialized)}`;
|
|
221
|
+
};
|
|
222
|
+
var like = (column, pattern) => sql`${sql.ref(column._.name)} LIKE ${sql.val(pattern)}`;
|
|
223
|
+
var ilike = (column, pattern) => sql`${sql.ref(column._.name)} LIKE ${sql.val(pattern)} COLLATE NOCASE`;
|
|
224
|
+
var startsWith = (column, value) => sql`${sql.ref(column._.name)} LIKE ${sql.val(`${value}%`)}`;
|
|
225
|
+
var endsWith = (column, value) => sql`${sql.ref(column._.name)} LIKE ${sql.val(`%${value}`)}`;
|
|
226
|
+
var contains = (column, value) => sql`${sql.ref(column._.name)} LIKE ${sql.val(`%${value}%`)}`;
|
|
227
|
+
var isNull = (column) => sql`${sql.ref(column._.name)} IS NULL`;
|
|
228
|
+
var isNotNull = (column) => sql`${sql.ref(column._.name)} IS NOT NULL`;
|
|
229
|
+
var exists = (subquery2) => sql`EXISTS ${subquery2}`;
|
|
230
|
+
var notExists = (subquery2) => sql`NOT EXISTS ${subquery2}`;
|
|
231
|
+
var eqSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} = (${subquery2})`;
|
|
232
|
+
var neSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} != (${subquery2})`;
|
|
233
|
+
var gtSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} > (${subquery2})`;
|
|
234
|
+
var gteSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} >= (${subquery2})`;
|
|
235
|
+
var ltSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} < (${subquery2})`;
|
|
236
|
+
var lteSubquery = (column, subquery2) => sql`${sql.ref(column._.name)} <= (${subquery2})`;
|
|
237
|
+
var inArray = (column, values) => {
|
|
238
|
+
if (isExpression(values)) {
|
|
239
|
+
return sql`${sql.ref(column._.name)} IN (${values})`;
|
|
240
|
+
}
|
|
241
|
+
const arr = values;
|
|
242
|
+
if (arr.length === 0) return sql`1 = 0`;
|
|
243
|
+
const serialized = arr.map((v) => sql.val(serializeValue(v, column)));
|
|
244
|
+
return sql`${sql.ref(column._.name)} IN (${sql.join(serialized)})`;
|
|
245
|
+
};
|
|
246
|
+
var notIn = (column, values) => {
|
|
247
|
+
if (isExpression(values)) {
|
|
248
|
+
return sql`${sql.ref(column._.name)} NOT IN (${values})`;
|
|
249
|
+
}
|
|
250
|
+
const arr = values;
|
|
251
|
+
if (arr.length === 0) return sql`1 = 1`;
|
|
252
|
+
const serialized = arr.map((v) => sql.val(serializeValue(v, column)));
|
|
253
|
+
return sql`${sql.ref(column._.name)} NOT IN (${sql.join(serialized)})`;
|
|
254
|
+
};
|
|
255
|
+
var between = (column, min2, max2) => {
|
|
256
|
+
const serializedMin = serializeValue(min2, column);
|
|
257
|
+
const serializedMax = serializeValue(max2, column);
|
|
258
|
+
return sql`${sql.ref(column._.name)} BETWEEN ${sql.val(serializedMin)} AND ${sql.val(serializedMax)}`;
|
|
259
|
+
};
|
|
260
|
+
|
|
181
261
|
// src/builders/select.ts
|
|
182
262
|
function getDbNameToTsName(table) {
|
|
183
263
|
const map = {};
|
|
@@ -239,7 +319,7 @@ var SelectQueryBuilder = class {
|
|
|
239
319
|
this._builder = this._builder.orderBy(column, direction);
|
|
240
320
|
} else {
|
|
241
321
|
this._builder = this._builder.orderBy(
|
|
242
|
-
|
|
322
|
+
sql2.ref(column._.name),
|
|
243
323
|
direction
|
|
244
324
|
);
|
|
245
325
|
}
|
|
@@ -256,7 +336,7 @@ var SelectQueryBuilder = class {
|
|
|
256
336
|
groupBy(...columns) {
|
|
257
337
|
for (const col of columns) {
|
|
258
338
|
this._builder = this._builder.groupBy(
|
|
259
|
-
|
|
339
|
+
sql2`${sql2.ref(this._table._.name)}.${sql2.ref(col._.name)}`
|
|
260
340
|
);
|
|
261
341
|
}
|
|
262
342
|
return this;
|
|
@@ -307,32 +387,62 @@ var SelectQueryBuilder = class {
|
|
|
307
387
|
(col) => `${foreignAlias}.${col._.name} as "${foreignAlias}.${col._.name}"`
|
|
308
388
|
);
|
|
309
389
|
if (relation.type === "one" && relation.fields && relation.references) {
|
|
310
|
-
const onCondition =
|
|
390
|
+
const onCondition = sql2`${sql2.join(
|
|
311
391
|
relation.fields.map(
|
|
312
|
-
(field, i) =>
|
|
392
|
+
(field, i) => sql2`${sql2.ref(`${parentAlias}.${field._.name}`)} = ${sql2.ref(`${foreignAlias}.${relation.references[i]._.name}`)}`
|
|
313
393
|
),
|
|
314
|
-
|
|
394
|
+
sql2` AND `
|
|
315
395
|
)}`;
|
|
316
396
|
this._builder = this._builder.leftJoin(
|
|
317
397
|
`${foreignTable._.name} as ${foreignAlias}`,
|
|
318
398
|
(join) => join.on(onCondition)
|
|
319
399
|
).select(aliasedCols);
|
|
320
400
|
} else if (relation.type === "many") {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
const
|
|
326
|
-
const
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
)}`;
|
|
401
|
+
if (relation.junctionTable && relation.fromJunction && relation.toJunction) {
|
|
402
|
+
const junctionTable = relation.junctionTable;
|
|
403
|
+
const junctionAlias = `${foreignAlias}_jn`;
|
|
404
|
+
const fromJ = relation.fromJunction;
|
|
405
|
+
const toJ = relation.toJunction;
|
|
406
|
+
const join1 = sql2`${sql2.ref(`${parentAlias}.${fromJ.column._.name}`)} = ${sql2.ref(`${junctionAlias}.${fromJ.junctionColumn._.name}`)}`;
|
|
407
|
+
let join2 = sql2`${sql2.ref(`${junctionAlias}.${toJ.junctionColumn._.name}`)} = ${sql2.ref(`${foreignAlias}.${toJ.column._.name}`)}`;
|
|
408
|
+
if (relation.where) {
|
|
409
|
+
join2 = and(join2, relation.where(foreignAlias));
|
|
410
|
+
}
|
|
332
411
|
this._builder = this._builder.leftJoin(
|
|
412
|
+
`${junctionTable._.name} as ${junctionAlias}`,
|
|
413
|
+
(join) => join.on(join1)
|
|
414
|
+
).leftJoin(
|
|
333
415
|
`${foreignTable._.name} as ${foreignAlias}`,
|
|
334
|
-
(join) => join.on(
|
|
416
|
+
(join) => join.on(join2)
|
|
335
417
|
).select(aliasedCols);
|
|
418
|
+
} else {
|
|
419
|
+
let fields = relation.fields;
|
|
420
|
+
let references = relation.references;
|
|
421
|
+
if (!fields || !references) {
|
|
422
|
+
const refRelation = Object.entries(foreignTable.relations).find(
|
|
423
|
+
([, r]) => r.foreignTable === parentTable
|
|
424
|
+
);
|
|
425
|
+
if (refRelation && refRelation[1].fields && refRelation[1].references) {
|
|
426
|
+
const [, relationConfig] = refRelation;
|
|
427
|
+
fields = relationConfig.fields;
|
|
428
|
+
references = relationConfig.references;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (fields && references) {
|
|
432
|
+
let onCondition = sql2`${sql2.join(
|
|
433
|
+
fields.map(
|
|
434
|
+
(field, i) => sql2`${sql2.ref(`${foreignAlias}.${field._.name}`)} = ${sql2.ref(`${parentAlias}.${references[i]._.name}`)}`
|
|
435
|
+
),
|
|
436
|
+
sql2` AND `
|
|
437
|
+
)}`;
|
|
438
|
+
if (relation.where) {
|
|
439
|
+
onCondition = and(onCondition, relation.where(foreignAlias));
|
|
440
|
+
}
|
|
441
|
+
this._builder = this._builder.leftJoin(
|
|
442
|
+
`${foreignTable._.name} as ${foreignAlias}`,
|
|
443
|
+
(join) => join.on(onCondition)
|
|
444
|
+
).select(aliasedCols);
|
|
445
|
+
}
|
|
336
446
|
}
|
|
337
447
|
}
|
|
338
448
|
if (typeof include === "object" && include.with) {
|
|
@@ -428,6 +538,7 @@ var SelectQueryBuilder = class {
|
|
|
428
538
|
const column = this._table._.columns[tsName];
|
|
429
539
|
result[tsName] = column ? deserializeValue(value, column) : value;
|
|
430
540
|
} else {
|
|
541
|
+
if (tableAlias.endsWith("_jn")) continue;
|
|
431
542
|
const path = parseRelationPath(tableAlias, this._table._.name);
|
|
432
543
|
if (path.length > 0) {
|
|
433
544
|
const relationConfig = getNestedRelation(this._table, path);
|
|
@@ -506,12 +617,12 @@ var SelectQueryBuilder = class {
|
|
|
506
617
|
}
|
|
507
618
|
async exists() {
|
|
508
619
|
this.applyIncludes();
|
|
509
|
-
const compiledResult = await this._builder.clearSelect().select(
|
|
620
|
+
const compiledResult = await this._builder.clearSelect().select(sql2.raw("1").as("__exists__")).limit(1).execute();
|
|
510
621
|
return compiledResult.length > 0;
|
|
511
622
|
}
|
|
512
623
|
async count() {
|
|
513
624
|
this.applyIncludes();
|
|
514
|
-
const result = await this._builder.clearSelect().select(
|
|
625
|
+
const result = await this._builder.clearSelect().select(sql2`COUNT(*)`.as("count")).execute();
|
|
515
626
|
const row = result[0];
|
|
516
627
|
const val = row ? row['"count"'] ?? row.count : void 0;
|
|
517
628
|
return Number(val ?? 0);
|
|
@@ -521,7 +632,7 @@ var SelectQueryBuilder = class {
|
|
|
521
632
|
const col = this._table._.columns[column];
|
|
522
633
|
const alias2 = col._.name;
|
|
523
634
|
const results = await this._builder.clearSelect().select(
|
|
524
|
-
|
|
635
|
+
sql2.raw(`${this._table._.name}.${alias2}`).as(alias2)
|
|
525
636
|
).execute();
|
|
526
637
|
return results.map((row) => {
|
|
527
638
|
const val = row['"' + alias2 + '"'] ?? row[alias2];
|
|
@@ -557,7 +668,7 @@ var SelectQueryBuilder = class {
|
|
|
557
668
|
};
|
|
558
669
|
|
|
559
670
|
// src/builders/update.ts
|
|
560
|
-
import { sql as
|
|
671
|
+
import { sql as sql3 } from "kysely";
|
|
561
672
|
|
|
562
673
|
// src/errors.ts
|
|
563
674
|
var TauriORMError = class extends Error {
|
|
@@ -710,7 +821,7 @@ var UpdateQueryBuilder = class {
|
|
|
710
821
|
}
|
|
711
822
|
for (const op of this._incrementDecrementOps) {
|
|
712
823
|
const sign = op.op === "increment" ? "+" : "-";
|
|
713
|
-
setMap[op.column] =
|
|
824
|
+
setMap[op.column] = sql3.raw(`${op.column} ${sign} ${op.value}`);
|
|
714
825
|
}
|
|
715
826
|
return setMap;
|
|
716
827
|
}
|
|
@@ -1482,8 +1593,9 @@ var OneRelation = class extends Relation {
|
|
|
1482
1593
|
}
|
|
1483
1594
|
};
|
|
1484
1595
|
var ManyRelation = class extends Relation {
|
|
1485
|
-
constructor(foreignTable) {
|
|
1596
|
+
constructor(foreignTable, config) {
|
|
1486
1597
|
super(foreignTable);
|
|
1598
|
+
this.config = config;
|
|
1487
1599
|
}
|
|
1488
1600
|
};
|
|
1489
1601
|
var relations = (table, relationsCallback) => {
|
|
@@ -1501,7 +1613,9 @@ var relations = (table, relationsCallback) => {
|
|
|
1501
1613
|
type: "one",
|
|
1502
1614
|
foreignTable: relation.foreignTable,
|
|
1503
1615
|
fields: relation.config?.fields,
|
|
1504
|
-
references: relation.config?.references
|
|
1616
|
+
references: relation.config?.references,
|
|
1617
|
+
optional: relation.config?.optional,
|
|
1618
|
+
alias: relation.config?.alias
|
|
1505
1619
|
};
|
|
1506
1620
|
} else if (relation instanceof ManyRelation) {
|
|
1507
1621
|
table.relations[name] = {
|
|
@@ -1519,84 +1633,6 @@ var alias = (table, alias2) => {
|
|
|
1519
1633
|
return table;
|
|
1520
1634
|
};
|
|
1521
1635
|
|
|
1522
|
-
// src/operators.ts
|
|
1523
|
-
import { isExpression, sql as sql3 } from "kysely";
|
|
1524
|
-
var eq = (column, value, tableAlias) => {
|
|
1525
|
-
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
1526
|
-
const serialized = serializeValue(value, column);
|
|
1527
|
-
return sql3`${sql3.ref(colRef)} = ${sql3.val(serialized)}`;
|
|
1528
|
-
};
|
|
1529
|
-
var ne = (column, value, tableAlias) => {
|
|
1530
|
-
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
1531
|
-
const serialized = serializeValue(value, column);
|
|
1532
|
-
return sql3`${sql3.ref(colRef)} != ${sql3.val(serialized)}`;
|
|
1533
|
-
};
|
|
1534
|
-
var and = (...conditions) => {
|
|
1535
|
-
if (conditions.length === 0) return sql3`1 = 1`;
|
|
1536
|
-
if (conditions.length === 1) return conditions[0];
|
|
1537
|
-
return sql3`(${sql3.join(conditions.map((c) => sql3`(${c})`), sql3` AND `)})`;
|
|
1538
|
-
};
|
|
1539
|
-
var or = (...conditions) => {
|
|
1540
|
-
if (conditions.length === 0) return sql3`1 = 1`;
|
|
1541
|
-
if (conditions.length === 1) return conditions[0];
|
|
1542
|
-
return sql3`(${sql3.join(conditions.map((c) => sql3`(${c})`), sql3` OR `)})`;
|
|
1543
|
-
};
|
|
1544
|
-
var not = (condition) => sql3`NOT (${condition})`;
|
|
1545
|
-
var gt = (column, value) => {
|
|
1546
|
-
const serialized = serializeValue(value, column);
|
|
1547
|
-
return sql3`${sql3.ref(column._.name)} > ${sql3.val(serialized)}`;
|
|
1548
|
-
};
|
|
1549
|
-
var gte = (column, value) => {
|
|
1550
|
-
const serialized = serializeValue(value, column);
|
|
1551
|
-
return sql3`${sql3.ref(column._.name)} >= ${sql3.val(serialized)}`;
|
|
1552
|
-
};
|
|
1553
|
-
var lt = (column, value) => {
|
|
1554
|
-
const serialized = serializeValue(value, column);
|
|
1555
|
-
return sql3`${sql3.ref(column._.name)} < ${sql3.val(serialized)}`;
|
|
1556
|
-
};
|
|
1557
|
-
var lte = (column, value) => {
|
|
1558
|
-
const serialized = serializeValue(value, column);
|
|
1559
|
-
return sql3`${sql3.ref(column._.name)} <= ${sql3.val(serialized)}`;
|
|
1560
|
-
};
|
|
1561
|
-
var like = (column, pattern) => sql3`${sql3.ref(column._.name)} LIKE ${sql3.val(pattern)}`;
|
|
1562
|
-
var ilike = (column, pattern) => sql3`${sql3.ref(column._.name)} LIKE ${sql3.val(pattern)} COLLATE NOCASE`;
|
|
1563
|
-
var startsWith = (column, value) => sql3`${sql3.ref(column._.name)} LIKE ${sql3.val(`${value}%`)}`;
|
|
1564
|
-
var endsWith = (column, value) => sql3`${sql3.ref(column._.name)} LIKE ${sql3.val(`%${value}`)}`;
|
|
1565
|
-
var contains = (column, value) => sql3`${sql3.ref(column._.name)} LIKE ${sql3.val(`%${value}%`)}`;
|
|
1566
|
-
var isNull = (column) => sql3`${sql3.ref(column._.name)} IS NULL`;
|
|
1567
|
-
var isNotNull = (column) => sql3`${sql3.ref(column._.name)} IS NOT NULL`;
|
|
1568
|
-
var exists = (subquery2) => sql3`EXISTS ${subquery2}`;
|
|
1569
|
-
var notExists = (subquery2) => sql3`NOT EXISTS ${subquery2}`;
|
|
1570
|
-
var eqSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} = (${subquery2})`;
|
|
1571
|
-
var neSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} != (${subquery2})`;
|
|
1572
|
-
var gtSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} > (${subquery2})`;
|
|
1573
|
-
var gteSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} >= (${subquery2})`;
|
|
1574
|
-
var ltSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} < (${subquery2})`;
|
|
1575
|
-
var lteSubquery = (column, subquery2) => sql3`${sql3.ref(column._.name)} <= (${subquery2})`;
|
|
1576
|
-
var inArray = (column, values) => {
|
|
1577
|
-
if (isExpression(values)) {
|
|
1578
|
-
return sql3`${sql3.ref(column._.name)} IN (${values})`;
|
|
1579
|
-
}
|
|
1580
|
-
const arr = values;
|
|
1581
|
-
if (arr.length === 0) return sql3`1 = 0`;
|
|
1582
|
-
const serialized = arr.map((v) => sql3.val(serializeValue(v, column)));
|
|
1583
|
-
return sql3`${sql3.ref(column._.name)} IN (${sql3.join(serialized)})`;
|
|
1584
|
-
};
|
|
1585
|
-
var notIn = (column, values) => {
|
|
1586
|
-
if (isExpression(values)) {
|
|
1587
|
-
return sql3`${sql3.ref(column._.name)} NOT IN (${values})`;
|
|
1588
|
-
}
|
|
1589
|
-
const arr = values;
|
|
1590
|
-
if (arr.length === 0) return sql3`1 = 1`;
|
|
1591
|
-
const serialized = arr.map((v) => sql3.val(serializeValue(v, column)));
|
|
1592
|
-
return sql3`${sql3.ref(column._.name)} NOT IN (${sql3.join(serialized)})`;
|
|
1593
|
-
};
|
|
1594
|
-
var between = (column, min2, max2) => {
|
|
1595
|
-
const serializedMin = serializeValue(min2, column);
|
|
1596
|
-
const serializedMax = serializeValue(max2, column);
|
|
1597
|
-
return sql3`${sql3.ref(column._.name)} BETWEEN ${sql3.val(serializedMin)} AND ${sql3.val(serializedMax)}`;
|
|
1598
|
-
};
|
|
1599
|
-
|
|
1600
1636
|
// src/aggregates.ts
|
|
1601
1637
|
import { sql as sql4 } from "kysely";
|
|
1602
1638
|
var count = (column) => sql4`COUNT(${column ? sql4.ref(column._.name) : sql4.raw("*")})`;
|
|
@@ -1633,6 +1669,126 @@ function numeric(name, config) {
|
|
|
1633
1669
|
}
|
|
1634
1670
|
var enumType = (name, values) => text(name, { enum: values });
|
|
1635
1671
|
|
|
1672
|
+
// src/relations-v2.ts
|
|
1673
|
+
function extractTables(schema) {
|
|
1674
|
+
const tables = {};
|
|
1675
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
1676
|
+
const v = value;
|
|
1677
|
+
if (v && typeof v === "object" && v._?.name && v._?.columns && typeof v.relations === "object") {
|
|
1678
|
+
tables[key] = v;
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
return tables;
|
|
1682
|
+
}
|
|
1683
|
+
function through(column, junctionColumn, junctionTable) {
|
|
1684
|
+
return { column, junctionColumn, junctionTable };
|
|
1685
|
+
}
|
|
1686
|
+
function toArray(col) {
|
|
1687
|
+
return Array.isArray(col) ? col : [col];
|
|
1688
|
+
}
|
|
1689
|
+
function isThroughRef(v) {
|
|
1690
|
+
return v && typeof v === "object" && "column" in v && "junctionColumn" in v && "junctionTable" in v;
|
|
1691
|
+
}
|
|
1692
|
+
function buildTableRef(table) {
|
|
1693
|
+
return { ...table._.columns };
|
|
1694
|
+
}
|
|
1695
|
+
function buildR(tables) {
|
|
1696
|
+
const tableRefs = {};
|
|
1697
|
+
const oneFns = {};
|
|
1698
|
+
const manyFns = {};
|
|
1699
|
+
for (const [tableKey, table] of Object.entries(tables)) {
|
|
1700
|
+
tableRefs[tableKey] = buildTableRef(table);
|
|
1701
|
+
const foreignTable = table;
|
|
1702
|
+
oneFns[tableKey] = (opts) => {
|
|
1703
|
+
return new OneRelation(foreignTable, {
|
|
1704
|
+
fields: toArray(opts.from),
|
|
1705
|
+
references: toArray(opts.to),
|
|
1706
|
+
optional: opts.optional,
|
|
1707
|
+
alias: opts.alias
|
|
1708
|
+
});
|
|
1709
|
+
};
|
|
1710
|
+
manyFns[tableKey] = (opts) => {
|
|
1711
|
+
if (!opts?.from || !opts?.to) return new ManyRelation(foreignTable);
|
|
1712
|
+
if (isThroughRef(opts.from) && isThroughRef(opts.to)) {
|
|
1713
|
+
return new ManyRelation(foreignTable, {
|
|
1714
|
+
through: {
|
|
1715
|
+
junctionTable: opts.from.junctionTable,
|
|
1716
|
+
fromRef: { column: opts.from.column, junctionColumn: opts.from.junctionColumn },
|
|
1717
|
+
toRef: { column: opts.to.column, junctionColumn: opts.to.junctionColumn }
|
|
1718
|
+
},
|
|
1719
|
+
optional: opts.optional,
|
|
1720
|
+
alias: opts.alias,
|
|
1721
|
+
where: opts.where
|
|
1722
|
+
});
|
|
1723
|
+
}
|
|
1724
|
+
return new ManyRelation(foreignTable, {
|
|
1725
|
+
from: toArray(opts.from),
|
|
1726
|
+
to: toArray(opts.to),
|
|
1727
|
+
optional: opts.optional,
|
|
1728
|
+
alias: opts.alias,
|
|
1729
|
+
where: opts.where
|
|
1730
|
+
});
|
|
1731
|
+
};
|
|
1732
|
+
}
|
|
1733
|
+
return {
|
|
1734
|
+
...tableRefs,
|
|
1735
|
+
one: oneFns,
|
|
1736
|
+
many: manyFns
|
|
1737
|
+
};
|
|
1738
|
+
}
|
|
1739
|
+
function applyRelationsToTables(tables, relationsResult) {
|
|
1740
|
+
for (const [tableKey, rels] of Object.entries(relationsResult)) {
|
|
1741
|
+
const table = tables[tableKey];
|
|
1742
|
+
if (!table) continue;
|
|
1743
|
+
for (const [relName, relation] of Object.entries(rels)) {
|
|
1744
|
+
if (relation instanceof OneRelation) {
|
|
1745
|
+
table.relations[relName] = {
|
|
1746
|
+
type: "one",
|
|
1747
|
+
foreignTable: relation.foreignTable,
|
|
1748
|
+
fields: relation.config?.fields,
|
|
1749
|
+
references: relation.config?.references,
|
|
1750
|
+
optional: relation.config?.optional,
|
|
1751
|
+
alias: relation.config?.alias
|
|
1752
|
+
};
|
|
1753
|
+
} else if (relation instanceof ManyRelation) {
|
|
1754
|
+
const config = relation.config;
|
|
1755
|
+
if (config?.through) {
|
|
1756
|
+
table.relations[relName] = {
|
|
1757
|
+
type: "many",
|
|
1758
|
+
foreignTable: relation.foreignTable,
|
|
1759
|
+
junctionTable: config.through.junctionTable,
|
|
1760
|
+
fromJunction: config.through.fromRef,
|
|
1761
|
+
toJunction: config.through.toRef,
|
|
1762
|
+
optional: config.optional,
|
|
1763
|
+
alias: config.alias,
|
|
1764
|
+
where: config.where
|
|
1765
|
+
};
|
|
1766
|
+
} else {
|
|
1767
|
+
table.relations[relName] = {
|
|
1768
|
+
type: "many",
|
|
1769
|
+
foreignTable: relation.foreignTable,
|
|
1770
|
+
fields: config ? config.to : void 0,
|
|
1771
|
+
references: config ? config.from : void 0,
|
|
1772
|
+
optional: config?.optional,
|
|
1773
|
+
alias: config?.alias,
|
|
1774
|
+
where: config?.where
|
|
1775
|
+
};
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1780
|
+
}
|
|
1781
|
+
function defineRelations(schema, callback) {
|
|
1782
|
+
const tables = extractTables(schema);
|
|
1783
|
+
const r = buildR(tables);
|
|
1784
|
+
const result = callback(r);
|
|
1785
|
+
applyRelationsToTables(tables, result);
|
|
1786
|
+
return result;
|
|
1787
|
+
}
|
|
1788
|
+
function defineRelationsPart(schema, callback) {
|
|
1789
|
+
return defineRelations(schema, callback);
|
|
1790
|
+
}
|
|
1791
|
+
|
|
1636
1792
|
// src/index.ts
|
|
1637
1793
|
import { sql as sql5 } from "kysely";
|
|
1638
1794
|
export {
|
|
@@ -1669,6 +1825,8 @@ export {
|
|
|
1669
1825
|
contains,
|
|
1670
1826
|
count,
|
|
1671
1827
|
countDistinct,
|
|
1828
|
+
defineRelations,
|
|
1829
|
+
defineRelationsPart,
|
|
1672
1830
|
desc,
|
|
1673
1831
|
endsWith,
|
|
1674
1832
|
enumType,
|
|
@@ -1708,5 +1866,6 @@ export {
|
|
|
1708
1866
|
startsWith,
|
|
1709
1867
|
subquery,
|
|
1710
1868
|
sum,
|
|
1711
|
-
text
|
|
1869
|
+
text,
|
|
1870
|
+
through
|
|
1712
1871
|
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Expression, SqlBool } from 'kysely';
|
|
2
|
+
import { AnySQLiteColumn } from './types';
|
|
3
|
+
export type Condition = Expression<SqlBool>;
|
|
4
|
+
export declare const eq: <T>(column: AnySQLiteColumn, value: T, tableAlias?: string) => Condition;
|
|
5
|
+
export declare const ne: <T>(column: AnySQLiteColumn, value: T, tableAlias?: string) => Condition;
|
|
6
|
+
export declare const and: (...conditions: Condition[]) => Condition;
|
|
7
|
+
export declare const or: (...conditions: Condition[]) => Condition;
|
|
8
|
+
export declare const not: (condition: Condition) => Condition;
|
|
9
|
+
export declare const gt: <T>(column: AnySQLiteColumn, value: T) => Condition;
|
|
10
|
+
export declare const gte: <T>(column: AnySQLiteColumn, value: T) => Condition;
|
|
11
|
+
export declare const lt: <T>(column: AnySQLiteColumn, value: T) => Condition;
|
|
12
|
+
export declare const lte: <T>(column: AnySQLiteColumn, value: T) => Condition;
|
|
13
|
+
export declare const like: (column: AnySQLiteColumn, pattern: string) => Condition;
|
|
14
|
+
export declare const ilike: (column: AnySQLiteColumn, pattern: string) => Condition;
|
|
15
|
+
export declare const startsWith: (column: AnySQLiteColumn, value: string) => Condition;
|
|
16
|
+
export declare const endsWith: (column: AnySQLiteColumn, value: string) => Condition;
|
|
17
|
+
export declare const contains: (column: AnySQLiteColumn, value: string) => Condition;
|
|
18
|
+
export declare const isNull: (column: AnySQLiteColumn) => Condition;
|
|
19
|
+
export declare const isNotNull: (column: AnySQLiteColumn) => Condition;
|
|
20
|
+
export declare const exists: (subquery: Expression<any>) => Condition;
|
|
21
|
+
export declare const notExists: (subquery: Expression<any>) => Condition;
|
|
22
|
+
export declare const eqSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
23
|
+
export declare const neSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
24
|
+
export declare const gtSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
25
|
+
export declare const gteSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
26
|
+
export declare const ltSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
27
|
+
export declare const lteSubquery: (column: AnySQLiteColumn, subquery: Expression<any>) => Condition;
|
|
28
|
+
export declare const inArray: <T>(column: AnySQLiteColumn, values: T[] | Expression<any>) => Condition;
|
|
29
|
+
export declare const notIn: <T>(column: AnySQLiteColumn, values: T[] | Expression<any>) => Condition;
|
|
30
|
+
export declare const between: <T>(column: AnySQLiteColumn, min: T, max: T) => Condition;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { isExpression, sql } from 'kysely';
|
|
2
|
+
import { serializeValue } from './serialization';
|
|
3
|
+
export const eq = (column, value, tableAlias) => {
|
|
4
|
+
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
5
|
+
const serialized = serializeValue(value, column);
|
|
6
|
+
return sql `${sql.ref(colRef)} = ${sql.val(serialized)}`;
|
|
7
|
+
};
|
|
8
|
+
export const ne = (column, value, tableAlias) => {
|
|
9
|
+
const colRef = tableAlias ? `${tableAlias}.${column._.name}` : column._.name;
|
|
10
|
+
const serialized = serializeValue(value, column);
|
|
11
|
+
return sql `${sql.ref(colRef)} != ${sql.val(serialized)}`;
|
|
12
|
+
};
|
|
13
|
+
export const and = (...conditions) => {
|
|
14
|
+
if (conditions.length === 0)
|
|
15
|
+
return sql `1 = 1`;
|
|
16
|
+
if (conditions.length === 1)
|
|
17
|
+
return conditions[0];
|
|
18
|
+
return sql `(${sql.join(conditions.map(c => sql `(${c})`), sql ` AND `)})`;
|
|
19
|
+
};
|
|
20
|
+
export const or = (...conditions) => {
|
|
21
|
+
if (conditions.length === 0)
|
|
22
|
+
return sql `1 = 1`;
|
|
23
|
+
if (conditions.length === 1)
|
|
24
|
+
return conditions[0];
|
|
25
|
+
return sql `(${sql.join(conditions.map(c => sql `(${c})`), sql ` OR `)})`;
|
|
26
|
+
};
|
|
27
|
+
export const not = (condition) => sql `NOT (${condition})`;
|
|
28
|
+
export const gt = (column, value) => {
|
|
29
|
+
const serialized = serializeValue(value, column);
|
|
30
|
+
return sql `${sql.ref(column._.name)} > ${sql.val(serialized)}`;
|
|
31
|
+
};
|
|
32
|
+
export const gte = (column, value) => {
|
|
33
|
+
const serialized = serializeValue(value, column);
|
|
34
|
+
return sql `${sql.ref(column._.name)} >= ${sql.val(serialized)}`;
|
|
35
|
+
};
|
|
36
|
+
export const lt = (column, value) => {
|
|
37
|
+
const serialized = serializeValue(value, column);
|
|
38
|
+
return sql `${sql.ref(column._.name)} < ${sql.val(serialized)}`;
|
|
39
|
+
};
|
|
40
|
+
export const lte = (column, value) => {
|
|
41
|
+
const serialized = serializeValue(value, column);
|
|
42
|
+
return sql `${sql.ref(column._.name)} <= ${sql.val(serialized)}`;
|
|
43
|
+
};
|
|
44
|
+
export const like = (column, pattern) => sql `${sql.ref(column._.name)} LIKE ${sql.val(pattern)}`;
|
|
45
|
+
export const ilike = (column, pattern) => sql `${sql.ref(column._.name)} LIKE ${sql.val(pattern)} COLLATE NOCASE`;
|
|
46
|
+
export const startsWith = (column, value) => sql `${sql.ref(column._.name)} LIKE ${sql.val(`${value}%`)}`;
|
|
47
|
+
export const endsWith = (column, value) => sql `${sql.ref(column._.name)} LIKE ${sql.val(`%${value}`)}`;
|
|
48
|
+
export const contains = (column, value) => sql `${sql.ref(column._.name)} LIKE ${sql.val(`%${value}%`)}`;
|
|
49
|
+
export const isNull = (column) => sql `${sql.ref(column._.name)} IS NULL`;
|
|
50
|
+
export const isNotNull = (column) => sql `${sql.ref(column._.name)} IS NOT NULL`;
|
|
51
|
+
// SQLite rejects EXISTS ((subquery)); use single paren level
|
|
52
|
+
export const exists = (subquery) => sql `EXISTS ${subquery}`;
|
|
53
|
+
export const notExists = (subquery) => sql `NOT EXISTS ${subquery}`;
|
|
54
|
+
export const eqSubquery = (column, subquery) => sql `${sql.ref(column._.name)} = (${subquery})`;
|
|
55
|
+
export const neSubquery = (column, subquery) => sql `${sql.ref(column._.name)} != (${subquery})`;
|
|
56
|
+
export const gtSubquery = (column, subquery) => sql `${sql.ref(column._.name)} > (${subquery})`;
|
|
57
|
+
export const gteSubquery = (column, subquery) => sql `${sql.ref(column._.name)} >= (${subquery})`;
|
|
58
|
+
export const ltSubquery = (column, subquery) => sql `${sql.ref(column._.name)} < (${subquery})`;
|
|
59
|
+
export const lteSubquery = (column, subquery) => sql `${sql.ref(column._.name)} <= (${subquery})`;
|
|
60
|
+
export const inArray = (column, values) => {
|
|
61
|
+
if (isExpression(values)) {
|
|
62
|
+
return sql `${sql.ref(column._.name)} IN (${values})`;
|
|
63
|
+
}
|
|
64
|
+
const arr = values;
|
|
65
|
+
if (arr.length === 0)
|
|
66
|
+
return sql `1 = 0`;
|
|
67
|
+
const serialized = arr.map(v => sql.val(serializeValue(v, column)));
|
|
68
|
+
return sql `${sql.ref(column._.name)} IN (${sql.join(serialized)})`;
|
|
69
|
+
};
|
|
70
|
+
export const notIn = (column, values) => {
|
|
71
|
+
if (isExpression(values)) {
|
|
72
|
+
return sql `${sql.ref(column._.name)} NOT IN (${values})`;
|
|
73
|
+
}
|
|
74
|
+
const arr = values;
|
|
75
|
+
if (arr.length === 0)
|
|
76
|
+
return sql `1 = 1`;
|
|
77
|
+
const serialized = arr.map(v => sql.val(serializeValue(v, column)));
|
|
78
|
+
return sql `${sql.ref(column._.name)} NOT IN (${sql.join(serialized)})`;
|
|
79
|
+
};
|
|
80
|
+
export const between = (column, min, max) => {
|
|
81
|
+
const serializedMin = serializeValue(min, column);
|
|
82
|
+
const serializedMax = serializeValue(max, column);
|
|
83
|
+
return sql `${sql.ref(column._.name)} BETWEEN ${sql.val(serializedMin)} AND ${sql.val(serializedMax)}`;
|
|
84
|
+
};
|