@prisma/client-engine-runtime 6.15.0-dev.2 → 6.15.0-dev.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -39,8 +39,6 @@ __export(index_exports, {
39
39
  deserializeJsonResponse: () => deserializeJsonResponse,
40
40
  doKeysMatch: () => doKeysMatch,
41
41
  isDeepStrictEqual: () => isDeepStrictEqual,
42
- isPrismaValueBigInt: () => isPrismaValueBigInt,
43
- isPrismaValueBytes: () => isPrismaValueBytes,
44
42
  isPrismaValueGenerator: () => isPrismaValueGenerator,
45
43
  isPrismaValuePlaceholder: () => isPrismaValuePlaceholder,
46
44
  noopTracingHelper: () => noopTracingHelper,
@@ -447,15 +445,15 @@ var DataMapperError = class extends Error {
447
445
  };
448
446
  function applyDataMap(data, structure, enums) {
449
447
  switch (structure.type) {
450
- case "AffectedRows":
448
+ case "affectedRows":
451
449
  if (typeof data !== "number") {
452
450
  throw new DataMapperError(`Expected an affected rows count, got: ${typeof data} (${data})`);
453
451
  }
454
452
  return { count: data };
455
- case "Object":
453
+ case "object":
456
454
  return mapArrayOrObject(data, structure.fields, enums, structure.skipNulls);
457
- case "Value":
458
- return mapValue(data, "<result>", structure.resultType, enums);
455
+ case "field":
456
+ return mapValue(data, "<result>", structure.fieldType, enums);
459
457
  default:
460
458
  assertNever(structure, `Invalid data mapping type: '${structure.type}'`);
461
459
  }
@@ -493,10 +491,10 @@ function mapObject(data, fields, enums) {
493
491
  const result = {};
494
492
  for (const [name, node] of Object.entries(fields)) {
495
493
  switch (node.type) {
496
- case "AffectedRows": {
494
+ case "affectedRows": {
497
495
  throw new DataMapperError(`Unexpected 'AffectedRows' node in data mapping for field '${name}'`);
498
496
  }
499
- case "Object": {
497
+ case "object": {
500
498
  if (node.serializedName !== null && !Object.hasOwn(data, node.serializedName)) {
501
499
  throw new DataMapperError(
502
500
  `Missing data field (Object): '${name}'; node: ${JSON.stringify(node)}; data: ${JSON.stringify(data)}`
@@ -506,11 +504,11 @@ function mapObject(data, fields, enums) {
506
504
  result[name] = mapArrayOrObject(target, node.fields, enums, node.skipNulls);
507
505
  break;
508
506
  }
509
- case "Value":
507
+ case "field":
510
508
  {
511
509
  const dbName = node.dbName;
512
510
  if (Object.hasOwn(data, dbName)) {
513
- result[name] = mapValue(data[dbName], dbName, node.resultType, enums);
511
+ result[name] = mapField(data[dbName], dbName, node.fieldType, enums);
514
512
  } else {
515
513
  throw new DataMapperError(
516
514
  `Missing data field (Value): '${dbName}'; node: ${JSON.stringify(node)}; data: ${JSON.stringify(data)}`
@@ -524,20 +522,27 @@ function mapObject(data, fields, enums) {
524
522
  }
525
523
  return result;
526
524
  }
527
- function mapValue(value, columnName, resultType, enums) {
525
+ function mapField(value, columnName, fieldType, enums) {
528
526
  if (value === null) {
529
- return resultType.type === "Array" ? [] : null;
527
+ return fieldType.arity === "list" ? [] : null;
530
528
  }
531
- switch (resultType.type) {
532
- case "Any":
529
+ if (fieldType.arity === "list") {
530
+ const values = value;
531
+ return values.map((v, i) => mapValue(v, `${columnName}[${i}]`, fieldType, enums));
532
+ }
533
+ return mapValue(value, columnName, fieldType, enums);
534
+ }
535
+ function mapValue(value, columnName, scalarType, enums) {
536
+ switch (scalarType.type) {
537
+ case "unsupported":
533
538
  return value;
534
- case "String": {
539
+ case "string": {
535
540
  if (typeof value !== "string") {
536
541
  throw new DataMapperError(`Expected a string in column '${columnName}', got ${typeof value}: ${value}`);
537
542
  }
538
543
  return value;
539
544
  }
540
- case "Int": {
545
+ case "int": {
541
546
  switch (typeof value) {
542
547
  case "number": {
543
548
  return Math.trunc(value);
@@ -558,13 +563,13 @@ function mapValue(value, columnName, resultType, enums) {
558
563
  throw new DataMapperError(`Expected an integer in column '${columnName}', got ${typeof value}: ${value}`);
559
564
  }
560
565
  }
561
- case "BigInt": {
566
+ case "bigint": {
562
567
  if (typeof value !== "number" && typeof value !== "string") {
563
568
  throw new DataMapperError(`Expected a bigint in column '${columnName}', got ${typeof value}: ${value}`);
564
569
  }
565
570
  return { $type: "BigInt", value };
566
571
  }
567
- case "Float": {
572
+ case "float": {
568
573
  if (typeof value === "number") return value;
569
574
  if (typeof value === "string") {
570
575
  const parsedValue = Number(value);
@@ -575,7 +580,7 @@ function mapValue(value, columnName, resultType, enums) {
575
580
  }
576
581
  throw new DataMapperError(`Expected a float in column '${columnName}', got ${typeof value}: ${value}`);
577
582
  }
578
- case "Boolean": {
583
+ case "boolean": {
579
584
  if (typeof value === "boolean") return value;
580
585
  if (typeof value === "number") return value === 1;
581
586
  if (typeof value === "string") {
@@ -587,7 +592,7 @@ function mapValue(value, columnName, resultType, enums) {
587
592
  throw new DataMapperError(`Expected a boolean in column '${columnName}', got ${typeof value}: ${value}`);
588
593
  }
589
594
  }
590
- if (value instanceof Uint8Array) {
595
+ if (Array.isArray(value)) {
591
596
  for (const byte of value) {
592
597
  if (byte !== 0) return true;
593
598
  }
@@ -595,37 +600,27 @@ function mapValue(value, columnName, resultType, enums) {
595
600
  }
596
601
  throw new DataMapperError(`Expected a boolean in column '${columnName}', got ${typeof value}: ${value}`);
597
602
  }
598
- case "Decimal":
603
+ case "decimal":
599
604
  if (typeof value !== "number" && typeof value !== "string" && !import_decimal3.default.isDecimal(value)) {
600
605
  throw new DataMapperError(`Expected a decimal in column '${columnName}', got ${typeof value}: ${value}`);
601
606
  }
602
607
  return { $type: "Decimal", value };
603
- case "Date": {
608
+ case "datetime": {
604
609
  if (typeof value === "string") {
605
- return { $type: "DateTime", value: ensureTimezoneInIsoString(value) };
610
+ return { $type: "DateTime", value: normalizeDateTime(value) };
606
611
  }
607
612
  if (typeof value === "number" || value instanceof Date) {
608
613
  return { $type: "DateTime", value };
609
614
  }
610
615
  throw new DataMapperError(`Expected a date in column '${columnName}', got ${typeof value}: ${value}`);
611
616
  }
612
- case "Time": {
613
- if (typeof value === "string") {
614
- return { $type: "DateTime", value: `1970-01-01T${ensureTimezoneInIsoString(value)}` };
615
- }
616
- throw new DataMapperError(`Expected a time in column '${columnName}', got ${typeof value}: ${value}`);
617
- }
618
- case "Array": {
619
- const values = value;
620
- return values.map((v, i) => mapValue(v, `${columnName}[${i}]`, resultType.inner, enums));
621
- }
622
- case "Object": {
617
+ case "object": {
623
618
  return { $type: "Json", value: safeJsonStringify(value) };
624
619
  }
625
- case "Json": {
620
+ case "json": {
626
621
  return { $type: "Json", value: `${value}` };
627
622
  }
628
- case "Bytes": {
623
+ case "bytes": {
629
624
  if (typeof value === "string" && value.startsWith("\\x")) {
630
625
  return { $type: "Bytes", value: Buffer.from(value.slice(2), "hex").toString("base64") };
631
626
  }
@@ -637,31 +632,38 @@ function mapValue(value, columnName, resultType, enums) {
637
632
  }
638
633
  throw new DataMapperError(`Expected a byte array in column '${columnName}', got ${typeof value}: ${value}`);
639
634
  }
640
- case "Enum": {
641
- const enumDef = enums[resultType.inner];
635
+ case "enum": {
636
+ const enumDef = enums[scalarType.name];
642
637
  if (enumDef === void 0) {
643
- throw new DataMapperError(`Unknown enum '${resultType.inner}'`);
638
+ throw new DataMapperError(`Unknown enum '${scalarType.name}'`);
644
639
  }
645
640
  const enumValue = enumDef[`${value}`];
646
641
  if (enumValue === void 0) {
647
- throw new DataMapperError(`Value '${value}' not found in enum '${resultType.inner}'`);
642
+ throw new DataMapperError(`Value '${value}' not found in enum '${scalarType.name}'`);
648
643
  }
649
644
  return enumValue;
650
645
  }
651
646
  default:
652
- assertNever(resultType, `DataMapper: Unknown result type: ${resultType.type}`);
647
+ assertNever(scalarType, `DataMapper: Unknown result type: ${scalarType["type"]}`);
653
648
  }
654
649
  }
655
- var TIMEZONE_PATTERN = /Z$|(?<!\d{4}-\d{2})[+-]\d{2}(:?\d{2})?$/;
656
- function ensureTimezoneInIsoString(dt) {
657
- const results = TIMEZONE_PATTERN.exec(dt);
658
- if (results === null) {
650
+ var TIME_TZ_PATTERN = /\d{2}:\d{2}:\d{2}(?:\.\d+)?(Z|[+-]\d{2}(:?\d{2})?)?$/;
651
+ function normalizeDateTime(dt) {
652
+ const matches = TIME_TZ_PATTERN.exec(dt);
653
+ if (matches === null) {
659
654
  return `${dt}Z`;
660
- } else if (results[0] !== "Z" && results[1] === void 0) {
661
- return `${dt}:00`;
662
- } else {
663
- return dt;
664
655
  }
656
+ let dtWithTz = dt;
657
+ const [timeTz, tz, tzMinuteOffset] = matches;
658
+ if (tz !== void 0 && tz !== "Z" && tzMinuteOffset === void 0) {
659
+ dtWithTz = `${dt}:00`;
660
+ } else if (tz === void 0) {
661
+ dtWithTz = `${dt}Z`;
662
+ }
663
+ if (timeTz.length === dt.length) {
664
+ return `1970-01-01T${dtWithTz}`;
665
+ }
666
+ return dtWithTz;
665
667
  }
666
668
 
667
669
  // src/tracing.ts
@@ -740,10 +742,10 @@ var GeneratorRegistry = class {
740
742
  * method being called, meaning that the built-in time-based generators will always return
741
743
  * the same value on repeated calls as long as the same snapshot is used.
742
744
  */
743
- snapshot(provider) {
745
+ snapshot() {
744
746
  return Object.create(this.#generators, {
745
747
  now: {
746
- value: provider === "mysql" ? new MysqlNowGenerator() : new NowGenerator()
748
+ value: new NowGenerator()
747
749
  }
748
750
  });
749
751
  }
@@ -760,12 +762,6 @@ var NowGenerator = class {
760
762
  return this.#now.toISOString();
761
763
  }
762
764
  };
763
- var MysqlNowGenerator = class {
764
- #now = /* @__PURE__ */ new Date();
765
- generate() {
766
- return this.#now.toISOString().replace("T", " ").replace("Z", "");
767
- }
768
- };
769
765
  var UuidGenerator = class {
770
766
  generate(arg) {
771
767
  if (arg === 4) {
@@ -919,74 +915,82 @@ function isPrismaValuePlaceholder(value) {
919
915
  function isPrismaValueGenerator(value) {
920
916
  return typeof value === "object" && value !== null && value["prisma__type"] === "generatorCall";
921
917
  }
922
- function isPrismaValueBytes(value) {
923
- return typeof value === "object" && value !== null && value["prisma__type"] === "bytes";
924
- }
925
- function isPrismaValueBigInt(value) {
926
- return typeof value === "object" && value !== null && value["prisma__type"] === "bigint";
927
- }
928
918
 
929
919
  // src/interpreter/render-query.ts
930
920
  function renderQuery(dbQuery, scope, generators, maxChunkSize) {
931
- const queryType = dbQuery.type;
932
- const params = evaluateParams(dbQuery.params, scope, generators);
933
- switch (queryType) {
921
+ const args = dbQuery.args.map((arg) => evaluateArg(arg, scope, generators));
922
+ switch (dbQuery.type) {
934
923
  case "rawSql":
935
- return [renderRawSql(dbQuery.sql, evaluateParams(dbQuery.params, scope, generators))];
924
+ return [renderRawSql(dbQuery.sql, args, dbQuery.argTypes)];
936
925
  case "templateSql": {
937
- const chunks = dbQuery.chunkable ? chunkParams(dbQuery.fragments, params, maxChunkSize) : [params];
938
- return chunks.map((params2) => {
939
- if (maxChunkSize !== void 0 && params2.length > maxChunkSize) {
926
+ const chunks = dbQuery.chunkable ? chunkParams(dbQuery.fragments, args, maxChunkSize) : [args];
927
+ return chunks.map((params) => {
928
+ if (maxChunkSize !== void 0 && params.length > maxChunkSize) {
940
929
  throw new UserFacingError("The query parameter limit supported by your database is exceeded.", "P2029");
941
930
  }
942
- return renderTemplateSql(dbQuery.fragments, dbQuery.placeholderFormat, params2);
931
+ return renderTemplateSql(dbQuery.fragments, dbQuery.placeholderFormat, params, dbQuery.argTypes);
943
932
  });
944
933
  }
945
934
  default:
946
- assertNever(queryType, `Invalid query type`);
935
+ assertNever(dbQuery["type"], `Invalid query type`);
947
936
  }
948
937
  }
949
- function evaluateParams(params, scope, generators) {
950
- return params.map((param) => evaluateParam(param, scope, generators));
951
- }
952
- function evaluateParam(param, scope, generators) {
953
- let value = param;
954
- while (doesRequireEvaluation(value)) {
955
- if (isPrismaValuePlaceholder(value)) {
956
- const found = scope[value.prisma__value.name];
938
+ function evaluateArg(arg, scope, generators) {
939
+ while (doesRequireEvaluation(arg)) {
940
+ if (isPrismaValuePlaceholder(arg)) {
941
+ const found = scope[arg.prisma__value.name];
957
942
  if (found === void 0) {
958
- throw new Error(`Missing value for query variable ${value.prisma__value.name}`);
943
+ throw new Error(`Missing value for query variable ${arg.prisma__value.name}`);
959
944
  }
960
- value = found;
961
- } else if (isPrismaValueGenerator(value)) {
962
- const { name, args } = value.prisma__value;
945
+ arg = found;
946
+ } else if (isPrismaValueGenerator(arg)) {
947
+ const { name, args } = arg.prisma__value;
963
948
  const generator = generators[name];
964
949
  if (!generator) {
965
950
  throw new Error(`Encountered an unknown generator '${name}'`);
966
951
  }
967
- value = generator.generate(...args.map((arg) => evaluateParam(arg, scope, generators)));
952
+ arg = generator.generate(...args.map((arg2) => evaluateArg(arg2, scope, generators)));
968
953
  } else {
969
- assertNever(value, `Unexpected unevaluated value type: ${value}`);
954
+ assertNever(arg, `Unexpected unevaluated value type: ${arg}`);
970
955
  }
971
956
  }
972
- if (Array.isArray(value)) {
973
- value = value.map((el) => evaluateParam(el, scope, generators));
974
- } else if (isPrismaValueBytes(value)) {
975
- value = Buffer.from(value.prisma__value, "base64");
976
- } else if (isPrismaValueBigInt(value)) {
977
- value = BigInt(value.prisma__value);
957
+ if (Array.isArray(arg)) {
958
+ arg = arg.map((el) => evaluateArg(el, scope, generators));
978
959
  }
979
- return value;
960
+ return arg;
980
961
  }
981
- function renderTemplateSql(fragments, placeholderFormat, params) {
962
+ function renderTemplateSql(fragments, placeholderFormat, params, argTypes) {
982
963
  let sql = "";
983
964
  const ctx = { placeholderNumber: 1 };
984
965
  const flattenedParams = [];
985
- for (const fragment of pairFragmentsWithParams(fragments, params)) {
986
- flattenedParams.push(...flattenedFragmentParams(fragment));
966
+ const flattenedArgTypes = [];
967
+ for (const fragment of pairFragmentsWithParams(fragments, params, argTypes)) {
987
968
  sql += renderFragment(fragment, placeholderFormat, ctx);
969
+ if (fragment.type === "stringChunk") {
970
+ continue;
971
+ }
972
+ const length = flattenedParams.length;
973
+ const added = flattenedParams.push(...flattenedFragmentParams(fragment)) - length;
974
+ if (fragment.argType.arity === "tuple") {
975
+ if (added % fragment.argType.elements.length !== 0) {
976
+ throw new Error(
977
+ `Malformed query template. Expected the number of parameters to match the tuple arity, but got ${added} parameters for a tuple of arity ${fragment.argType.elements.length}.`
978
+ );
979
+ }
980
+ for (let i = 0; i < added / fragment.argType.elements.length; i++) {
981
+ flattenedArgTypes.push(...fragment.argType.elements);
982
+ }
983
+ } else {
984
+ for (let i = 0; i < added; i++) {
985
+ flattenedArgTypes.push(fragment.argType);
986
+ }
987
+ }
988
988
  }
989
- return renderRawSql(sql, flattenedParams);
989
+ return {
990
+ sql,
991
+ args: flattenedParams,
992
+ argTypes: flattenedArgTypes
993
+ };
990
994
  }
991
995
  function renderFragment(fragment, placeholderFormat, ctx) {
992
996
  const fragmentType = fragment.type;
@@ -1012,36 +1016,17 @@ function renderFragment(fragment, placeholderFormat, ctx) {
1012
1016
  function formatPlaceholder(placeholderFormat, placeholderNumber) {
1013
1017
  return placeholderFormat.hasNumbering ? `${placeholderFormat.prefix}${placeholderNumber}` : placeholderFormat.prefix;
1014
1018
  }
1015
- function renderRawSql(sql, params) {
1016
- const argTypes = params.map((param) => toArgType(param));
1019
+ function renderRawSql(sql, args, argTypes) {
1017
1020
  return {
1018
1021
  sql,
1019
- args: params,
1022
+ args,
1020
1023
  argTypes
1021
1024
  };
1022
1025
  }
1023
- function toArgType(value) {
1024
- if (typeof value === "string") {
1025
- return "Text";
1026
- }
1027
- if (typeof value === "number") {
1028
- return "Numeric";
1029
- }
1030
- if (typeof value === "boolean") {
1031
- return "Boolean";
1032
- }
1033
- if (Array.isArray(value)) {
1034
- return "Array";
1035
- }
1036
- if (Buffer.isBuffer(value)) {
1037
- return "Bytes";
1038
- }
1039
- return "Unknown";
1040
- }
1041
1026
  function doesRequireEvaluation(param) {
1042
1027
  return isPrismaValuePlaceholder(param) || isPrismaValueGenerator(param);
1043
1028
  }
1044
- function* pairFragmentsWithParams(fragments, params) {
1029
+ function* pairFragmentsWithParams(fragments, params, argTypes) {
1045
1030
  let index = 0;
1046
1031
  for (const fragment of fragments) {
1047
1032
  switch (fragment.type) {
@@ -1049,7 +1034,8 @@ function* pairFragmentsWithParams(fragments, params) {
1049
1034
  if (index >= params.length) {
1050
1035
  throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
1051
1036
  }
1052
- yield { ...fragment, value: params[index++] };
1037
+ yield { ...fragment, value: params[index], argType: argTypes?.[index] };
1038
+ index++;
1053
1039
  break;
1054
1040
  }
1055
1041
  case "stringChunk": {
@@ -1060,15 +1046,16 @@ function* pairFragmentsWithParams(fragments, params) {
1060
1046
  if (index >= params.length) {
1061
1047
  throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
1062
1048
  }
1063
- const value = params[index++];
1064
- yield { ...fragment, value: Array.isArray(value) ? value : [value] };
1049
+ const value = params[index];
1050
+ yield { ...fragment, value: Array.isArray(value) ? value : [value], argType: argTypes?.[index] };
1051
+ index++;
1065
1052
  break;
1066
1053
  }
1067
1054
  case "parameterTupleList": {
1068
1055
  if (index >= params.length) {
1069
1056
  throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
1070
1057
  }
1071
- const value = params[index++];
1058
+ const value = params[index];
1072
1059
  if (!Array.isArray(value)) {
1073
1060
  throw new Error(`Malformed query template. Tuple list expected.`);
1074
1061
  }
@@ -1080,7 +1067,8 @@ function* pairFragmentsWithParams(fragments, params) {
1080
1067
  throw new Error(`Malformed query template. Tuple expected.`);
1081
1068
  }
1082
1069
  }
1083
- yield { ...fragment, value };
1070
+ yield { ...fragment, value, argType: argTypes?.[index] };
1071
+ index++;
1084
1072
  break;
1085
1073
  }
1086
1074
  }
@@ -1106,7 +1094,7 @@ function* flattenedFragmentParams(fragment) {
1106
1094
  function chunkParams(fragments, params, maxChunkSize) {
1107
1095
  let totalParamCount = 0;
1108
1096
  let maxParamsPerFragment = 0;
1109
- for (const fragment of pairFragmentsWithParams(fragments, params)) {
1097
+ for (const fragment of pairFragmentsWithParams(fragments, params, void 0)) {
1110
1098
  let paramSize = 0;
1111
1099
  for (const _ of flattenedFragmentParams(fragment)) {
1112
1100
  void _;
@@ -1116,7 +1104,7 @@ function chunkParams(fragments, params, maxChunkSize) {
1116
1104
  totalParamCount += paramSize;
1117
1105
  }
1118
1106
  let chunkedParams = [[]];
1119
- for (const fragment of pairFragmentsWithParams(fragments, params)) {
1107
+ for (const fragment of pairFragmentsWithParams(fragments, params, void 0)) {
1120
1108
  switch (fragment.type) {
1121
1109
  case "parameter": {
1122
1110
  for (const params2 of chunkedParams) {
@@ -1182,16 +1170,8 @@ function chunkArray(array, chunkSize) {
1182
1170
  // src/interpreter/serialize-sql.ts
1183
1171
  var import_driver_adapter_utils2 = require("@prisma/driver-adapter-utils");
1184
1172
  function serializeSql(resultSet) {
1185
- const mappers = resultSet.columnTypes.map((type) => {
1186
- switch (type) {
1187
- case import_driver_adapter_utils2.ColumnTypeEnum.Bytes:
1188
- return (value) => Array.isArray(value) ? new Uint8Array(value) : value;
1189
- default:
1190
- return (value) => value;
1191
- }
1192
- });
1193
1173
  return resultSet.rows.map(
1194
- (row) => row.map((value, index) => mappers[index](value)).reduce((acc, value, index) => {
1174
+ (row) => row.reduce((acc, value, index) => {
1195
1175
  const splitByDot = resultSet.columnNames[index].split(".");
1196
1176
  let nested = acc;
1197
1177
  for (let i = 0; i < splitByDot.length; i++) {
@@ -1485,14 +1465,14 @@ var QueryInterpreter = class _QueryInterpreter {
1485
1465
  queryPlan,
1486
1466
  queryable,
1487
1467
  this.#placeholderValues,
1488
- this.#generators.snapshot(queryable.provider)
1468
+ this.#generators.snapshot()
1489
1469
  ).catch((e) => rethrowAsUserFacing(e));
1490
1470
  return value;
1491
1471
  }
1492
1472
  async interpretNode(node, queryable, scope, generators) {
1493
1473
  switch (node.type) {
1494
1474
  case "value": {
1495
- return { value: evaluateParam(node.args, scope, generators) };
1475
+ return { value: evaluateArg(node.args, scope, generators) };
1496
1476
  }
1497
1477
  case "seq": {
1498
1478
  let result;
@@ -1597,7 +1577,7 @@ var QueryInterpreter = class _QueryInterpreter {
1597
1577
  }
1598
1578
  case "mapField": {
1599
1579
  const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
1600
- return { value: mapField(value, node.args.field), lastInsertId };
1580
+ return { value: mapField2(value, node.args.field), lastInsertId };
1601
1581
  }
1602
1582
  case "join": {
1603
1583
  const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
@@ -1618,7 +1598,7 @@ var QueryInterpreter = class _QueryInterpreter {
1618
1598
  }
1619
1599
  const transactionManager = this.#transactionManager.manager;
1620
1600
  const transactionInfo = await transactionManager.startTransaction();
1621
- const transaction = transactionManager.getTransaction(transactionInfo, "query");
1601
+ const transaction = await transactionManager.getTransaction(transactionInfo, "query");
1622
1602
  try {
1623
1603
  const value = await this.interpretNode(node.args, transaction, scope, generators);
1624
1604
  await transactionManager.commitTransaction(transactionInfo.id);
@@ -1740,9 +1720,9 @@ function asRecord(value) {
1740
1720
  }
1741
1721
  throw new Error(`Expected object, got ${typeof value}`);
1742
1722
  }
1743
- function mapField(value, field) {
1723
+ function mapField2(value, field) {
1744
1724
  if (Array.isArray(value)) {
1745
- return value.map((element) => mapField(element, field));
1725
+ return value.map((element) => mapField2(element, field));
1746
1726
  }
1747
1727
  if (typeof value === "object" && value !== null) {
1748
1728
  return value[field] ?? null;
@@ -1786,7 +1766,7 @@ function attachChildrenToParents(parentRecords, children) {
1786
1766
  function evalFieldInitializer(initializer, lastInsertId, scope, generators) {
1787
1767
  switch (initializer.type) {
1788
1768
  case "value":
1789
- return evaluateParam(initializer.value, scope, generators);
1769
+ return evaluateArg(initializer.value, scope, generators);
1790
1770
  case "lastInsertId":
1791
1771
  return lastInsertId;
1792
1772
  default:
@@ -1796,16 +1776,16 @@ function evalFieldInitializer(initializer, lastInsertId, scope, generators) {
1796
1776
  function evalFieldOperation(op, value, scope, generators) {
1797
1777
  switch (op.type) {
1798
1778
  case "set":
1799
- return evaluateParam(op.value, scope, generators);
1779
+ return evaluateArg(op.value, scope, generators);
1800
1780
  case "add":
1801
- return asNumber2(value) + asNumber2(evaluateParam(op.value, scope, generators));
1781
+ return asNumber2(value) + asNumber2(evaluateArg(op.value, scope, generators));
1802
1782
  case "subtract":
1803
- return asNumber2(value) - asNumber2(evaluateParam(op.value, scope, generators));
1783
+ return asNumber2(value) - asNumber2(evaluateArg(op.value, scope, generators));
1804
1784
  case "multiply":
1805
- return asNumber2(value) * asNumber2(evaluateParam(op.value, scope, generators));
1785
+ return asNumber2(value) * asNumber2(evaluateArg(op.value, scope, generators));
1806
1786
  case "divide": {
1807
1787
  const lhs = asNumber2(value);
1808
- const rhs = asNumber2(evaluateParam(op.value, scope, generators));
1788
+ const rhs = asNumber2(evaluateArg(op.value, scope, generators));
1809
1789
  if (rhs === 0) {
1810
1790
  return null;
1811
1791
  }
@@ -1876,11 +1856,6 @@ var TransactionClosedError = class extends TransactionManagerError {
1876
1856
  super(`Transaction already closed: A ${operation} cannot be executed on a committed transaction.`);
1877
1857
  }
1878
1858
  };
1879
- var TransactionClosingError = class extends TransactionManagerError {
1880
- constructor(operation) {
1881
- super(`Transaction is being closed: A ${operation} cannot be executed on a closing transaction.`);
1882
- }
1883
- };
1884
1859
  var TransactionRolledBackError = class extends TransactionManagerError {
1885
1860
  constructor(operation) {
1886
1861
  super(`Transaction already closed: A ${operation} cannot be executed on a transaction that was rolled back.`);
@@ -1953,7 +1928,7 @@ var TransactionManager = class {
1953
1928
  return await this.tracingHelper.runInChildSpan("start_transaction", () => this.#startTransactionImpl(options));
1954
1929
  }
1955
1930
  async #startTransactionImpl(options) {
1956
- const validatedOptions = options !== void 0 ? this.validateOptions(options) : this.transactionOptions;
1931
+ const validatedOptions = options !== void 0 ? this.#validateOptions(options) : this.transactionOptions;
1957
1932
  const transaction = {
1958
1933
  id: await randomUUID(),
1959
1934
  status: "waiting",
@@ -1970,13 +1945,12 @@ var TransactionManager = class {
1970
1945
  switch (transaction.status) {
1971
1946
  case "waiting":
1972
1947
  if (hasTimedOut) {
1973
- await this.closeTransaction(transaction, "timed_out");
1948
+ await this.#closeTransaction(transaction, "timed_out");
1974
1949
  throw new TransactionStartTimeoutError();
1975
1950
  }
1976
1951
  transaction.status = "running";
1977
- transaction.timer = this.startTransactionTimeout(transaction.id, validatedOptions.timeout);
1952
+ transaction.timer = this.#startTransactionTimeout(transaction.id, validatedOptions.timeout);
1978
1953
  return { id: transaction.id };
1979
- case "closing":
1980
1954
  case "timed_out":
1981
1955
  case "running":
1982
1956
  case "committed":
@@ -1985,27 +1959,31 @@ var TransactionManager = class {
1985
1959
  `Transaction in invalid state ${transaction.status} although it just finished startup.`
1986
1960
  );
1987
1961
  default:
1988
- assertNever(transaction.status, "Unknown transaction status.");
1962
+ assertNever(transaction["status"], "Unknown transaction status.");
1989
1963
  }
1990
1964
  }
1991
1965
  async commitTransaction(transactionId) {
1992
1966
  return await this.tracingHelper.runInChildSpan("commit_transaction", async () => {
1993
- const txw = this.getActiveTransaction(transactionId, "commit");
1994
- await this.closeTransaction(txw, "committed");
1967
+ const txw = this.#getActiveOrClosingTransaction(transactionId, "commit");
1968
+ await this.#closeTransaction(txw, "committed");
1995
1969
  });
1996
1970
  }
1997
1971
  async rollbackTransaction(transactionId) {
1998
1972
  return await this.tracingHelper.runInChildSpan("rollback_transaction", async () => {
1999
- const txw = this.getActiveTransaction(transactionId, "rollback");
2000
- await this.closeTransaction(txw, "rolled_back");
1973
+ const txw = this.#getActiveOrClosingTransaction(transactionId, "rollback");
1974
+ await this.#closeTransaction(txw, "rolled_back");
2001
1975
  });
2002
1976
  }
2003
- getTransaction(txInfo, operation) {
2004
- const tx = this.getActiveTransaction(txInfo.id, operation);
1977
+ async getTransaction(txInfo, operation) {
1978
+ let tx = this.#getActiveOrClosingTransaction(txInfo.id, operation);
1979
+ if (tx.status === "closing") {
1980
+ await tx.closing;
1981
+ tx = this.#getActiveOrClosingTransaction(txInfo.id, operation);
1982
+ }
2005
1983
  if (!tx.transaction) throw new TransactionNotFoundError();
2006
1984
  return tx.transaction;
2007
1985
  }
2008
- getActiveTransaction(transactionId, operation) {
1986
+ #getActiveOrClosingTransaction(transactionId, operation) {
2009
1987
  const transaction = this.transactions.get(transactionId);
2010
1988
  if (!transaction) {
2011
1989
  const closedTransaction = this.closedTransactions.find((tx) => tx.id === transactionId);
@@ -2031,62 +2009,74 @@ var TransactionManager = class {
2031
2009
  throw new TransactionNotFoundError();
2032
2010
  }
2033
2011
  }
2034
- if (transaction.status === "closing") {
2035
- throw new TransactionClosingError(operation);
2036
- }
2037
2012
  if (["committed", "rolled_back", "timed_out"].includes(transaction.status)) {
2038
2013
  throw new TransactionInternalConsistencyError("Closed transaction found in active transactions map.");
2039
2014
  }
2040
2015
  return transaction;
2041
2016
  }
2042
2017
  async cancelAllTransactions() {
2043
- await Promise.allSettled([...this.transactions.values()].map((tx) => this.closeTransaction(tx, "rolled_back")));
2018
+ await Promise.allSettled([...this.transactions.values()].map((tx) => this.#closeTransaction(tx, "rolled_back")));
2044
2019
  }
2045
- startTransactionTimeout(transactionId, timeout) {
2020
+ #startTransactionTimeout(transactionId, timeout) {
2046
2021
  const timeoutStartedAt = Date.now();
2047
2022
  return setTimeout(async () => {
2048
2023
  debug("Transaction timed out.", { transactionId, timeoutStartedAt, timeout });
2049
2024
  const tx = this.transactions.get(transactionId);
2050
2025
  if (tx && ["running", "waiting"].includes(tx.status)) {
2051
- await this.closeTransaction(tx, "timed_out");
2026
+ await this.#closeTransaction(tx, "timed_out");
2052
2027
  } else {
2053
2028
  debug("Transaction already committed or rolled back when timeout happened.", transactionId);
2054
2029
  }
2055
2030
  }, timeout);
2056
2031
  }
2057
- async closeTransaction(tx, status) {
2058
- debug("Closing transaction.", { transactionId: tx.id, status });
2059
- tx.status = "closing";
2060
- try {
2061
- if (tx.transaction && status === "committed") {
2062
- if (tx.transaction.options.usePhantomQuery) {
2063
- await this.#withQuerySpanAndEvent(PHANTOM_COMMIT_QUERY(), tx.transaction, () => tx.transaction.commit());
2064
- } else {
2065
- const query = COMMIT_QUERY();
2066
- await this.#withQuerySpanAndEvent(query, tx.transaction, () => tx.transaction.executeRaw(query));
2067
- await tx.transaction.commit();
2032
+ async #closeTransaction(tx, status) {
2033
+ const createClosingPromise = async () => {
2034
+ debug("Closing transaction.", { transactionId: tx.id, status });
2035
+ try {
2036
+ if (tx.transaction && status === "committed") {
2037
+ if (tx.transaction.options.usePhantomQuery) {
2038
+ await this.#withQuerySpanAndEvent(PHANTOM_COMMIT_QUERY(), tx.transaction, () => tx.transaction.commit());
2039
+ } else {
2040
+ const query = COMMIT_QUERY();
2041
+ await this.#withQuerySpanAndEvent(query, tx.transaction, () => tx.transaction.executeRaw(query));
2042
+ await tx.transaction.commit();
2043
+ }
2044
+ } else if (tx.transaction) {
2045
+ if (tx.transaction.options.usePhantomQuery) {
2046
+ await this.#withQuerySpanAndEvent(
2047
+ PHANTOM_ROLLBACK_QUERY(),
2048
+ tx.transaction,
2049
+ () => tx.transaction.rollback()
2050
+ );
2051
+ } else {
2052
+ const query = ROLLBACK_QUERY();
2053
+ await this.#withQuerySpanAndEvent(query, tx.transaction, () => tx.transaction.executeRaw(query));
2054
+ await tx.transaction.rollback();
2055
+ }
2068
2056
  }
2069
- } else if (tx.transaction) {
2070
- if (tx.transaction.options.usePhantomQuery) {
2071
- await this.#withQuerySpanAndEvent(PHANTOM_ROLLBACK_QUERY(), tx.transaction, () => tx.transaction.rollback());
2072
- } else {
2073
- const query = ROLLBACK_QUERY();
2074
- await this.#withQuerySpanAndEvent(query, tx.transaction, () => tx.transaction.executeRaw(query));
2075
- await tx.transaction.rollback();
2057
+ } finally {
2058
+ tx.status = status;
2059
+ clearTimeout(tx.timer);
2060
+ tx.timer = void 0;
2061
+ this.transactions.delete(tx.id);
2062
+ this.closedTransactions.push(tx);
2063
+ if (this.closedTransactions.length > MAX_CLOSED_TRANSACTIONS) {
2064
+ this.closedTransactions.shift();
2076
2065
  }
2077
2066
  }
2078
- } finally {
2079
- tx.status = status;
2080
- clearTimeout(tx.timer);
2081
- tx.timer = void 0;
2082
- this.transactions.delete(tx.id);
2083
- this.closedTransactions.push(tx);
2084
- if (this.closedTransactions.length > MAX_CLOSED_TRANSACTIONS) {
2085
- this.closedTransactions.shift();
2086
- }
2067
+ };
2068
+ if (tx.status === "closing") {
2069
+ await tx.closing;
2070
+ this.#getActiveOrClosingTransaction(tx.id, status === "committed" ? "commit" : "rollback");
2071
+ } else {
2072
+ await Object.assign(tx, {
2073
+ status: "closing",
2074
+ reason: status,
2075
+ closing: createClosingPromise()
2076
+ }).closing;
2087
2077
  }
2088
2078
  }
2089
- validateOptions(options) {
2079
+ #validateOptions(options) {
2090
2080
  if (!options.timeout) throw new TransactionManagerError("timeout is required");
2091
2081
  if (!options.maxWait) throw new TransactionManagerError("maxWait is required");
2092
2082
  if (options.isolationLevel === "SNAPSHOT") throw new InvalidTransactionIsolationLevelError(options.isolationLevel);
@@ -2117,8 +2107,6 @@ var TransactionManager = class {
2117
2107
  deserializeJsonResponse,
2118
2108
  doKeysMatch,
2119
2109
  isDeepStrictEqual,
2120
- isPrismaValueBigInt,
2121
- isPrismaValueBytes,
2122
2110
  isPrismaValueGenerator,
2123
2111
  isPrismaValuePlaceholder,
2124
2112
  noopTracingHelper,