@zenstackhq/runtime 3.0.0-alpha.12 → 3.0.0-alpha.13

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.
@@ -51,6 +51,88 @@ var import_common_helpers2 = require("@zenstackhq/common-helpers");
51
51
  var import_kysely2 = require("kysely");
52
52
  var import_ts_pattern2 = require("ts-pattern");
53
53
 
54
+ // src/client/constants.ts
55
+ var DELEGATE_JOINED_FIELD_PREFIX = "$delegate$";
56
+
57
+ // src/schema/expression.ts
58
+ var ExpressionUtils = {
59
+ literal: /* @__PURE__ */ __name((value) => {
60
+ return {
61
+ kind: "literal",
62
+ value
63
+ };
64
+ }, "literal"),
65
+ array: /* @__PURE__ */ __name((items) => {
66
+ return {
67
+ kind: "array",
68
+ items
69
+ };
70
+ }, "array"),
71
+ call: /* @__PURE__ */ __name((functionName, args) => {
72
+ return {
73
+ kind: "call",
74
+ function: functionName,
75
+ args
76
+ };
77
+ }, "call"),
78
+ binary: /* @__PURE__ */ __name((left, op, right) => {
79
+ return {
80
+ kind: "binary",
81
+ op,
82
+ left,
83
+ right
84
+ };
85
+ }, "binary"),
86
+ unary: /* @__PURE__ */ __name((op, operand) => {
87
+ return {
88
+ kind: "unary",
89
+ op,
90
+ operand
91
+ };
92
+ }, "unary"),
93
+ field: /* @__PURE__ */ __name((field) => {
94
+ return {
95
+ kind: "field",
96
+ field
97
+ };
98
+ }, "field"),
99
+ member: /* @__PURE__ */ __name((receiver, members) => {
100
+ return {
101
+ kind: "member",
102
+ receiver,
103
+ members
104
+ };
105
+ }, "member"),
106
+ _this: /* @__PURE__ */ __name(() => {
107
+ return {
108
+ kind: "this"
109
+ };
110
+ }, "_this"),
111
+ _null: /* @__PURE__ */ __name(() => {
112
+ return {
113
+ kind: "null"
114
+ };
115
+ }, "_null"),
116
+ and: /* @__PURE__ */ __name((expr2, ...expressions) => {
117
+ return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, "&&", exp), expr2);
118
+ }, "and"),
119
+ or: /* @__PURE__ */ __name((expr2, ...expressions) => {
120
+ return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, "||", exp), expr2);
121
+ }, "or"),
122
+ is: /* @__PURE__ */ __name((value, kind) => {
123
+ return !!value && typeof value === "object" && "kind" in value && value.kind === kind;
124
+ }, "is"),
125
+ isLiteral: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "literal"), "isLiteral"),
126
+ isArray: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "array"), "isArray"),
127
+ isCall: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "call"), "isCall"),
128
+ isNull: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "null"), "isNull"),
129
+ isThis: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "this"), "isThis"),
130
+ isUnary: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "unary"), "isUnary"),
131
+ isBinary: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "binary"), "isBinary"),
132
+ isField: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "field"), "isField"),
133
+ isMember: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "member"), "isMember")
134
+ };
135
+
54
136
  // src/client/errors.ts
