@zenstackhq/runtime 3.0.0-alpha.28 → 3.0.0-alpha.29
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/{contract-cndmlzV3.d.cts → contract-B8DJmviN.d.cts} +4 -4
- package/dist/{contract-cndmlzV3.d.ts → contract-B8DJmviN.d.ts} +4 -4
- package/dist/index.cjs +88 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +88 -54
- package/dist/index.js.map +1 -1
- package/dist/plugins/policy/index.cjs +75 -46
- package/dist/plugins/policy/index.cjs.map +1 -1
- package/dist/plugins/policy/index.d.cts +1 -1
- package/dist/plugins/policy/index.d.ts +1 -1
- package/dist/plugins/policy/index.js +75 -46
- package/dist/plugins/policy/index.js.map +1 -1
- package/package.json +8 -8
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClientConstructor } from './contract-
|
|
2
|
-
export { K as AggregateArgs, L as AggregateResult, B as BatchResult, i as BooleanFilter, h as BytesFilter, c as ClientContract, d as ClientOptions, G as CountArgs, H as CountResult, u as CreateArgs, w as CreateManyAndReturnArgs, v as CreateManyArgs, D as DateTimeFilter, A as DeleteArgs, E as DeleteManyArgs, F as FindArgs, s as FindFirstArgs, r as FindManyArgs, t as FindUniqueArgs, P as GroupByArgs, Q as GroupByResult, I as IncludeInput, J as JsonArray, a as JsonObject, b as JsonValue, M as ModelResult, k as NullsOrder, N as NumberFilter, m as OmitInput, O as OrderBy, n as SelectIncludeOmit, o as SelectInput, q as SelectSubset, S as SimplifiedModelResult, j as SortOrder, g as StringFilter, p as Subset, T as ToKysely, f as TypeDefResult, U as UpdateArgs, y as UpdateManyAndReturnArgs, x as UpdateManyArgs, z as UpsertArgs, W as WhereInput, l as WhereUniqueInput, e as definePlugin } from './contract-
|
|
1
|
+
import { C as ClientConstructor } from './contract-B8DJmviN.cjs';
|
|
2
|
+
export { K as AggregateArgs, L as AggregateResult, B as BatchResult, i as BooleanFilter, h as BytesFilter, c as ClientContract, d as ClientOptions, G as CountArgs, H as CountResult, u as CreateArgs, w as CreateManyAndReturnArgs, v as CreateManyArgs, D as DateTimeFilter, A as DeleteArgs, E as DeleteManyArgs, F as FindArgs, s as FindFirstArgs, r as FindManyArgs, t as FindUniqueArgs, P as GroupByArgs, Q as GroupByResult, I as IncludeInput, J as JsonArray, a as JsonObject, b as JsonValue, M as ModelResult, k as NullsOrder, N as NumberFilter, m as OmitInput, O as OrderBy, n as SelectIncludeOmit, o as SelectInput, q as SelectSubset, S as SimplifiedModelResult, j as SortOrder, g as StringFilter, p as Subset, T as ToKysely, f as TypeDefResult, U as UpdateArgs, y as UpdateManyAndReturnArgs, x as UpdateManyArgs, z as UpsertArgs, W as WhereInput, l as WhereUniqueInput, e as definePlugin } from './contract-B8DJmviN.cjs';
|
|
3
3
|
import 'decimal.js';
|
|
4
4
|
import '@zenstackhq/sdk/schema';
|
|
5
5
|
import 'kysely';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClientConstructor } from './contract-
|
|
2
|
-
export { K as AggregateArgs, L as AggregateResult, B as BatchResult, i as BooleanFilter, h as BytesFilter, c as ClientContract, d as ClientOptions, G as CountArgs, H as CountResult, u as CreateArgs, w as CreateManyAndReturnArgs, v as CreateManyArgs, D as DateTimeFilter, A as DeleteArgs, E as DeleteManyArgs, F as FindArgs, s as FindFirstArgs, r as FindManyArgs, t as FindUniqueArgs, P as GroupByArgs, Q as GroupByResult, I as IncludeInput, J as JsonArray, a as JsonObject, b as JsonValue, M as ModelResult, k as NullsOrder, N as NumberFilter, m as OmitInput, O as OrderBy, n as SelectIncludeOmit, o as SelectInput, q as SelectSubset, S as SimplifiedModelResult, j as SortOrder, g as StringFilter, p as Subset, T as ToKysely, f as TypeDefResult, U as UpdateArgs, y as UpdateManyAndReturnArgs, x as UpdateManyArgs, z as UpsertArgs, W as WhereInput, l as WhereUniqueInput, e as definePlugin } from './contract-
|
|
1
|
+
import { C as ClientConstructor } from './contract-B8DJmviN.js';
|
|
2
|
+
export { K as AggregateArgs, L as AggregateResult, B as BatchResult, i as BooleanFilter, h as BytesFilter, c as ClientContract, d as ClientOptions, G as CountArgs, H as CountResult, u as CreateArgs, w as CreateManyAndReturnArgs, v as CreateManyArgs, D as DateTimeFilter, A as DeleteArgs, E as DeleteManyArgs, F as FindArgs, s as FindFirstArgs, r as FindManyArgs, t as FindUniqueArgs, P as GroupByArgs, Q as GroupByResult, I as IncludeInput, J as JsonArray, a as JsonObject, b as JsonValue, M as ModelResult, k as NullsOrder, N as NumberFilter, m as OmitInput, O as OrderBy, n as SelectIncludeOmit, o as SelectInput, q as SelectSubset, S as SimplifiedModelResult, j as SortOrder, g as StringFilter, p as Subset, T as ToKysely, f as TypeDefResult, U as UpdateArgs, y as UpdateManyAndReturnArgs, x as UpdateManyArgs, z as UpsertArgs, W as WhereInput, l as WhereUniqueInput, e as definePlugin } from './contract-B8DJmviN.js';
|
|
3
3
|
import 'decimal.js';
|
|
4
4
|
import '@zenstackhq/sdk/schema';
|
|
5
5
|
import 'kysely';
|
package/dist/index.js
CHANGED
|
@@ -286,7 +286,9 @@ function buildFieldRef(schema, model, field, options, eb, modelAlias, inlineComp
|
|
|
286
286
|
if (!computer) {
|
|
287
287
|
throw new QueryError(`Computed field "${field}" implementation not provided for model "${model}"`);
|
|
288
288
|
}
|
|
289
|
-
return computer(eb
|
|
289
|
+
return computer(eb, {
|
|
290
|
+
currentModel: modelAlias
|
|
291
|
+
});
|
|
290
292
|
}
|
|
291
293
|
}
|
|
292
294
|
__name(buildFieldRef, "buildFieldRef");
|
|
@@ -337,11 +339,33 @@ function getManyToManyRelation(schema, model, field) {
|
|
|
337
339
|
model,
|
|
338
340
|
fieldDef.type
|
|
339
341
|
].sort();
|
|
342
|
+
let orderedFK;
|
|
343
|
+
if (model !== fieldDef.type) {
|
|
344
|
+
orderedFK = sortedModelNames[0] === model ? [
|
|
345
|
+
"A",
|
|
346
|
+
"B"
|
|
347
|
+
] : [
|
|
348
|
+
"B",
|
|
349
|
+
"A"
|
|
350
|
+
];
|
|
351
|
+
} else {
|
|
352
|
+
const sortedFieldNames = [
|
|
353
|
+
field,
|
|
354
|
+
oppositeFieldDef.name
|
|
355
|
+
].sort();
|
|
356
|
+
orderedFK = sortedFieldNames[0] === field ? [
|
|
357
|
+
"A",
|
|
358
|
+
"B"
|
|
359
|
+
] : [
|
|
360
|
+
"B",
|
|
361
|
+
"A"
|
|
362
|
+
];
|
|
363
|
+
}
|
|
340
364
|
return {
|
|
341
|
-
parentFkName:
|
|
365
|
+
parentFkName: orderedFK[0],
|
|
342
366
|
otherModel: fieldDef.type,
|
|
343
367
|
otherField: fieldDef.relation.opposite,
|
|
344
|
-
otherFkName:
|
|
368
|
+
otherFkName: orderedFK[1],
|
|
345
369
|
joinTable: fieldDef.relation.name ? `_${fieldDef.relation.name}` : `_${sortedModelNames[0]}To${sortedModelNames[1]}`
|
|
346
370
|
};
|
|
347
371
|
} else {
|
|
@@ -504,20 +528,20 @@ var BaseCrudDialect = class {
|
|
|
504
528
|
return value;
|
|
505
529
|
}
|
|
506
530
|
// #region common query builders
|
|
507
|
-
buildSelectModel(eb, model) {
|
|
531
|
+
buildSelectModel(eb, model, modelAlias) {
|
|
508
532
|
const modelDef = requireModel(this.schema, model);
|
|
509
|
-
let result = eb.selectFrom(model);
|
|
533
|
+
let result = eb.selectFrom(model === modelAlias ? model : `${model} as ${modelAlias}`);
|
|
510
534
|
let joinBase = modelDef.baseModel;
|
|
511
535
|
while (joinBase) {
|
|
512
|
-
result = this.buildDelegateJoin(model, joinBase, result);
|
|
536
|
+
result = this.buildDelegateJoin(model, modelAlias, joinBase, result);
|
|
513
537
|
joinBase = requireModel(this.schema, joinBase).baseModel;
|
|
514
538
|
}
|
|
515
539
|
return result;
|
|
516
540
|
}
|
|
517
|
-
buildFilterSortTake(model, args, query) {
|
|
541
|
+
buildFilterSortTake(model, args, query, modelAlias) {
|
|
518
542
|
let result = query;
|
|
519
543
|
if (args.where) {
|
|
520
|
-
result = result.where((eb) => this.buildFilter(eb, model,
|
|
544
|
+
result = result.where((eb) => this.buildFilter(eb, model, modelAlias, args?.where));
|
|
521
545
|
}
|
|
522
546
|
let negateOrderBy = false;
|
|
523
547
|
const skip = args.skip;
|
|
@@ -527,17 +551,17 @@ var BaseCrudDialect = class {
|
|
|
527
551
|
take = -take;
|
|
528
552
|
}
|
|
529
553
|
result = this.buildSkipTake(result, skip, take);
|
|
530
|
-
result = this.buildOrderBy(result, model,
|
|
554
|
+
result = this.buildOrderBy(result, model, modelAlias, args.orderBy, skip !== void 0 || take !== void 0, negateOrderBy);
|
|
531
555
|
if ("distinct" in args && args.distinct) {
|
|
532
556
|
const distinct = ensureArray(args.distinct);
|
|
533
557
|
if (this.supportsDistinctOn) {
|
|
534
|
-
result = result.distinctOn(distinct.map((f) => sql.ref(`${
|
|
558
|
+
result = result.distinctOn(distinct.map((f) => sql.ref(`${modelAlias}.${f}`)));
|
|
535
559
|
} else {
|
|
536
560
|
throw new QueryError(`"distinct" is not supported by "${this.schema.provider.type}" provider`);
|
|
537
561
|
}
|
|
538
562
|
}
|
|
539
563
|
if (args.cursor) {
|
|
540
|
-
result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy);
|
|
564
|
+
result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy, modelAlias);
|
|
541
565
|
}
|
|
542
566
|
return result;
|
|
543
567
|
}
|
|
@@ -578,11 +602,12 @@ var BaseCrudDialect = class {
|
|
|
578
602
|
}
|
|
579
603
|
return result;
|
|
580
604
|
}
|
|
581
|
-
buildCursorFilter(model, query, cursor, orderBy, negateOrderBy) {
|
|
605
|
+
buildCursorFilter(model, query, cursor, orderBy, negateOrderBy, modelAlias) {
|
|
582
606
|
const _orderBy = orderBy ?? makeDefaultOrderBy(this.schema, model);
|
|
583
607
|
const orderByItems = ensureArray(_orderBy).flatMap((obj) => Object.entries(obj));
|
|
584
608
|
const eb = expressionBuilder();
|
|
585
|
-
const
|
|
609
|
+
const subQueryAlias = `${model}$cursor$sub`;
|
|
610
|
+
const cursorFilter = this.buildFilter(eb, model, subQueryAlias, cursor);
|
|
586
611
|
let result = query;
|
|
587
612
|
const filters = [];
|
|
588
613
|
for (let i = orderByItems.length - 1; i >= 0; i--) {
|
|
@@ -591,7 +616,7 @@ var BaseCrudDialect = class {
|
|
|
591
616
|
const [field, order] = orderByItems[j];
|
|
592
617
|
const _order = negateOrderBy ? order === "asc" ? "desc" : "asc" : order;
|
|
593
618
|
const op = j === i ? _order === "asc" ? ">=" : "<=" : "=";
|
|
594
|
-
andFilters.push(eb(eb.ref(`${
|
|
619
|
+
andFilters.push(eb(eb.ref(`${modelAlias}.${field}`), op, this.buildSelectModel(eb, model, subQueryAlias).select(`${subQueryAlias}.${field}`).where(cursorFilter)));
|
|
595
620
|
}
|
|
596
621
|
filters.push(eb.and(andFilters));
|
|
597
622
|
}
|
|
@@ -660,25 +685,26 @@ var BaseCrudDialect = class {
|
|
|
660
685
|
}
|
|
661
686
|
return this.and(eb, ...conditions);
|
|
662
687
|
}
|
|
663
|
-
buildToManyRelationFilter(eb, model,
|
|
688
|
+
buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload) {
|
|
664
689
|
if (payload === null) {
|
|
665
|
-
return eb(sql.ref(`${
|
|
690
|
+
return eb(sql.ref(`${modelAlias}.${field}`), "is", null);
|
|
666
691
|
}
|
|
667
692
|
const relationModel = fieldDef.type;
|
|
693
|
+
const relationFilterSelectAlias = `${modelAlias}$${field}$filter`;
|
|
668
694
|
const buildPkFkWhereRefs = /* @__PURE__ */ __name((eb2) => {
|
|
669
695
|
const m2m = getManyToManyRelation(this.schema, model, field);
|
|
670
696
|
if (m2m) {
|
|
671
697
|
const modelIdField = getIdFields(this.schema, model)[0];
|
|
672
698
|
const relationIdField = getIdFields(this.schema, relationModel)[0];
|
|
673
|
-
return eb2(sql.ref(`${
|
|
699
|
+
return eb2(sql.ref(`${relationFilterSelectAlias}.${relationIdField}`), "in", eb2.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`), "=", sql.ref(`${modelAlias}.${modelIdField}`)));
|
|
674
700
|
} else {
|
|
675
701
|
const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);
|
|
676
702
|
let result2 = this.true(eb2);
|
|
677
703
|
for (const { fk, pk } of relationKeyPairs.keyPairs) {
|
|
678
704
|
if (relationKeyPairs.ownedByModel) {
|
|
679
|
-
result2 = this.and(eb2, result2, eb2(sql.ref(`${
|
|
705
|
+
result2 = this.and(eb2, result2, eb2(sql.ref(`${modelAlias}.${fk}`), "=", sql.ref(`${relationFilterSelectAlias}.${pk}`)));
|
|
680
706
|
} else {
|
|
681
|
-
result2 = this.and(eb2, result2, eb2(sql.ref(`${
|
|
707
|
+
result2 = this.and(eb2, result2, eb2(sql.ref(`${modelAlias}.${pk}`), "=", sql.ref(`${relationFilterSelectAlias}.${fk}`)));
|
|
682
708
|
}
|
|
683
709
|
}
|
|
684
710
|
return result2;
|
|
@@ -691,15 +717,15 @@ var BaseCrudDialect = class {
|
|
|
691
717
|
}
|
|
692
718
|
switch (key) {
|
|
693
719
|
case "some": {
|
|
694
|
-
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel,
|
|
720
|
+
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel, relationFilterSelectAlias).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload)), ">", 0));
|
|
695
721
|
break;
|
|
696
722
|
}
|
|
697
723
|
case "every": {
|
|
698
|
-
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => eb1.not(this.buildFilter(eb1, relationModel,
|
|
724
|
+
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel, relationFilterSelectAlias).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => eb1.not(this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload))), "=", 0));
|
|
699
725
|
break;
|
|
700
726
|
}
|
|
701
727
|
case "none": {
|
|
702
|
-
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel,
|
|
728
|
+
result = this.and(eb, result, eb(this.buildSelectModel(eb, relationModel, relationFilterSelectAlias).select((eb1) => eb1.fn.count(eb1.lit(1)).as("$count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload)), "=", 0));
|
|
703
729
|
break;
|
|
704
730
|
}
|
|
705
731
|
}
|
|
@@ -942,8 +968,9 @@ var BaseCrudDialect = class {
|
|
|
942
968
|
invariant(value._count === "asc" || value._count === "desc", 'invalid orderBy value for field "_count"');
|
|
943
969
|
const sort = this.negateSort(value._count, negated);
|
|
944
970
|
result = result.orderBy((eb) => {
|
|
945
|
-
|
|
946
|
-
|
|
971
|
+
const subQueryAlias = `${modelAlias}$orderBy$${field}$count`;
|
|
972
|
+
let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);
|
|
973
|
+
const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);
|
|
947
974
|
subQuery = subQuery.where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), "=", sql.ref(right)))));
|
|
948
975
|
subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as("_count"));
|
|
949
976
|
return subQuery;
|
|
@@ -961,7 +988,7 @@ var BaseCrudDialect = class {
|
|
|
961
988
|
});
|
|
962
989
|
return result;
|
|
963
990
|
}
|
|
964
|
-
buildSelectAllFields(model, query, omit) {
|
|
991
|
+
buildSelectAllFields(model, query, omit, modelAlias) {
|
|
965
992
|
const modelDef = requireModel(this.schema, model);
|
|
966
993
|
let result = query;
|
|
967
994
|
for (const field of Object.keys(modelDef.fields)) {
|
|
@@ -971,11 +998,11 @@ var BaseCrudDialect = class {
|
|
|
971
998
|
if (omit?.[field] === true) {
|
|
972
999
|
continue;
|
|
973
1000
|
}
|
|
974
|
-
result = this.buildSelectField(result, model,
|
|
1001
|
+
result = this.buildSelectField(result, model, modelAlias, field);
|
|
975
1002
|
}
|
|
976
1003
|
const descendants = getDelegateDescendantModels(this.schema, model);
|
|
977
1004
|
for (const subModel of descendants) {
|
|
978
|
-
result = this.buildDelegateJoin(model, subModel.name, result);
|
|
1005
|
+
result = this.buildDelegateJoin(model, modelAlias, subModel.name, result);
|
|
979
1006
|
result = result.select((eb) => {
|
|
980
1007
|
const jsonObject = {};
|
|
981
1008
|
for (const field of Object.keys(subModel.fields)) {
|
|
@@ -999,11 +1026,11 @@ var BaseCrudDialect = class {
|
|
|
999
1026
|
return this.buildSelectField(query, fieldDef.originModel, fieldDef.originModel, field);
|
|
1000
1027
|
}
|
|
1001
1028
|
}
|
|
1002
|
-
buildDelegateJoin(thisModel,
|
|
1029
|
+
buildDelegateJoin(thisModel, thisModelAlias, otherModelAlias, query) {
|
|
1003
1030
|
const idFields = getIdFields(this.schema, thisModel);
|
|
1004
|
-
query = query.leftJoin(
|
|
1031
|
+
query = query.leftJoin(otherModelAlias, (qb) => {
|
|
1005
1032
|
for (const idField of idFields) {
|
|
1006
|
-
qb = qb.onRef(`${
|
|
1033
|
+
qb = qb.onRef(`${thisModelAlias}.${idField}`, "=", `${otherModelAlias}.${idField}`);
|
|
1007
1034
|
}
|
|
1008
1035
|
return qb;
|
|
1009
1036
|
});
|
|
@@ -1120,11 +1147,12 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
|
|
|
1120
1147
|
return qb.leftJoinLateral((eb) => {
|
|
1121
1148
|
const joinTableName = `${parentName}$${relationField}`;
|
|
1122
1149
|
let result = eb.selectFrom(`${relationModel} as ${joinTableName}`);
|
|
1150
|
+
const subQueryAlias = `${relationModel}$${relationField}$sub`;
|
|
1123
1151
|
result = eb.selectFrom(() => {
|
|
1124
|
-
let subQuery = this.buildSelectModel(eb, relationModel);
|
|
1125
|
-
subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
|
|
1152
|
+
let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);
|
|
1153
|
+
subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0, subQueryAlias);
|
|
1126
1154
|
if (payload && typeof payload === "object") {
|
|
1127
|
-
subQuery = this.buildFilterSortTake(relationModel, payload, subQuery);
|
|
1155
|
+
subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);
|
|
1128
1156
|
}
|
|
1129
1157
|
const m2m = getManyToManyRelation(this.schema, model, relationField);
|
|
1130
1158
|
if (m2m) {
|
|
@@ -1132,21 +1160,21 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
|
|
|
1132
1160
|
const relationIds = getIdFields(this.schema, relationModel);
|
|
1133
1161
|
invariant2(parentIds.length === 1, "many-to-many relation must have exactly one id field");
|
|
1134
1162
|
invariant2(relationIds.length === 1, "many-to-many relation must have exactly one id field");
|
|
1135
|
-
subQuery = subQuery.where(eb(eb.ref(`${
|
|
1163
|
+
subQuery = subQuery.where(eb(eb.ref(`${subQueryAlias}.${relationIds[0]}`), "in", eb.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(`${parentName}.${parentIds[0]}`, "=", `${m2m.joinTable}.${m2m.parentFkName}`)));
|
|
1136
1164
|
} else {
|
|
1137
|
-
const joinPairs = buildJoinPairs(this.schema, model, parentName, relationField,
|
|
1165
|
+
const joinPairs = buildJoinPairs(this.schema, model, parentName, relationField, subQueryAlias);
|
|
1138
1166
|
subQuery = subQuery.where((eb2) => this.and(eb2, ...joinPairs.map(([left, right]) => eb2(sql2.ref(left), "=", sql2.ref(right)))));
|
|
1139
1167
|
}
|
|
1140
1168
|
return subQuery.as(joinTableName);
|
|
1141
1169
|
});
|
|
1142
|
-
result = this.buildRelationObjectSelect(relationModel, relationField, relationFieldDef, result, payload, parentName);
|
|
1170
|
+
result = this.buildRelationObjectSelect(relationModel, joinTableName, relationField, relationFieldDef, result, payload, parentName);
|
|
1143
1171
|
result = this.buildRelationJoins(relationModel, relationField, result, payload, parentName);
|
|
1144
1172
|
return result.as(joinTableName);
|
|
1145
1173
|
}, (join) => join.onTrue());
|
|
1146
1174
|
}
|
|
1147
|
-
buildRelationObjectSelect(relationModel, relationField, relationFieldDef, qb, payload, parentName) {
|
|
1175
|
+
buildRelationObjectSelect(relationModel, relationModelAlias, relationField, relationFieldDef, qb, payload, parentName) {
|
|
1148
1176
|
qb = qb.select((eb) => {
|
|
1149
|
-
const objArgs = this.buildRelationObjectArgs(relationModel, relationField, eb, payload, parentName);
|
|
1177
|
+
const objArgs = this.buildRelationObjectArgs(relationModel, relationModelAlias, relationField, eb, payload, parentName);
|
|
1150
1178
|
if (relationFieldDef.array) {
|
|
1151
1179
|
return eb.fn.coalesce(sql2`jsonb_agg(jsonb_build_object(${sql2.join(objArgs)}))`, sql2`'[]'::jsonb`).as("$j");
|
|
1152
1180
|
} else {
|
|
@@ -1155,7 +1183,7 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
|
|
|
1155
1183
|
});
|
|
1156
1184
|
return qb;
|
|
1157
1185
|
}
|
|
1158
|
-
buildRelationObjectArgs(relationModel, relationField, eb, payload, parentAlias) {
|
|
1186
|
+
buildRelationObjectArgs(relationModel, relationModelAlias, relationField, eb, payload, parentAlias) {
|
|
1159
1187
|
const relationModelDef = requireModel(this.schema, relationModel);
|
|
1160
1188
|
const objArgs = [];
|
|
1161
1189
|
const descendantModels = getDelegateDescendantModels(this.schema, relationModel);
|
|
@@ -1168,7 +1196,7 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
|
|
|
1168
1196
|
if (payload === true || !payload.select) {
|
|
1169
1197
|
objArgs.push(...Object.entries(relationModelDef.fields).filter(([, value]) => !value.relation).filter(([name]) => !(typeof payload === "object" && payload.omit?.[name] === true)).map(([field]) => [
|
|
1170
1198
|
sql2.lit(field),
|
|
1171
|
-
this.fieldRef(relationModel, field, eb,
|
|
1199
|
+
this.fieldRef(relationModel, field, eb, relationModelAlias, false)
|
|
1172
1200
|
]).flatMap((v) => v));
|
|
1173
1201
|
} else if (payload.select) {
|
|
1174
1202
|
objArgs.push(...Object.entries(payload.select).filter(([, value]) => value).map(([field, value]) => {
|
|
@@ -1284,10 +1312,11 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
|
|
|
1284
1312
|
const relationModelDef = requireModel(this.schema, relationModel);
|
|
1285
1313
|
const subQueryName = `${parentAlias}$${relationField}`;
|
|
1286
1314
|
let tbl = eb.selectFrom(() => {
|
|
1287
|
-
|
|
1288
|
-
subQuery = this.
|
|
1315
|
+
const subQueryAlias = `${parentAlias}$${relationField}$sub`;
|
|
1316
|
+
let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);
|
|
1317
|
+
subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0, subQueryAlias);
|
|
1289
1318
|
if (payload && typeof payload === "object") {
|
|
1290
|
-
subQuery = this.buildFilterSortTake(relationModel, payload, subQuery);
|
|
1319
|
+
subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);
|
|
1291
1320
|
}
|
|
1292
1321
|
const m2m = getManyToManyRelation(this.schema, model, relationField);
|
|
1293
1322
|
if (m2m) {
|
|
@@ -1295,14 +1324,14 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
|
|
|
1295
1324
|
const relationIds = getIdFields(this.schema, relationModel);
|
|
1296
1325
|
invariant3(parentIds.length === 1, "many-to-many relation must have exactly one id field");
|
|
1297
1326
|
invariant3(relationIds.length === 1, "many-to-many relation must have exactly one id field");
|
|
1298
|
-
subQuery = subQuery.where(eb(eb.ref(`${
|
|
1327
|
+
subQuery = subQuery.where(eb(eb.ref(`${subQueryAlias}.${relationIds[0]}`), "in", eb.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(`${parentAlias}.${parentIds[0]}`, "=", `${m2m.joinTable}.${m2m.parentFkName}`)));
|
|
1299
1328
|
} else {
|
|
1300
1329
|
const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, model, relationField);
|
|
1301
1330
|
keyPairs.forEach(({ fk, pk }) => {
|
|
1302
1331
|
if (ownedByModel) {
|
|
1303
|
-
subQuery = subQuery.whereRef(`${
|
|
1332
|
+
subQuery = subQuery.whereRef(`${subQueryAlias}.${pk}`, "=", `${parentAlias}.${fk}`);
|
|
1304
1333
|
} else {
|
|
1305
|
-
subQuery = subQuery.whereRef(`${
|
|
1334
|
+
subQuery = subQuery.whereRef(`${subQueryAlias}.${fk}`, "=", `${parentAlias}.${pk}`);
|
|
1306
1335
|
}
|
|
1307
1336
|
});
|
|
1308
1337
|
}
|
|
@@ -2728,14 +2757,14 @@ var BaseOperationHandler = class {
|
|
|
2728
2757
|
return this.executeQueryTakeFirst(kysely, query, "exists");
|
|
2729
2758
|
}
|
|
2730
2759
|
async read(kysely, model, args) {
|
|
2731
|
-
let query = this.dialect.buildSelectModel(expressionBuilder3(), model);
|
|
2760
|
+
let query = this.dialect.buildSelectModel(expressionBuilder3(), model, model);
|
|
2732
2761
|
if (args) {
|
|
2733
|
-
query = this.dialect.buildFilterSortTake(model, args, query);
|
|
2762
|
+
query = this.dialect.buildFilterSortTake(model, args, query, model);
|
|
2734
2763
|
}
|
|
2735
2764
|
if (args && "select" in args && args.select) {
|
|
2736
2765
|
query = this.buildFieldSelection(model, query, args.select, model);
|
|
2737
2766
|
} else {
|
|
2738
|
-
query = this.dialect.buildSelectAllFields(model, query, args?.omit);
|
|
2767
|
+
query = this.dialect.buildSelectAllFields(model, query, args?.omit, model);
|
|
2739
2768
|
}
|
|
2740
2769
|
if (args && "include" in args && args.include) {
|
|
2741
2770
|
query = this.buildFieldSelection(model, query, args.include, model);
|
|
@@ -2921,7 +2950,12 @@ var BaseOperationHandler = class {
|
|
|
2921
2950
|
field: rightField,
|
|
2922
2951
|
entity: rightEntity
|
|
2923
2952
|
}
|
|
2924
|
-
].sort((a, b) =>
|
|
2953
|
+
].sort((a, b) => (
|
|
2954
|
+
// the implement m2m join table's "A", "B" fk fields' order is determined
|
|
2955
|
+
// by model name's sort order, and when identical (for self-relations),
|
|
2956
|
+
// field name's sort order
|
|
2957
|
+
a.model !== b.model ? a.model.localeCompare(b.model) : a.field.localeCompare(b.field)
|
|
2958
|
+
));
|
|
2925
2959
|
const firstIds = getIdFields(this.schema, sortedRecords[0].model);
|
|
2926
2960
|
const secondIds = getIdFields(this.schema, sortedRecords[1].model);
|
|
2927
2961
|
invariant7(firstIds.length === 1, "many-to-many relation must have exactly one id field");
|
|
@@ -3426,7 +3460,7 @@ var BaseOperationHandler = class {
|
|
|
3426
3460
|
} else {
|
|
3427
3461
|
query = query.where((eb) => eb(eb.refTuple(
|
|
3428
3462
|
...this.buildIdFieldRefs(kysely, model)
|
|
3429
|
-
), "in", this.dialect.buildSelectModel(eb, filterModel).where(this.dialect.buildFilter(eb, filterModel, filterModel, where)).select(this.buildIdFieldRefs(kysely, filterModel)).$if(limit !== void 0, (qb) => qb.limit(limit))));
|
|
3463
|
+
), "in", this.dialect.buildSelectModel(eb, filterModel, filterModel).where(this.dialect.buildFilter(eb, filterModel, filterModel, where)).select(this.buildIdFieldRefs(kysely, filterModel)).$if(limit !== void 0, (qb) => qb.limit(limit))));
|
|
3430
3464
|
}
|
|
3431
3465
|
query = query.modifyEnd(this.makeContextComment({
|
|
3432
3466
|
model,
|
|
@@ -3844,7 +3878,7 @@ var BaseOperationHandler = class {
|
|
|
3844
3878
|
} else {
|
|
3845
3879
|
query = query.where((eb) => eb(eb.refTuple(
|
|
3846
3880
|
...this.buildIdFieldRefs(kysely, model)
|
|
3847
|
-
), "in", this.dialect.buildSelectModel(eb, filterModel).where((eb2) => this.dialect.buildFilter(eb2, filterModel, filterModel, where)).select(this.buildIdFieldRefs(kysely, filterModel)).$if(limit !== void 0, (qb) => qb.limit(limit))));
|
|
3881
|
+
), "in", this.dialect.buildSelectModel(eb, filterModel, filterModel).where((eb2) => this.dialect.buildFilter(eb2, filterModel, filterModel, where)).select(this.buildIdFieldRefs(kysely, filterModel)).$if(limit !== void 0, (qb) => qb.limit(limit))));
|
|
3848
3882
|
}
|
|
3849
3883
|
await this.processDelegateRelationDelete(kysely, modelDef, where, limit);
|
|
3850
3884
|
query = query.modifyEnd(this.makeContextComment({
|
|
@@ -3980,7 +4014,7 @@ var AggregateOperationHandler = class extends BaseOperationHandler {
|
|
|
3980
4014
|
const normalizedArgs = this.normalizeArgs(args);
|
|
3981
4015
|
const parsedArgs = this.inputValidator.validateAggregateArgs(this.model, normalizedArgs);
|
|
3982
4016
|
let query = this.kysely.selectFrom((eb) => {
|
|
3983
|
-
let subQuery = this.dialect.buildSelectModel(eb, this.model).where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));
|
|
4017
|
+
let subQuery = this.dialect.buildSelectModel(eb, this.model, this.model).where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));
|
|
3984
4018
|
const selectedFields = [];
|
|
3985
4019
|
for (const [key, value] of Object.entries(parsedArgs)) {
|
|
3986
4020
|
if (key.startsWith("_") && value && typeof value === "object") {
|
|
@@ -4090,7 +4124,7 @@ var CountOperationHandler = class extends BaseOperationHandler {
|
|
|
4090
4124
|
const parsedArgs = this.inputValidator.validateCountArgs(this.model, normalizedArgs);
|
|
4091
4125
|
const subQueryName = "$sub";
|
|
4092
4126
|
let query = this.kysely.selectFrom((eb) => {
|
|
4093
|
-
let subQuery = this.dialect.buildSelectModel(eb, this.model).where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));
|
|
4127
|
+
let subQuery = this.dialect.buildSelectModel(eb, this.model, this.model).where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));
|
|
4094
4128
|
if (parsedArgs?.select && typeof parsedArgs.select === "object") {
|
|
4095
4129
|
for (const [key, value] of Object.entries(parsedArgs.select)) {
|
|
4096
4130
|
if (key !== "_all" && value === true) {
|