@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/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ClientConstructor } from './contract-cndmlzV3.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-cndmlzV3.cjs';
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-cndmlzV3.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-cndmlzV3.js';
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: sortedModelNames[0] === model ? "A" : "B",
365
+ parentFkName: orderedFK[0],
342
366
  otherModel: fieldDef.type,
343
367
  otherField: fieldDef.relation.opposite,
344
- otherFkName: sortedModelNames[0] === fieldDef.type ? "A" : "B",
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, model, args?.where));
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, model, args.orderBy, skip !== void 0 || take !== void 0, negateOrderBy);
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(`${model}.${f}`)));
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 cursorFilter = this.buildFilter(eb, model, model, cursor);
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(`${model}.${field}`), op, eb.selectFrom(model).select(`${model}.${field}`).where(cursorFilter)));
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, table, field, fieldDef, payload) {
688
+ buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload) {
664
689
  if (payload === null) {
665
- return eb(sql.ref(`${table}.${field}`), "is", null);
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(`${relationModel}.${relationIdField}`), "in", eb2.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`), "=", sql.ref(`${table}.${modelIdField}`)));
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(`${table}.${fk}`), "=", sql.ref(`${relationModel}.${pk}`)));
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(`${table}.${pk}`), "=", sql.ref(`${relationModel}.${fk}`)));
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, relationModel, subPayload)), ">", 0));
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, relationModel, subPayload))), "=", 0));
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, relationModel, subPayload)), "=", 0));
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
- let subQuery = this.buildSelectModel(eb, relationModel);
946
- const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);
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, model, field);
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, otherModel, query) {
1029
+ buildDelegateJoin(thisModel, thisModelAlias, otherModelAlias, query) {
1003
1030
  const idFields = getIdFields(this.schema, thisModel);
1004
- query = query.leftJoin(otherModel, (qb) => {
1031
+ query = query.leftJoin(otherModelAlias, (qb) => {
1005
1032
  for (const idField of idFields) {
1006
- qb = qb.onRef(`${thisModel}.${idField}`, "=", `${otherModel}.${idField}`);
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(`${relationModel}.${relationIds[0]}`), "in", eb.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(`${parentName}.${parentIds[0]}`, "=", `${m2m.joinTable}.${m2m.parentFkName}`)));
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, relationModel);
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, void 0, false)
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
- let subQuery = this.buildSelectModel(eb, relationModel);
1288
- subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
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(`${relationModel}.${relationIds[0]}`), "in", eb.selectFrom(m2m.joinTable).select(`${m2m.joinTable}.${m2m.otherFkName}`).whereRef(`${parentAlias}.${parentIds[0]}`, "=", `${m2m.joinTable}.${m2m.parentFkName}`)));
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(`${relationModel}.${pk}`, "=", `${parentAlias}.${fk}`);
1332
+ subQuery = subQuery.whereRef(`${subQueryAlias}.${pk}`, "=", `${parentAlias}.${fk}`);
1304
1333
  } else {
1305
- subQuery = subQuery.whereRef(`${relationModel}.${fk}`, "=", `${parentAlias}.${pk}`);
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) => a.model.localeCompare(b.model));
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) {