@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.
- package/dist/{contract-BEAyf7Es.d.cts → contract-CBOBlAuw.d.cts} +70 -50
- package/dist/{contract-BEAyf7Es.d.ts → contract-CBOBlAuw.d.ts} +70 -50
- package/dist/index.cjs +664 -243
- 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 +664 -243
- package/dist/index.js.map +1 -1
- package/dist/plugins/{policy.cjs → policy/index.cjs} +225 -125
- package/dist/plugins/policy/index.cjs.map +1 -0
- package/dist/plugins/{policy.d.ts → policy/index.d.cts} +1 -1
- package/dist/plugins/{policy.d.cts → policy/index.d.ts} +1 -1
- package/dist/plugins/{policy.js → policy/index.js} +225 -125
- package/dist/plugins/policy/index.js.map +1 -0
- package/dist/plugins/policy/plugin.zmodel +33 -0
- package/package.json +12 -12
- package/dist/plugins/policy.cjs.map +0 -1
- package/dist/plugins/policy.js.map +0 -1
|
@@ -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
|
-
|
|
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,
|
|
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(`${
|
|
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,
|
|
449
|
+
return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, {
|
|
345
450
|
is: null
|
|
346
451
|
});
|
|
347
452
|
}
|
|
348
453
|
}
|
|
349
|
-
const joinAlias = `${
|
|
350
|
-
const joinPairs = buildJoinPairs(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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,
|
|
576
|
+
buildPrimitiveFilter(eb, fieldRef, fieldDef, payload) {
|
|
466
577
|
if (payload === null) {
|
|
467
|
-
return eb(
|
|
578
|
+
return eb(fieldRef, "is", null);
|
|
468
579
|
}
|
|
469
580
|
if (isEnum(this.schema, fieldDef.type)) {
|
|
470
|
-
return this.buildEnumFilter(eb,
|
|
581
|
+
return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);
|
|
471
582
|
}
|
|
472
|
-
return (0, import_ts_pattern.match)(fieldDef.type).with("String", () => this.buildStringFilter(eb,
|
|
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,
|
|
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,
|
|
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,
|
|
566
|
-
const { conditions } = this.buildStandardFilter(eb, type, payload,
|
|
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,
|
|
570
|
-
const { conditions } = this.buildStandardFilter(eb, "Boolean", payload,
|
|
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,
|
|
577
|
-
const { conditions } = this.buildStandardFilter(eb, "DateTime", payload,
|
|
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,
|
|
581
|
-
const conditions = this.buildStandardFilter(eb, "Bytes", payload,
|
|
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,
|
|
590
|
-
const conditions = this.buildStandardFilter(eb, "String", payload,
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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=
|
|
2454
|
+
//# sourceMappingURL=index.cjs.map
|