55
137
  var QueryError = class extends Error {
56
138
  static {
@@ -69,10 +151,6 @@ var InternalError = class extends Error {
69
151
  };
70
152
 
71
153
  // src/client/query-utils.ts
72
- function getModel(schema, model) {
73
- return schema.models[model];
74
- }
75
- __name(getModel, "getModel");
76
154
  function requireModel(schema, model) {
77
155
  const matchedName = Object.keys(schema.models).find((k) => k.toLowerCase() === model.toLowerCase());
78
156
  if (!matchedName) {
@@ -81,11 +159,6 @@ function requireModel(schema, model) {
81
159
  return schema.models[matchedName];
82
160
  }
83
161
  __name(requireModel, "requireModel");
84
- function getField(schema, model, field) {
85
- const modelDef = getModel(schema, model);
86
- return modelDef?.fields[field];
87
- }
88
- __name(getField, "getField");
89
162
  function requireField(schema, model, field) {
90
163
  const modelDef = requireModel(schema, model);
91
164
  if (!modelDef.fields[field]) {
@@ -144,6 +217,11 @@ function isRelationField(schema, model, field) {
144
217
  return !!fieldDef.relation;
145
218
  }
146
219
  __name(isRelationField, "isRelationField");
220
+ function isInheritedField(schema, model, field) {
221
+ const fieldDef = requireField(schema, model, field);
222
+ return !!fieldDef.originModel;
223
+ }
224
+ __name(isInheritedField, "isInheritedField");
147
225
  function getUniqueFields(schema, model) {
148
226
  const modelDef = requireModel(schema, model);
149
227
  const result = [];
@@ -257,6 +335,19 @@ function flattenCompoundUniqueFilters(schema, model, filter) {
257
335
  return result;
258
336
  }
259
337
  __name(flattenCompoundUniqueFilters, "flattenCompoundUniqueFilters");
338
+ function getDelegateDescendantModels(schema, model, collected = /* @__PURE__ */ new Set()) {
339
+ const subModels = Object.values(schema.models).filter((m) => m.baseModel === model);
340
+ subModels.forEach((def) => {
341
+ if (!collected.has(def)) {
342
+ collected.add(def);
343
+ getDelegateDescendantModels(schema, def.name, collected);
344
+ }
345
+ });
346
+ return [
347
+ ...collected
348
+ ];
349
+ }
350
+ __name(getDelegateDescendantModels, "getDelegateDescendantModels");
260
351
 
261
352
  // src/client/crud/dialects/base.ts
262
353
  var import_common_helpers = require("@zenstackhq/common-helpers");
@@ -291,6 +382,17 @@ var BaseCrudDialect = class {
291
382
  transformPrimitive(value, _type, _forArrayField) {
292
383
  return value;
293
384
  }
385
+ // #region common query builders
386
+ buildSelectModel(eb, model) {
387
+ const modelDef = requireModel(this.schema, model);
388
+ let result = eb.selectFrom(model);
389
+ let joinBase = modelDef.baseModel;
390
+ while (joinBase) {
391
+ result = this.buildDelegateJoin(model, joinBase, result);
392
+ joinBase = requireModel(this.schema, joinBase).baseModel;
393
+ }
394
+ return result;
395
+ }
294
396
  buildFilter(eb, model, modelAlias, where) {
295
397
  if (where === true || where === void 0) {
296
398
  return this.true(eb);
@@ -314,10 +416,13 @@ var BaseCrudDialect = class {
314
416
  const fieldDef = requireField(this.schema, model, key);
315
417
  if (fieldDef.relation) {
316
418
  result = this.and(eb, result, this.buildRelationFilter(eb, model, modelAlias, key, fieldDef, payload));
317
- } else if (fieldDef.array) {
318
- result = this.and(eb, result, this.buildArrayFilter(eb, model, modelAlias, key, fieldDef, payload));
319
419
  } else {
320
- result = this.and(eb, result, this.buildPrimitiveFilter(eb, model, modelAlias, key, fieldDef, payload));
420
+ const fieldRef = buildFieldRef(this.schema, fieldDef.originModel ?? model, key, this.options, eb, fieldDef.originModel ?? modelAlias);
421
+ if (fieldDef.array) {
422
+ result = this.and(eb, result, this.buildArrayFilter(eb, fieldRef, fieldDef, payload));
423
+ } else {
424
+ result = this.and(eb, result, this.buildPrimitiveFilter(eb, fieldRef, fieldDef, payload));
425
+ }
321
426
  }
322
427
  }
323
428
  if ("$expr" in _where && typeof _where["$expr"] === "function") {
@@ -335,19 +440,26 @@ var BaseCrudDialect = class {
335
440
  return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);
336
441
  }
337
442
  }
338
- buildToOneRelationFilter(eb, model, table, field, fieldDef, payload) {
443
+ buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload) {
339
444
  if (payload === null) {
340
445
  const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, field);
341
- if (ownedByModel) {
342
- return this.and(eb, ...keyPairs.map(({ fk }) => eb(import_kysely.sql.ref(`${table}.${fk}`), "is", null)));
446
+ if (ownedByModel && !fieldDef.originModel) {
447
+ return this.and(eb, ...keyPairs.map(({ fk }) => eb(import_kysely.sql.ref(`${modelAlias}.${fk}`), "is", null)));
343
448
  } else {
344
- return this.buildToOneRelationFilter(eb, model, table, field, fieldDef, {
449
+ return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, {
345
450
  is: null
346
451
  });
347
452
  }
348
453
  }
349
- const joinAlias = `${table}$${field}`;
350
- const joinPairs = buildJoinPairs(this.schema, model, table, field, joinAlias);
454
+ const joinAlias = `${modelAlias}$${field}`;
455
+ const joinPairs = buildJoinPairs(
456
+ this.schema,
457
+ model,
458
+ // if field is from a base, use the base model to join
459
+ fieldDef.originModel ?? modelAlias,
460
+ field,
461
+ joinAlias
462
+ );
351
463
  const filterResultField = `${field}$filter`;
352
464
  const joinSelect = eb.selectFrom(`${fieldDef.type} as ${joinAlias}`).where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(import_kysely.sql.ref(left), "=", import_kysely.sql.ref(right))))).select(() => eb.fn.count(eb.lit(1)).as(filterResultField));
353
465
  const conditions = [];
@@ -408,25 +520,24 @@ var BaseCrudDialect = class {
408
520
  }
409
521
  switch (key) {
410
522
  case "some": {
411
- result = this.and(eb, result, eb(eb.selectFrom(relationModel).select((eb1) => eb1.fn.count(eb1.lit(1)).as("count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel, relationModel, subPayload)), ">", 0));
523
+ 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));
412
524
  break;
413
525
  }
414
526
  case "every": {
415
- result = this.and(eb, result, eb(eb.selectFrom(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));
527
+ 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));
416
528
  break;
417
529
  }
418
530
  case "none": {
419
- result = this.and(eb, result, eb(eb.selectFrom(relationModel).select((eb1) => eb1.fn.count(eb1.lit(1)).as("count")).where(buildPkFkWhereRefs(eb)).where((eb1) => this.buildFilter(eb1, relationModel, relationModel, subPayload)), "=", 0));
531
+ 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));
420
532
  break;
421
533
  }
422
534
  }
423
535
  }
424
536
  return result;
425
537
  }
426
- buildArrayFilter(eb, model, modelAlias, field, fieldDef, payload) {
538
+ buildArrayFilter(eb, fieldRef, fieldDef, payload) {
427
539
  const clauses = [];
428
540
  const fieldType = fieldDef.type;
429
- const fieldRef = buildFieldRef(this.schema, model, field, this.options, eb, modelAlias);
430
541
  for (const [key, _value] of Object.entries(payload)) {
431
542
  if (_value === void 0) {
432
543
  continue;
@@ -462,14 +573,14 @@ var BaseCrudDialect = class {
462
573
  }
463
574
  return this.and(eb, ...clauses);
464
575
  }
465
- buildPrimitiveFilter(eb, model, modelAlias, field, fieldDef, payload) {
576
+ buildPrimitiveFilter(eb, fieldRef, fieldDef, payload) {
466
577
  if (payload === null) {
467
- return eb(import_kysely.sql.ref(`${modelAlias}.${field}`), "is", null);
578
+ return eb(fieldRef, "is", null);
468
579
  }
469
580
  if (isEnum(this.schema, fieldDef.type)) {
470
- return this.buildEnumFilter(eb, modelAlias, field, fieldDef, payload);
581
+ return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);
471
582
  }
472
- return (0, import_ts_pattern.match)(fieldDef.type).with("String", () => this.buildStringFilter(eb, modelAlias, field, payload)).with(import_ts_pattern.P.union("Int", "Float", "Decimal", "BigInt"), (type) => this.buildNumberFilter(eb, model, modelAlias, field, type, payload)).with("Boolean", () => this.buildBooleanFilter(eb, modelAlias, field, payload)).with("DateTime", () => this.buildDateTimeFilter(eb, modelAlias, field, payload)).with("Bytes", () => this.buildBytesFilter(eb, modelAlias, field, payload)).with("Json", () => {
583
+ return (0, import_ts_pattern.match)(fieldDef.type).with("String", () => this.buildStringFilter(eb, fieldRef, payload)).with(import_ts_pattern.P.union("Int", "Float", "Decimal", "BigInt"), (type) => this.buildNumberFilter(eb, fieldRef, type, payload)).with("Boolean", () => this.buildBooleanFilter(eb, fieldRef, payload)).with("DateTime", () => this.buildDateTimeFilter(eb, fieldRef, payload)).with("Bytes", () => this.buildBytesFilter(eb, fieldRef, payload)).with("Json", () => {
473
584
  throw new InternalError("JSON filters are not supported yet");
474
585
  }).with("Unsupported", () => {
475
586
  throw new QueryError(`Unsupported field cannot be used in filters`);
@@ -525,9 +636,7 @@ var BaseCrudDialect = class {
525
636
  consumedKeys
526
637
  };
527
638
  }
528
- buildStringFilter(eb, table, field, payload) {
529
- const fieldDef = getField(this.schema, table, field);
530
- let fieldRef = fieldDef?.computed ? import_kysely.sql.ref(field) : import_kysely.sql.ref(`${table}.${field}`);
639
+ buildStringFilter(eb, fieldRef, payload) {
531
640
  let insensitive = false;
532
641
  if (payload && typeof payload === "object" && "mode" in payload && payload.mode === "insensitive") {
533
642
  insensitive = true;
@@ -535,7 +644,7 @@ var BaseCrudDialect = class {
535
644
  fieldRef
536
645
  ]);
537
646
  }
538
- const { conditions, consumedKeys } = this.buildStandardFilter(eb, "String", payload, fieldRef, (value) => this.prepStringCasing(eb, value, insensitive), (value) => this.buildStringFilter(eb, table, field, value));
647
+ const { conditions, consumedKeys } = this.buildStandardFilter(eb, "String", payload, fieldRef, (value) => this.prepStringCasing(eb, value, insensitive), (value) => this.buildStringFilter(eb, fieldRef, value));
539
648
  if (payload && typeof payload === "object") {
540
649
  for (const [key, value] of Object.entries(payload)) {
541
650
  if (key === "mode" || consumedKeys.includes(key)) {
@@ -562,23 +671,23 @@ var BaseCrudDialect = class {
562
671
  return value === null ? null : import_kysely.sql.lit(value);
563
672
  }
564
673
  }
565
- buildNumberFilter(eb, model, table, field, type, payload) {
566
- const { conditions } = this.buildStandardFilter(eb, type, payload, buildFieldRef(this.schema, model, field, this.options, eb), (value) => this.transformPrimitive(value, type, false), (value) => this.buildNumberFilter(eb, model, table, field, type, value));
674
+ buildNumberFilter(eb, fieldRef, type, payload) {
675
+ const { conditions } = this.buildStandardFilter(eb, type, payload, fieldRef, (value) => this.transformPrimitive(value, type, false), (value) => this.buildNumberFilter(eb, fieldRef, type, value));
567
676
  return this.and(eb, ...conditions);
568
677
  }
569
- buildBooleanFilter(eb, table, field, payload) {
570
- const { conditions } = this.buildStandardFilter(eb, "Boolean", payload, import_kysely.sql.ref(`${table}.${field}`), (value) => this.transformPrimitive(value, "Boolean", false), (value) => this.buildBooleanFilter(eb, table, field, value), true, [
678
+ buildBooleanFilter(eb, fieldRef, payload) {
679
+ const { conditions } = this.buildStandardFilter(eb, "Boolean", payload, fieldRef, (value) => this.transformPrimitive(value, "Boolean", false), (value) => this.buildBooleanFilter(eb, fieldRef, value), true, [
571
680
  "equals",
572
681
  "not"
573
682
  ]);
574
683
  return this.and(eb, ...conditions);
575
684
  }
576
- buildDateTimeFilter(eb, table, field, payload) {
577
- const { conditions } = this.buildStandardFilter(eb, "DateTime", payload, import_kysely.sql.ref(`${table}.${field}`), (value) => this.transformPrimitive(value, "DateTime", false), (value) => this.buildDateTimeFilter(eb, table, field, value), true);
685
+ buildDateTimeFilter(eb, fieldRef, payload) {
686
+ const { conditions } = this.buildStandardFilter(eb, "DateTime", payload, fieldRef, (value) => this.transformPrimitive(value, "DateTime", false), (value) => this.buildDateTimeFilter(eb, fieldRef, value), true);
578
687
  return this.and(eb, ...conditions);
579
688
  }
580
- buildBytesFilter(eb, table, field, payload) {
581
- const conditions = this.buildStandardFilter(eb, "Bytes", payload, import_kysely.sql.ref(`${table}.${field}`), (value) => this.transformPrimitive(value, "Bytes", false), (value) => this.buildBytesFilter(eb, table, field, value), true, [
689
+ buildBytesFilter(eb, fieldRef, payload) {
690
+ const conditions = this.buildStandardFilter(eb, "Bytes", payload, fieldRef, (value) => this.transformPrimitive(value, "Bytes", false), (value) => this.buildBytesFilter(eb, fieldRef, value), true, [
582
691
  "equals",
583
692
  "in",
584
693
  "notIn",
@@ -586,8 +695,8 @@ var BaseCrudDialect = class {
586
695
  ]);
587
696
  return this.and(eb, ...conditions.conditions);
588
697
  }
589
- buildEnumFilter(eb, table, field, fieldDef, payload) {
590
- const conditions = this.buildStandardFilter(eb, "String", payload, import_kysely.sql.ref(`${table}.${field}`), (value) => value, (value) => this.buildEnumFilter(eb, table, field, fieldDef, value), true, [
698
+ buildEnumFilter(eb, fieldRef, fieldDef, payload) {
699
+ const conditions = this.buildStandardFilter(eb, "String", payload, fieldRef, (value) => value, (value) => this.buildEnumFilter(eb, fieldRef, fieldDef, value), true, [
591
700
  "equals",
592
701
  "in",
593
702
  "notIn",
@@ -654,7 +763,7 @@ var BaseCrudDialect = class {
654
763
  (0, import_common_helpers.invariant)(value._count === "asc" || value._count === "desc", 'invalid orderBy value for field "_count"');
655
764
  const sort = this.negateSort(value._count, negated);
656
765
  result = result.orderBy((eb) => {
657
- let subQuery = eb.selectFrom(relationModel);
766
+ let subQuery = this.buildSelectModel(eb, relationModel);
658
767
  const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);
659
768
  subQuery = subQuery.where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(import_kysely.sql.ref(left), "=", import_kysely.sql.ref(right)))));
660
769
  subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as("_count"));
@@ -673,6 +782,56 @@ var BaseCrudDialect = class {
673
782
  });
674
783
  return result;
675
784
  }
785
+ buildSelectAllFields(model, query, omit) {
786
+ const modelDef = requireModel(this.schema, model);
787
+ let result = query;
788
+ for (const field of Object.keys(modelDef.fields)) {
789
+ if (isRelationField(this.schema, model, field)) {
790
+ continue;
791
+ }
792
+ if (omit?.[field] === true) {
793
+ continue;
794
+ }
795
+ result = this.buildSelectField(result, model, model, field);
796
+ }
797
+ const descendants = getDelegateDescendantModels(this.schema, model);
798
+ for (const subModel of descendants) {
799
+ result = this.buildDelegateJoin(model, subModel.name, result);
800
+ result = result.select((eb) => {
801
+ const jsonObject = {};
802
+ for (const field of Object.keys(subModel.fields)) {
803
+ if (isRelationField(this.schema, subModel.name, field) || isInheritedField(this.schema, subModel.name, field)) {
804
+ continue;
805
+ }
806
+ jsonObject[field] = eb.ref(`${subModel.name}.${field}`);
807
+ }
808
+ return this.buildJsonObject(eb, jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);
809
+ });
810
+ }
811
+ return result;
812
+ }
813
+ buildSelectField(query, model, modelAlias, field) {
814
+ const fieldDef = requireField(this.schema, model, field);
815
+ if (fieldDef.computed) {
816
+ return query.select((eb) => buildFieldRef(this.schema, model, field, this.options, eb).as(field));
817
+ } else if (!fieldDef.originModel) {
818
+ return query.select(import_kysely.sql.ref(`${modelAlias}.${field}`).as(field));
819
+ } else {
820
+ return this.buildSelectField(query, fieldDef.originModel, fieldDef.originModel, field);
821
+ }
822
+ }
823
+ buildDelegateJoin(thisModel, otherModel, query) {
824
+ const idFields = getIdFields(this.schema, thisModel);
825
+ query = query.leftJoin(otherModel, (qb) => {
826
+ for (const idField of idFields) {
827
+ qb = qb.onRef(`${thisModel}.${idField}`, "=", `${otherModel}.${idField}`);
828
+ }
829
+ return qb;
830
+ });
831
+ return query;
832
+ }
833
+ // #endregion
834
+ // #region utils
676
835
  negateSort(sort, negated) {
677
836
  return negated ? sort === "asc" ? "desc" : "asc" : sort;
678
837
  }
@@ -754,7 +913,8 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
754
913
  const joinTableName = `${parentName}$${relationField}`;
755
914
  let result = eb.selectFrom(`${relationModel} as ${joinTableName}`);
756
915
  result = eb.selectFrom(() => {
757
- let subQuery = eb.selectFrom(`${relationModel}`).selectAll();
916
+ let subQuery = this.buildSelectModel(eb, relationModel);
917
+ subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
758
918
  if (payload && typeof payload === "object") {
759
919
  if (payload.where) {
760
920
  subQuery = subQuery.where((eb2) => this.buildFilter(eb2, relationModel, relationModel, payload.where));
@@ -801,6 +961,13 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
801
961
  buildRelationObjectArgs(relationModel, relationField, eb, payload, parentName) {
802
962
  const relationModelDef = requireModel(this.schema, relationModel);
803
963
  const objArgs = [];
964
+ const descendantModels = getDelegateDescendantModels(this.schema, relationModel);
965
+ if (descendantModels.length > 0) {
966
+ objArgs.push(...descendantModels.map((subModel) => [
967
+ import_kysely2.sql.lit(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),
968
+ eb.ref(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`)
969
+ ]).flatMap((v) => v));
970
+ }
804
971
  if (payload === true || !payload.select) {
805
972
  objArgs.push(...Object.entries(relationModelDef.fields).filter(([, value]) => !value.relation).filter(([name]) => !(typeof payload === "object" && payload.omit?.[name] === true)).map(([field]) => [
806
973
  import_kysely2.sql.lit(field),
@@ -893,7 +1060,11 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
893
1060
  if (Array.isArray(value)) {
894
1061
  return value.map((v) => this.transformPrimitive(v, type, false));
895
1062
  } else {
896
- return (0, import_ts_pattern3.match)(type).with("Boolean", () => value ? 1 : 0).with("DateTime", () => value instanceof Date ? value.toISOString() : value).with("Decimal", () => value.toString()).with("Bytes", () => Buffer.from(value)).with("Json", () => JSON.stringify(value)).otherwise(() => value);
1063
+ if (this.schema.typeDefs && type in this.schema.typeDefs) {
1064
+ return JSON.stringify(value);
1065
+ } else {
1066
+ return (0, import_ts_pattern3.match)(type).with("Boolean", () => value ? 1 : 0).with("DateTime", () => value instanceof Date ? value.toISOString() : value).with("Decimal", () => value.toString()).with("Bytes", () => Buffer.from(value)).with("Json", () => JSON.stringify(value)).otherwise(() => value);
1067
+ }
897
1068
  }
898
1069
  }
899
1070
  buildRelationSelection(query, model, relationField, parentAlias, payload) {
@@ -905,7 +1076,8 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
905
1076
  const relationModelDef = requireModel(this.schema, relationModel);
906
1077
  const subQueryName = `${parentName}$${relationField}`;
907
1078
  let tbl = eb.selectFrom(() => {
908
- let subQuery = eb.selectFrom(relationModel).selectAll();
1079
+ let subQuery = this.buildSelectModel(eb, relationModel);
1080
+ subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
909
1081
  if (payload && typeof payload === "object") {
910
1082
  if (payload.where) {
911
1083
  subQuery = subQuery.where((eb2) => this.buildFilter(eb2, relationModel, relationModel, payload.where));
@@ -941,6 +1113,13 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
941
1113
  });
942
1114
  tbl = tbl.select(() => {
943
1115
  const objArgs = [];
1116
+ const descendantModels = getDelegateDescendantModels(this.schema, relationModel);
1117
+ if (descendantModels.length > 0) {
1118
+ objArgs.push(...descendantModels.map((subModel) => [
1119
+ import_kysely3.sql.lit(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),
1120
+ eb.ref(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`)
1121
+ ]).flatMap((v) => v));
1122
+ }
944
1123
  if (payload === true || !payload.select) {
945
1124
  objArgs.push(...Object.entries(relationModelDef.fields).filter(([, value]) => !value.relation).filter(([name]) => !(typeof payload === "object" && payload.omit?.[name] === true)).map(([field]) => [
946
1125
  import_kysely3.sql.lit(field),
@@ -1023,85 +1202,6 @@ function getCrudDialect(schema, options) {
1023
1202
  }
1024
1203
  __name(getCrudDialect, "getCrudDialect");
1025
1204
 
1026
- // src/schema/expression.ts
1027
- var ExpressionUtils = {
1028
- literal: /* @__PURE__ */ __name((value) => {
1029
- return {
1030
- kind: "literal",
1031
- value
1032
- };
1033
- }, "literal"),
1034
- array: /* @__PURE__ */ __name((items) => {
1035
- return {
1036
- kind: "array",
1037
- items
1038
- };
1039
- }, "array"),
1040
- call: /* @__PURE__ */ __name((functionName, args) => {
1041
- return {
1042
- kind: "call",
1043
- function: functionName,
1044
- args
1045
- };
1046
- }, "call"),
1047
- binary: /* @__PURE__ */ __name((left, op, right) => {
1048
- return {
1049
- kind: "binary",
1050
- op,
1051
- left,
1052
- right
1053
- };
1054
- }, "binary"),
1055
- unary: /* @__PURE__ */ __name((op, operand) => {
1056
- return {
1057
- kind: "unary",
1058
- op,
1059
- operand
1060
- };
1061
- }, "unary"),
1062
- field: /* @__PURE__ */ __name((field) => {
1063
- return {
1064
- kind: "field",
1065
- field
1066
- };
1067
- }, "field"),
1068
- member: /* @__PURE__ */ __name((receiver, members) => {
1069
- return {
1070
- kind: "member",
1071
- receiver,
1072
- members
1073
- };
1074
- }, "member"),
1075
- _this: /* @__PURE__ */ __name(() => {
1076
- return {
1077
- kind: "this"
1078
- };
1079
- }, "_this"),
1080
- _null: /* @__PURE__ */ __name(() => {
1081
- return {
1082
- kind: "null"
1083
- };
1084
- }, "_null"),
1085
- and: /* @__PURE__ */ __name((expr2, ...expressions) => {
1086
- return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, "&&", exp), expr2);
1087
- }, "and"),
1088
- or: /* @__PURE__ */ __name((expr2, ...expressions) => {
1089
- return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, "||", exp), expr2);
1090
- }, "or"),
1091
- is: /* @__PURE__ */ __name((value, kind) => {
1092
- return !!value && typeof value === "object" && "kind" in value && value.kind === kind;
1093
- }, "is"),
1094
- isLiteral: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "literal"), "isLiteral"),
1095
- isArray: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "array"), "isArray"),
1096
- isCall: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "call"), "isCall"),
1097
- isNull: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "null"), "isNull"),
1098
- isThis: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "this"), "isThis"),
1099
- isUnary: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "unary"), "isUnary"),
1100
- isBinary: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "binary"), "isBinary"),
1101
- isField: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "field"), "isField"),
1102
- isMember: /* @__PURE__ */ __name((value) => ExpressionUtils.is(value, "member"), "isMember")
1103
- };
1104
-
1105
1205
  // src/utils/default-operation-node-visitor.ts
1106
1206
  var import_kysely4 = require("kysely");
1107
1207
  var DefaultOperationNodeVisitor = class extends import_kysely4.OperationNodeVisitor {
@@ -2351,4 +2451,4 @@ var PolicyPlugin = class {
2351
2451
  PolicyPlugin,
2352
2452
  RejectedByPolicyError
2353
2453
  });
2354
- //# sourceMappingURL=policy.cjs.map
2454
+ //# sourceMappingURL=index.cjs.map