@prisma/client-engine-runtime 6.9.0-dev.37 → 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.
@@ -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: { value: new NowGenerator() }
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
- return this.interpretNode(queryPlan, queryable, this.#placeholderValues, this.#generators.snapshot()).catch(
951
- (e) => rethrowAsUserFacing(e)
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
- nestedScope[binding.name] = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
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(node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators)));
984
- return parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : [];
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(node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators)));
988
- return parts.length > 0 ? parts.reduce((acc, part) => asNumber(acc) + asNumber(part)) : 0;
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(await queryable.queryRaw(query));
1021
+ return { value: this.#rawSerializer(result), lastInsertId: result.lastInsertId };
1001
1022
  } else {
1002
- return this.#serializer(await queryable.queryRaw(query));
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 data = await this.interpretNode(node.args.expr, queryable, scope, generators);
1068
- return applyDataMap(data, node.args.structure);
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 data = await this.interpretNode(node.args.expr, queryable, scope, generators);
1072
- performValidation(data, node.args.rules, node.args);
1073
- return data;
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 groupList.flatMap(([, elems]) => paginate(elems, node.args.pagination));
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 paginate(list, node.args.pagination);
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: { value: new NowGenerator() }
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
- return this.interpretNode(queryPlan, queryable, this.#placeholderValues, this.#generators.snapshot()).catch(
903
- (e) => rethrowAsUserFacing(e)
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
- nestedScope[binding.name] = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
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(node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators)));
936
- return parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : [];
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(node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators)));
940
- return parts.length > 0 ? parts.reduce((acc, part) => asNumber(acc) + asNumber(part)) : 0;
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(await queryable.queryRaw(query));
973
+ return { value: this.#rawSerializer(result), lastInsertId: result.lastInsertId };
953
974
  } else {
954
- return this.#serializer(await queryable.queryRaw(query));
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 data = await this.interpretNode(node.args.expr, queryable, scope, generators);
1020
- return applyDataMap(data, node.args.structure);
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 data = await this.interpretNode(node.args.expr, queryable, scope, generators);
1024
- performValidation(data, node.args.rules, node.args);
1025
- return data;
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 groupList.flatMap(([, elems]) => paginate(elems, node.args.pagination));
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 paginate(list, node.args.pagination);
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.37",
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.37",
35
- "@prisma/driver-adapter-utils": "6.9.0-dev.37"
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",