@prisma/client-engine-runtime 6.9.0-dev.38 → 6.9.0-dev.39
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/QueryPlan.d.ts +11 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +83 -47
- package/dist/index.mjs +83 -47
- package/dist/interpreter/generators.d.ts +2 -1
- package/dist/interpreter/renderQuery.d.ts +2 -1
- package/package.json +3 -3
package/dist/QueryPlan.d.ts
CHANGED
|
@@ -191,6 +191,17 @@ export type QueryPlanNode = {
|
|
|
191
191
|
expr: QueryPlanNode;
|
|
192
192
|
pagination: Pagination;
|
|
193
193
|
};
|
|
194
|
+
} | {
|
|
195
|
+
type: 'extendRecord';
|
|
196
|
+
args: {
|
|
197
|
+
expr: QueryPlanNode;
|
|
198
|
+
values: Record<string, {
|
|
199
|
+
type: 'value';
|
|
200
|
+
value: PrismaValue;
|
|
201
|
+
} | {
|
|
202
|
+
type: 'lastInsertId';
|
|
203
|
+
}>;
|
|
204
|
+
};
|
|
194
205
|
};
|
|
195
206
|
export type Pagination = {
|
|
196
207
|
cursor: Record<string, PrismaValue> | null;
|
package/dist/index.d.mts
CHANGED
|
@@ -282,6 +282,17 @@ export declare type QueryPlanNode = {
|
|
|
282
282
|
expr: QueryPlanNode;
|
|
283
283
|
pagination: Pagination;
|
|
284
284
|
};
|
|
285
|
+
} | {
|
|
286
|
+
type: 'extendRecord';
|
|
287
|
+
args: {
|
|
288
|
+
expr: QueryPlanNode;
|
|
289
|
+
values: Record<string, {
|
|
290
|
+
type: 'value';
|
|
291
|
+
value: PrismaValue;
|
|
292
|
+
} | {
|
|
293
|
+
type: 'lastInsertId';
|
|
294
|
+
}>;
|
|
295
|
+
};
|
|
285
296
|
};
|
|
286
297
|
|
|
287
298
|
export declare type ResultNode = {
|
package/dist/index.d.ts
CHANGED
|
@@ -282,6 +282,17 @@ export declare type QueryPlanNode = {
|
|
|
282
282
|
expr: QueryPlanNode;
|
|
283
283
|
pagination: Pagination;
|
|
284
284
|
};
|
|
285
|
+
} | {
|
|
286
|
+
type: 'extendRecord';
|
|
287
|
+
args: {
|
|
288
|
+
expr: QueryPlanNode;
|
|
289
|
+
values: Record<string, {
|
|
290
|
+
type: 'value';
|
|
291
|
+
value: PrismaValue;
|
|
292
|
+
} | {
|
|
293
|
+
type: 'lastInsertId';
|
|
294
|
+
}>;
|
|
295
|
+
};
|
|
285
296
|
};
|
|
286
297
|
|
|
287
298
|
export declare type ResultNode = {
|
package/dist/index.js
CHANGED
|
@@ -488,7 +488,6 @@ var import_uuid = require("uuid");
|
|
|
488
488
|
var GeneratorRegistry = class {
|
|
489
489
|
#generators = {};
|
|
490
490
|
constructor() {
|
|
491
|
-
this.register("now", new NowGenerator());
|
|
492
491
|
this.register("uuid", new UuidGenerator());
|
|
493
492
|
this.register("cuid", new CuidGenerator());
|
|
494
493
|
this.register("ulid", new UlidGenerator());
|
|
@@ -500,9 +499,11 @@ var GeneratorRegistry = class {
|
|
|
500
499
|
* method being called, meaning that the built-in time-based generators will always return
|
|
501
500
|
* the same value on repeated calls as long as the same snapshot is used.
|
|
502
501
|
*/
|
|
503
|
-
snapshot() {
|
|
502
|
+
snapshot(provider) {
|
|
504
503
|
return Object.create(this.#generators, {
|
|
505
|
-
now: {
|
|
504
|
+
now: {
|
|
505
|
+
value: provider === "mysql" ? new MysqlNowGenerator() : new NowGenerator()
|
|
506
|
+
}
|
|
506
507
|
});
|
|
507
508
|
}
|
|
508
509
|
/**
|
|
@@ -518,6 +519,12 @@ var NowGenerator = class {
|
|
|
518
519
|
return this.#now.toISOString();
|
|
519
520
|
}
|
|
520
521
|
};
|
|
522
|
+
var MysqlNowGenerator = class {
|
|
523
|
+
#now = /* @__PURE__ */ new Date();
|
|
524
|
+
generate() {
|
|
525
|
+
return this.#now.toISOString().replace("T", " ").replace("Z", "");
|
|
526
|
+
}
|
|
527
|
+
};
|
|
521
528
|
var UuidGenerator = class {
|
|
522
529
|
generate(arg) {
|
|
523
530
|
if (arg === 4) {
|
|
@@ -947,9 +954,13 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
947
954
|
});
|
|
948
955
|
}
|
|
949
956
|
async run(queryPlan, queryable) {
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
957
|
+
const { value } = await this.interpretNode(
|
|
958
|
+
queryPlan,
|
|
959
|
+
queryable,
|
|
960
|
+
this.#placeholderValues,
|
|
961
|
+
this.#generators.snapshot(queryable.provider)
|
|
962
|
+
).catch((e) => rethrowAsUserFacing(e));
|
|
963
|
+
return value;
|
|
953
964
|
}
|
|
954
965
|
async interpretNode(node, queryable, scope, generators) {
|
|
955
966
|
switch (node.type) {
|
|
@@ -958,15 +969,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
958
969
|
for (const arg of node.args) {
|
|
959
970
|
result = await this.interpretNode(arg, queryable, scope, generators);
|
|
960
971
|
}
|
|
961
|
-
return result;
|
|
972
|
+
return result ?? { value: void 0 };
|
|
962
973
|
}
|
|
963
974
|
case "get": {
|
|
964
|
-
return scope[node.args.name];
|
|
975
|
+
return { value: scope[node.args.name] };
|
|
965
976
|
}
|
|
966
977
|
case "let": {
|
|
967
978
|
const nestedScope = Object.create(scope);
|
|
968
979
|
for (const binding of node.args.bindings) {
|
|
969
|
-
|
|
980
|
+
const { value } = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
|
|
981
|
+
nestedScope[binding.name] = value;
|
|
970
982
|
}
|
|
971
983
|
return this.interpretNode(node.args.expr, queryable, nestedScope, generators);
|
|
972
984
|
}
|
|
@@ -974,78 +986,87 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
974
986
|
for (const name of node.args.names) {
|
|
975
987
|
const value = scope[name];
|
|
976
988
|
if (!isEmpty(value)) {
|
|
977
|
-
return value;
|
|
989
|
+
return { value };
|
|
978
990
|
}
|
|
979
991
|
}
|
|
980
|
-
return [];
|
|
992
|
+
return { value: [] };
|
|
981
993
|
}
|
|
982
994
|
case "concat": {
|
|
983
|
-
const parts = await Promise.all(
|
|
984
|
-
|
|
995
|
+
const parts = await Promise.all(
|
|
996
|
+
node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
|
|
997
|
+
);
|
|
998
|
+
return {
|
|
999
|
+
value: parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : []
|
|
1000
|
+
};
|
|
985
1001
|
}
|
|
986
1002
|
case "sum": {
|
|
987
|
-
const parts = await Promise.all(
|
|
988
|
-
|
|
1003
|
+
const parts = await Promise.all(
|
|
1004
|
+
node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
|
|
1005
|
+
);
|
|
1006
|
+
return {
|
|
1007
|
+
value: parts.length > 0 ? parts.reduce((acc, part) => asNumber(acc) + asNumber(part)) : 0
|
|
1008
|
+
};
|
|
989
1009
|
}
|
|
990
1010
|
case "execute": {
|
|
991
1011
|
const query = renderQuery(node.args, scope, generators);
|
|
992
1012
|
return this.#withQuerySpanAndEvent(query, queryable, async () => {
|
|
993
|
-
return await queryable.executeRaw(query);
|
|
1013
|
+
return { value: await queryable.executeRaw(query) };
|
|
994
1014
|
});
|
|
995
1015
|
}
|
|
996
1016
|
case "query": {
|
|
997
1017
|
const query = renderQuery(node.args, scope, generators);
|
|
998
1018
|
return this.#withQuerySpanAndEvent(query, queryable, async () => {
|
|
1019
|
+
const result = await queryable.queryRaw(query);
|
|
999
1020
|
if (node.args.type === "rawSql") {
|
|
1000
|
-
return this.#rawSerializer(
|
|
1021
|
+
return { value: this.#rawSerializer(result), lastInsertId: result.lastInsertId };
|
|
1001
1022
|
} else {
|
|
1002
|
-
return this.#serializer(
|
|
1023
|
+
return { value: this.#serializer(result), lastInsertId: result.lastInsertId };
|
|
1003
1024
|
}
|
|
1004
1025
|
});
|
|
1005
1026
|
}
|
|
1006
1027
|
case "reverse": {
|
|
1007
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1008
|
-
return Array.isArray(value) ? value.reverse() : value;
|
|
1028
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1029
|
+
return { value: Array.isArray(value) ? value.reverse() : value, lastInsertId };
|
|
1009
1030
|
}
|
|
1010
1031
|
case "unique": {
|
|
1011
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1032
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1012
1033
|
if (!Array.isArray(value)) {
|
|
1013
|
-
return value;
|
|
1034
|
+
return { value, lastInsertId };
|
|
1014
1035
|
}
|
|
1015
1036
|
if (value.length > 1) {
|
|
1016
1037
|
throw new Error(`Expected zero or one element, got ${value.length}`);
|
|
1017
1038
|
}
|
|
1018
|
-
return value[0] ?? null;
|
|
1039
|
+
return { value: value[0] ?? null, lastInsertId };
|
|
1019
1040
|
}
|
|
1020
1041
|
case "required": {
|
|
1021
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1042
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
1022
1043
|
if (isEmpty(value)) {
|
|
1023
1044
|
throw new Error("Required value is empty");
|
|
1024
1045
|
}
|
|
1025
|
-
return value;
|
|
1046
|
+
return { value, lastInsertId };
|
|
1026
1047
|
}
|
|
1027
1048
|
case "mapField": {
|
|
1028
|
-
const value = await this.interpretNode(node.args.records, queryable, scope, generators);
|
|
1029
|
-
return mapField(value, node.args.field);
|
|
1049
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
|
|
1050
|
+
return { value: mapField(value, node.args.field), lastInsertId };
|
|
1030
1051
|
}
|
|
1031
1052
|
case "join": {
|
|
1032
|
-
const parent = await this.interpretNode(node.args.parent, queryable, scope, generators);
|
|
1053
|
+
const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
|
|
1033
1054
|
if (parent === null) {
|
|
1034
|
-
return null;
|
|
1055
|
+
return { value: null, lastInsertId };
|
|
1035
1056
|
}
|
|
1036
1057
|
const children = await Promise.all(
|
|
1037
1058
|
node.args.children.map(async (joinExpr) => ({
|
|
1038
1059
|
joinExpr,
|
|
1039
|
-
childRecords: await this.interpretNode(joinExpr.child, queryable, scope, generators)
|
|
1060
|
+
childRecords: (await this.interpretNode(joinExpr.child, queryable, scope, generators)).value
|
|
1040
1061
|
}))
|
|
1041
1062
|
);
|
|
1042
1063
|
if (Array.isArray(parent)) {
|
|
1043
1064
|
for (const record of parent) {
|
|
1044
1065
|
attachChildrenToParent(asRecord(record), children);
|
|
1045
1066
|
}
|
|
1046
|
-
return parent;
|
|
1067
|
+
return { value: parent, lastInsertId };
|
|
1047
1068
|
}
|
|
1048
|
-
return attachChildrenToParent(asRecord(parent), children);
|
|
1069
|
+
return { value: attachChildrenToParent(asRecord(parent), children), lastInsertId };
|
|
1049
1070
|
}
|
|
1050
1071
|
case "transaction": {
|
|
1051
1072
|
if (!this.#transactionManager.enabled) {
|
|
@@ -1064,16 +1085,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1064
1085
|
}
|
|
1065
1086
|
}
|
|
1066
1087
|
case "dataMap": {
|
|
1067
|
-
const
|
|
1068
|
-
return applyDataMap(
|
|
1088
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1089
|
+
return { value: applyDataMap(value, node.args.structure), lastInsertId };
|
|
1069
1090
|
}
|
|
1070
1091
|
case "validate": {
|
|
1071
|
-
const
|
|
1072
|
-
performValidation(
|
|
1073
|
-
return
|
|
1092
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1093
|
+
performValidation(value, node.args.rules, node.args);
|
|
1094
|
+
return { value, lastInsertId };
|
|
1074
1095
|
}
|
|
1075
1096
|
case "if": {
|
|
1076
|
-
const value = await this.interpretNode(node.args.value, queryable, scope, generators);
|
|
1097
|
+
const { value } = await this.interpretNode(node.args.value, queryable, scope, generators);
|
|
1077
1098
|
if (doesSatisfyRule(value, node.args.rule)) {
|
|
1078
1099
|
return await this.interpretNode(node.args.then, queryable, scope, generators);
|
|
1079
1100
|
} else {
|
|
@@ -1081,16 +1102,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1081
1102
|
}
|
|
1082
1103
|
}
|
|
1083
1104
|
case "unit": {
|
|
1084
|
-
return void 0;
|
|
1105
|
+
return { value: void 0 };
|
|
1085
1106
|
}
|
|
1086
1107
|
case "diff": {
|
|
1087
|
-
const from = await this.interpretNode(node.args.from, queryable, scope, generators);
|
|
1088
|
-
const to = await this.interpretNode(node.args.to, queryable, scope, generators);
|
|
1108
|
+
const { value: from } = await this.interpretNode(node.args.from, queryable, scope, generators);
|
|
1109
|
+
const { value: to } = await this.interpretNode(node.args.to, queryable, scope, generators);
|
|
1089
1110
|
const toSet = new Set(asList(to));
|
|
1090
|
-
return asList(from).filter((item) => !toSet.has(item));
|
|
1111
|
+
return { value: asList(from).filter((item) => !toSet.has(item)) };
|
|
1091
1112
|
}
|
|
1092
1113
|
case "distinctBy": {
|
|
1093
|
-
const value = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1114
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1094
1115
|
const seen = /* @__PURE__ */ new Set();
|
|
1095
1116
|
const result = [];
|
|
1096
1117
|
for (const item of asList(value)) {
|
|
@@ -1100,10 +1121,10 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1100
1121
|
result.push(item);
|
|
1101
1122
|
}
|
|
1102
1123
|
}
|
|
1103
|
-
return result;
|
|
1124
|
+
return { value: result, lastInsertId };
|
|
1104
1125
|
}
|
|
1105
1126
|
case "paginate": {
|
|
1106
|
-
const value = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1127
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1107
1128
|
const list = asList(value);
|
|
1108
1129
|
const linkingFields = node.args.pagination.linkingFields;
|
|
1109
1130
|
if (linkingFields !== null) {
|
|
@@ -1117,9 +1138,24 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1117
1138
|
}
|
|
1118
1139
|
const groupList = Array.from(groupedByParent.entries());
|
|
1119
1140
|
groupList.sort(([aId], [bId]) => aId < bId ? -1 : aId > bId ? 1 : 0);
|
|
1120
|
-
return
|
|
1141
|
+
return {
|
|
1142
|
+
value: groupList.flatMap(([, elems]) => paginate(elems, node.args.pagination)),
|
|
1143
|
+
lastInsertId
|
|
1144
|
+
};
|
|
1145
|
+
}
|
|
1146
|
+
return { value: paginate(list, node.args.pagination), lastInsertId };
|
|
1147
|
+
}
|
|
1148
|
+
case "extendRecord": {
|
|
1149
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1150
|
+
const record = value === null ? {} : asRecord(value);
|
|
1151
|
+
for (const [key, entry] of Object.entries(node.args.values)) {
|
|
1152
|
+
if (entry.type === "lastInsertId") {
|
|
1153
|
+
record[key] = lastInsertId;
|
|
1154
|
+
} else {
|
|
1155
|
+
record[key] = evaluateParam(entry.value, scope, generators);
|
|
1156
|
+
}
|
|
1121
1157
|
}
|
|
1122
|
-
return
|
|
1158
|
+
return { value: record, lastInsertId };
|
|
1123
1159
|
}
|
|
1124
1160
|
default:
|
|
1125
1161
|
assertNever(node, `Unexpected node type: ${node.type}`);
|
package/dist/index.mjs
CHANGED
|
@@ -440,7 +440,6 @@ import { v4 as uuidv4, v7 as uuidv7 } from "uuid";
|
|
|
440
440
|
var GeneratorRegistry = class {
|
|
441
441
|
#generators = {};
|
|
442
442
|
constructor() {
|
|
443
|
-
this.register("now", new NowGenerator());
|
|
444
443
|
this.register("uuid", new UuidGenerator());
|
|
445
444
|
this.register("cuid", new CuidGenerator());
|
|
446
445
|
this.register("ulid", new UlidGenerator());
|
|
@@ -452,9 +451,11 @@ var GeneratorRegistry = class {
|
|
|
452
451
|
* method being called, meaning that the built-in time-based generators will always return
|
|
453
452
|
* the same value on repeated calls as long as the same snapshot is used.
|
|
454
453
|
*/
|
|
455
|
-
snapshot() {
|
|
454
|
+
snapshot(provider) {
|
|
456
455
|
return Object.create(this.#generators, {
|
|
457
|
-
now: {
|
|
456
|
+
now: {
|
|
457
|
+
value: provider === "mysql" ? new MysqlNowGenerator() : new NowGenerator()
|
|
458
|
+
}
|
|
458
459
|
});
|
|
459
460
|
}
|
|
460
461
|
/**
|
|
@@ -470,6 +471,12 @@ var NowGenerator = class {
|
|
|
470
471
|
return this.#now.toISOString();
|
|
471
472
|
}
|
|
472
473
|
};
|
|
474
|
+
var MysqlNowGenerator = class {
|
|
475
|
+
#now = /* @__PURE__ */ new Date();
|
|
476
|
+
generate() {
|
|
477
|
+
return this.#now.toISOString().replace("T", " ").replace("Z", "");
|
|
478
|
+
}
|
|
479
|
+
};
|
|
473
480
|
var UuidGenerator = class {
|
|
474
481
|
generate(arg) {
|
|
475
482
|
if (arg === 4) {
|
|
@@ -899,9 +906,13 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
899
906
|
});
|
|
900
907
|
}
|
|
901
908
|
async run(queryPlan, queryable) {
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
909
|
+
const { value } = await this.interpretNode(
|
|
910
|
+
queryPlan,
|
|
911
|
+
queryable,
|
|
912
|
+
this.#placeholderValues,
|
|
913
|
+
this.#generators.snapshot(queryable.provider)
|
|
914
|
+
).catch((e) => rethrowAsUserFacing(e));
|
|
915
|
+
return value;
|
|
905
916
|
}
|
|
906
917
|
async interpretNode(node, queryable, scope, generators) {
|
|
907
918
|
switch (node.type) {
|
|
@@ -910,15 +921,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
910
921
|
for (const arg of node.args) {
|
|
911
922
|
result = await this.interpretNode(arg, queryable, scope, generators);
|
|
912
923
|
}
|
|
913
|
-
return result;
|
|
924
|
+
return result ?? { value: void 0 };
|
|
914
925
|
}
|
|
915
926
|
case "get": {
|
|
916
|
-
return scope[node.args.name];
|
|
927
|
+
return { value: scope[node.args.name] };
|
|
917
928
|
}
|
|
918
929
|
case "let": {
|
|
919
930
|
const nestedScope = Object.create(scope);
|
|
920
931
|
for (const binding of node.args.bindings) {
|
|
921
|
-
|
|
932
|
+
const { value } = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
|
|
933
|
+
nestedScope[binding.name] = value;
|
|
922
934
|
}
|
|
923
935
|
return this.interpretNode(node.args.expr, queryable, nestedScope, generators);
|
|
924
936
|
}
|
|
@@ -926,78 +938,87 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
926
938
|
for (const name of node.args.names) {
|
|
927
939
|
const value = scope[name];
|
|
928
940
|
if (!isEmpty(value)) {
|
|
929
|
-
return value;
|
|
941
|
+
return { value };
|
|
930
942
|
}
|
|
931
943
|
}
|
|
932
|
-
return [];
|
|
944
|
+
return { value: [] };
|
|
933
945
|
}
|
|
934
946
|
case "concat": {
|
|
935
|
-
const parts = await Promise.all(
|
|
936
|
-
|
|
947
|
+
const parts = await Promise.all(
|
|
948
|
+
node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
|
|
949
|
+
);
|
|
950
|
+
return {
|
|
951
|
+
value: parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : []
|
|
952
|
+
};
|
|
937
953
|
}
|
|
938
954
|
case "sum": {
|
|
939
|
-
const parts = await Promise.all(
|
|
940
|
-
|
|
955
|
+
const parts = await Promise.all(
|
|
956
|
+
node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
|
|
957
|
+
);
|
|
958
|
+
return {
|
|
959
|
+
value: parts.length > 0 ? parts.reduce((acc, part) => asNumber(acc) + asNumber(part)) : 0
|
|
960
|
+
};
|
|
941
961
|
}
|
|
942
962
|
case "execute": {
|
|
943
963
|
const query = renderQuery(node.args, scope, generators);
|
|
944
964
|
return this.#withQuerySpanAndEvent(query, queryable, async () => {
|
|
945
|
-
return await queryable.executeRaw(query);
|
|
965
|
+
return { value: await queryable.executeRaw(query) };
|
|
946
966
|
});
|
|
947
967
|
}
|
|
948
968
|
case "query": {
|
|
949
969
|
const query = renderQuery(node.args, scope, generators);
|
|
950
970
|
return this.#withQuerySpanAndEvent(query, queryable, async () => {
|
|
971
|
+
const result = await queryable.queryRaw(query);
|
|
951
972
|
if (node.args.type === "rawSql") {
|
|
952
|
-
return this.#rawSerializer(
|
|
973
|
+
return { value: this.#rawSerializer(result), lastInsertId: result.lastInsertId };
|
|
953
974
|
} else {
|
|
954
|
-
return this.#serializer(
|
|
975
|
+
return { value: this.#serializer(result), lastInsertId: result.lastInsertId };
|
|
955
976
|
}
|
|
956
977
|
});
|
|
957
978
|
}
|
|
958
979
|
case "reverse": {
|
|
959
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
960
|
-
return Array.isArray(value) ? value.reverse() : value;
|
|
980
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
981
|
+
return { value: Array.isArray(value) ? value.reverse() : value, lastInsertId };
|
|
961
982
|
}
|
|
962
983
|
case "unique": {
|
|
963
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
984
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
964
985
|
if (!Array.isArray(value)) {
|
|
965
|
-
return value;
|
|
986
|
+
return { value, lastInsertId };
|
|
966
987
|
}
|
|
967
988
|
if (value.length > 1) {
|
|
968
989
|
throw new Error(`Expected zero or one element, got ${value.length}`);
|
|
969
990
|
}
|
|
970
|
-
return value[0] ?? null;
|
|
991
|
+
return { value: value[0] ?? null, lastInsertId };
|
|
971
992
|
}
|
|
972
993
|
case "required": {
|
|
973
|
-
const value = await this.interpretNode(node.args, queryable, scope, generators);
|
|
994
|
+
const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
|
|
974
995
|
if (isEmpty(value)) {
|
|
975
996
|
throw new Error("Required value is empty");
|
|
976
997
|
}
|
|
977
|
-
return value;
|
|
998
|
+
return { value, lastInsertId };
|
|
978
999
|
}
|
|
979
1000
|
case "mapField": {
|
|
980
|
-
const value = await this.interpretNode(node.args.records, queryable, scope, generators);
|
|
981
|
-
return mapField(value, node.args.field);
|
|
1001
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
|
|
1002
|
+
return { value: mapField(value, node.args.field), lastInsertId };
|
|
982
1003
|
}
|
|
983
1004
|
case "join": {
|
|
984
|
-
const parent = await this.interpretNode(node.args.parent, queryable, scope, generators);
|
|
1005
|
+
const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
|
|
985
1006
|
if (parent === null) {
|
|
986
|
-
return null;
|
|
1007
|
+
return { value: null, lastInsertId };
|
|
987
1008
|
}
|
|
988
1009
|
const children = await Promise.all(
|
|
989
1010
|
node.args.children.map(async (joinExpr) => ({
|
|
990
1011
|
joinExpr,
|
|
991
|
-
childRecords: await this.interpretNode(joinExpr.child, queryable, scope, generators)
|
|
1012
|
+
childRecords: (await this.interpretNode(joinExpr.child, queryable, scope, generators)).value
|
|
992
1013
|
}))
|
|
993
1014
|
);
|
|
994
1015
|
if (Array.isArray(parent)) {
|
|
995
1016
|
for (const record of parent) {
|
|
996
1017
|
attachChildrenToParent(asRecord(record), children);
|
|
997
1018
|
}
|
|
998
|
-
return parent;
|
|
1019
|
+
return { value: parent, lastInsertId };
|
|
999
1020
|
}
|
|
1000
|
-
return attachChildrenToParent(asRecord(parent), children);
|
|
1021
|
+
return { value: attachChildrenToParent(asRecord(parent), children), lastInsertId };
|
|
1001
1022
|
}
|
|
1002
1023
|
case "transaction": {
|
|
1003
1024
|
if (!this.#transactionManager.enabled) {
|
|
@@ -1016,16 +1037,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1016
1037
|
}
|
|
1017
1038
|
}
|
|
1018
1039
|
case "dataMap": {
|
|
1019
|
-
const
|
|
1020
|
-
return applyDataMap(
|
|
1040
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1041
|
+
return { value: applyDataMap(value, node.args.structure), lastInsertId };
|
|
1021
1042
|
}
|
|
1022
1043
|
case "validate": {
|
|
1023
|
-
const
|
|
1024
|
-
performValidation(
|
|
1025
|
-
return
|
|
1044
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1045
|
+
performValidation(value, node.args.rules, node.args);
|
|
1046
|
+
return { value, lastInsertId };
|
|
1026
1047
|
}
|
|
1027
1048
|
case "if": {
|
|
1028
|
-
const value = await this.interpretNode(node.args.value, queryable, scope, generators);
|
|
1049
|
+
const { value } = await this.interpretNode(node.args.value, queryable, scope, generators);
|
|
1029
1050
|
if (doesSatisfyRule(value, node.args.rule)) {
|
|
1030
1051
|
return await this.interpretNode(node.args.then, queryable, scope, generators);
|
|
1031
1052
|
} else {
|
|
@@ -1033,16 +1054,16 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1033
1054
|
}
|
|
1034
1055
|
}
|
|
1035
1056
|
case "unit": {
|
|
1036
|
-
return void 0;
|
|
1057
|
+
return { value: void 0 };
|
|
1037
1058
|
}
|
|
1038
1059
|
case "diff": {
|
|
1039
|
-
const from = await this.interpretNode(node.args.from, queryable, scope, generators);
|
|
1040
|
-
const to = await this.interpretNode(node.args.to, queryable, scope, generators);
|
|
1060
|
+
const { value: from } = await this.interpretNode(node.args.from, queryable, scope, generators);
|
|
1061
|
+
const { value: to } = await this.interpretNode(node.args.to, queryable, scope, generators);
|
|
1041
1062
|
const toSet = new Set(asList(to));
|
|
1042
|
-
return asList(from).filter((item) => !toSet.has(item));
|
|
1063
|
+
return { value: asList(from).filter((item) => !toSet.has(item)) };
|
|
1043
1064
|
}
|
|
1044
1065
|
case "distinctBy": {
|
|
1045
|
-
const value = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1066
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1046
1067
|
const seen = /* @__PURE__ */ new Set();
|
|
1047
1068
|
const result = [];
|
|
1048
1069
|
for (const item of asList(value)) {
|
|
@@ -1052,10 +1073,10 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1052
1073
|
result.push(item);
|
|
1053
1074
|
}
|
|
1054
1075
|
}
|
|
1055
|
-
return result;
|
|
1076
|
+
return { value: result, lastInsertId };
|
|
1056
1077
|
}
|
|
1057
1078
|
case "paginate": {
|
|
1058
|
-
const value = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1079
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1059
1080
|
const list = asList(value);
|
|
1060
1081
|
const linkingFields = node.args.pagination.linkingFields;
|
|
1061
1082
|
if (linkingFields !== null) {
|
|
@@ -1069,9 +1090,24 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1069
1090
|
}
|
|
1070
1091
|
const groupList = Array.from(groupedByParent.entries());
|
|
1071
1092
|
groupList.sort(([aId], [bId]) => aId < bId ? -1 : aId > bId ? 1 : 0);
|
|
1072
|
-
return
|
|
1093
|
+
return {
|
|
1094
|
+
value: groupList.flatMap(([, elems]) => paginate(elems, node.args.pagination)),
|
|
1095
|
+
lastInsertId
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
return { value: paginate(list, node.args.pagination), lastInsertId };
|
|
1099
|
+
}
|
|
1100
|
+
case "extendRecord": {
|
|
1101
|
+
const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
|
|
1102
|
+
const record = value === null ? {} : asRecord(value);
|
|
1103
|
+
for (const [key, entry] of Object.entries(node.args.values)) {
|
|
1104
|
+
if (entry.type === "lastInsertId") {
|
|
1105
|
+
record[key] = lastInsertId;
|
|
1106
|
+
} else {
|
|
1107
|
+
record[key] = evaluateParam(entry.value, scope, generators);
|
|
1108
|
+
}
|
|
1073
1109
|
}
|
|
1074
|
-
return
|
|
1110
|
+
return { value: record, lastInsertId };
|
|
1075
1111
|
}
|
|
1076
1112
|
default:
|
|
1077
1113
|
assertNever(node, `Unexpected node type: ${node.type}`);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Provider } from '@prisma/driver-adapter-utils';
|
|
1
2
|
export declare class GeneratorRegistry {
|
|
2
3
|
#private;
|
|
3
4
|
constructor();
|
|
@@ -6,7 +7,7 @@ export declare class GeneratorRegistry {
|
|
|
6
7
|
* method being called, meaning that the built-in time-based generators will always return
|
|
7
8
|
* the same value on repeated calls as long as the same snapshot is used.
|
|
8
9
|
*/
|
|
9
|
-
snapshot(): Readonly<GeneratorRegistrySnapshot>;
|
|
10
|
+
snapshot(provider?: Provider): Readonly<GeneratorRegistrySnapshot>;
|
|
10
11
|
/**
|
|
11
12
|
* Registers a new generator with the given name.
|
|
12
13
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SqlQuery } from '@prisma/driver-adapter-utils';
|
|
2
|
-
import type { QueryPlanDbQuery } from '../QueryPlan';
|
|
2
|
+
import type { PrismaValue, QueryPlanDbQuery } from '../QueryPlan';
|
|
3
3
|
import { GeneratorRegistrySnapshot } from './generators';
|
|
4
4
|
import { ScopeBindings } from './scope';
|
|
5
5
|
export declare function renderQuery(dbQuery: QueryPlanDbQuery, scope: ScopeBindings, generators: GeneratorRegistrySnapshot): SqlQuery;
|
|
6
|
+
export declare function evaluateParam(param: PrismaValue, scope: ScopeBindings, generators: GeneratorRegistrySnapshot): unknown;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/client-engine-runtime",
|
|
3
|
-
"version": "6.9.0-dev.
|
|
3
|
+
"version": "6.9.0-dev.39",
|
|
4
4
|
"description": "This package is intended for Prisma's internal use",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"nanoid": "5.1.5",
|
|
32
32
|
"ulid": "3.0.0",
|
|
33
33
|
"uuid": "11.1.0",
|
|
34
|
-
"@prisma/debug": "6.9.0-dev.
|
|
35
|
-
"@prisma/driver-adapter-utils": "6.9.0-dev.
|
|
34
|
+
"@prisma/debug": "6.9.0-dev.39",
|
|
35
|
+
"@prisma/driver-adapter-utils": "6.9.0-dev.39"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/jest": "29.5.14",
|