@prisma/orm-family-sql 8.0.0-rc.16-dev.2 → 8.0.0-rc.16-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.
Files changed (45) hide show
  1. package/dist/{ast-DFvrXEbF.mjs → ast-B_UPqRyb.mjs} +29 -2
  2. package/dist/ast-B_UPqRyb.mjs.map +1 -0
  3. package/dist/{ast-fsQdXFSV.d.mts → ast-Bf6J9_ra.d.mts} +83 -3
  4. package/dist/ast-Bf6J9_ra.d.mts.map +1 -0
  5. package/dist/builder.d.mts +1 -1
  6. package/dist/builder__runtime.d.mts +2 -2
  7. package/dist/builder__runtime.mjs +17 -16
  8. package/dist/builder__runtime.mjs.map +1 -1
  9. package/dist/builder__types.d.mts +1 -1
  10. package/dist/{control-Bi2JsNep.d.mts → control-DCt08EpW.d.mts} +4 -4
  11. package/dist/{control-Bi2JsNep.d.mts.map → control-DCt08EpW.d.mts.map} +1 -1
  12. package/dist/control-adapter-CD_gz6TI.d.mts +1 -0
  13. package/dist/{control-adapter-CkFfBVei-gLS9b87G.d.mts → control-adapter-CkFfBVei-Ba9JNrCN.d.mts} +2 -2
  14. package/dist/{control-adapter-CkFfBVei-gLS9b87G.d.mts.map → control-adapter-CkFfBVei-Ba9JNrCN.d.mts.map} +1 -1
  15. package/dist/{db-CJxU3aL_-CM2IReAK.d.mts → db-D7R5zKiH-SEM04lcK.d.mts} +9 -47
  16. package/dist/{db-CJxU3aL_-CM2IReAK.d.mts.map → db-D7R5zKiH-SEM04lcK.d.mts.map} +1 -1
  17. package/dist/{diff-Bg9o9CgK.d.mts → diff-3tfqwWS7.d.mts} +3 -3
  18. package/dist/{diff-Bg9o9CgK.d.mts.map → diff-3tfqwWS7.d.mts.map} +1 -1
  19. package/dist/family.d.mts +6 -6
  20. package/dist/family__control-adapter.d.mts +2 -2
  21. package/dist/family__control.d.mts +2 -2
  22. package/dist/family__diff.d.mts +2 -2
  23. package/dist/family__migration.d.mts +1 -1
  24. package/dist/{index-Z2FIIMxv.d.mts → index-DYjWQAcJ.d.mts} +3 -3
  25. package/dist/{index-Z2FIIMxv.d.mts.map → index-DYjWQAcJ.d.mts.map} +1 -1
  26. package/dist/{migration-o-g1rSb-.d.mts → migration-D6NJlA6-.d.mts} +2 -2
  27. package/dist/{migration-o-g1rSb-.d.mts.map → migration-D6NJlA6-.d.mts.map} +1 -1
  28. package/dist/orm-client.d.mts +34 -4
  29. package/dist/orm-client.d.mts.map +1 -1
  30. package/dist/orm-client.mjs +97 -2
  31. package/dist/orm-client.mjs.map +1 -1
  32. package/dist/{prepared-statement-YtgdlN7e-BU4UQxB5.d.mts → prepared-statement-YtgdlN7e-DBJtJAm7.d.mts} +2 -2
  33. package/dist/{prepared-statement-YtgdlN7e-BU4UQxB5.d.mts.map → prepared-statement-YtgdlN7e-DBJtJAm7.d.mts.map} +1 -1
  34. package/dist/relational-core.d.mts +2 -2
  35. package/dist/relational-core.mjs +2 -2
  36. package/dist/relational-core__ast.d.mts +2 -2
  37. package/dist/relational-core__ast.mjs +2 -2
  38. package/dist/runtime.d.mts +3 -3
  39. package/dist/runtime__internal__prepared-query.d.mts +1 -1
  40. package/dist/{types-CvuS68sy-Dip2oI3M.d.mts → types-CvuS68sy-ReNXbgpE.d.mts} +2 -2
  41. package/dist/{types-CvuS68sy-Dip2oI3M.d.mts.map → types-CvuS68sy-ReNXbgpE.d.mts.map} +1 -1
  42. package/package.json +18 -18
  43. package/dist/ast-DFvrXEbF.mjs.map +0 -1
  44. package/dist/ast-fsQdXFSV.d.mts.map +0 -1
  45. package/dist/control-adapter-Ciule8Fh.d.mts +0 -1
@@ -1,8 +1,8 @@
1
1
  import { t as resolveStorageTable } from "./resolve-storage-table-DZsfnzeW.mjs";
2
2
  import { i as isUniqueConstraintViolation } from "./dist-x6jvtkKM.mjs";
3
- import { A as ParamRef, C as LiteralExpr, E as NullCheckExpr, F as SelectAst, G as isOrderByNulls, I as SubqueryExpr, L as TableSource, M as ProjectionItem, O as OrExpr, R as UpdateAst, S as ListExpression, T as NotExpr, U as isAggregateFn, V as checkLimitOffset, W as isOrderByDirection, _ as InsertAst, b as JsonArrayAggExpr, c as DeleteAst, f as EqColJoinOn, k as OrderByItem, l as DerivedTableSource, n as AndExpr, o as ColumnRef, p as ExistsExpr, q as isWhereExpr, r as BinaryExpr, s as DefaultValueExpr, t as AggregateExpr, v as InsertOnConflict, x as JsonObjectExpr, y as JoinAst, z as WindowFuncExpr } from "./types-NTQsD2MS-DAP2yVDn.mjs";
3
+ import { A as ParamRef, C as LiteralExpr, E as NullCheckExpr, F as SelectAst, G as isOrderByNulls, I as SubqueryExpr, L as TableSource, M as ProjectionItem, O as OrExpr, R as UpdateAst, S as ListExpression, T as NotExpr, U as isAggregateFn, V as checkLimitOffset, W as isOrderByDirection, _ as InsertAst, b as JsonArrayAggExpr, c as DeleteAst, f as EqColJoinOn, k as OrderByItem, l as DerivedTableSource, n as AndExpr, o as ColumnRef, p as ExistsExpr, q as isWhereExpr, r as BinaryExpr, s as DefaultValueExpr, t as AggregateExpr, v as InsertOnConflict, w as LockingClause, x as JsonObjectExpr, y as JoinAst, z as WindowFuncExpr } from "./types-NTQsD2MS-DAP2yVDn.mjs";
4
4
  import { t as collectOrderedParamRefs } from "./util-BBgcP3gI-XJBkxo1K.mjs";
5
- import { n as JsonDocumentProjection, r as NativeJsonValueProjection, t as CodecJsonValueProjection } from "./ast-DFvrXEbF.mjs";
5
+ import { C as lockStrengthCapabilities, S as lockOptionCapabilities, T as missingCapability, n as JsonDocumentProjection, r as NativeJsonValueProjection, t as CodecJsonValueProjection, w as lockWaitPolicyOf, x as lockIncompatible } from "./ast-B_UPqRyb.mjs";
6
6
  import { i as isExpression, o as toExpr } from "./expression-JOe6lo4g.mjs";
7
7
  import { n as codecRefForStorageColumn } from "./codec-descriptor-registry-DoGFktu5.mjs";
8
8
  import { structuredError } from "@prisma/orm-framework/utils/structured-error";
@@ -371,6 +371,14 @@ function assertDistinctOnCapability(contract, methodName) {
371
371
  method: methodName
372
372
  } });
373
373
  }
374
+ function assertLockCapability(contract, requirement, methodName) {
375
+ const capability = missingCapability(contract.capabilities, requirement);
376
+ if (capability === void 0) return;
377
+ throw ormError("ORM.CAPABILITY_MISSING", `${methodName}() requires capability ${capability}`, { meta: {
378
+ capability,
379
+ method: methodName
380
+ } });
381
+ }
374
382
  function hasContractCapability(contract, capability) {
375
383
  const capabilities = contract.capabilities;
376
384
  const value = capabilities[capability];
@@ -1039,6 +1047,7 @@ function emptyState() {
1039
1047
  limit: void 0,
1040
1048
  offset: void 0,
1041
1049
  variantName: void 0,
1050
+ locking: void 0,
1042
1051
  annotations: /* @__PURE__ */ new Map()
1043
1052
  };
1044
1053
  }
@@ -1464,6 +1473,29 @@ function compileDeleteCount(contract, namespaceId, tableName, filters, variantNa
1464
1473
  const { params } = deriveParamsFromAst(ast);
1465
1474
  return buildOrmQueryPlan(contract, ast, params);
1466
1475
  }
1476
+ function includeCarriesLock(include) {
1477
+ return [
1478
+ include.nested,
1479
+ ...include.scalar === void 0 ? [] : [include.scalar.state],
1480
+ ...Object.values(include.combine ?? {}).map((branch) => branch.kind === "rows" ? branch.state : branch.selector.state)
1481
+ ].some(stateCarriesLock);
1482
+ }
1483
+ function stateCarriesLock(state) {
1484
+ return state.locking !== void 0 || state.includes.some(includeCarriesLock);
1485
+ }
1486
+ function conflictOf(state, call) {
1487
+ if (state.includes.some(includeCarriesLock)) return "includeRefinement";
1488
+ if (state.locking === void 0) return void 0;
1489
+ if (call !== void 0) return call;
1490
+ if (state.includes.length > 0) return "include";
1491
+ if (state.distinct !== void 0 && state.distinct.length > 0) return "distinct";
1492
+ if (state.distinctOn !== void 0 && state.distinctOn.length > 0) return "distinctOn";
1493
+ }
1494
+ /** Refuses a row lock the ORM cannot render: inside an include, with include, distinct or distinctOn in the state, or before a call that drops it. */
1495
+ function assertLockCompatible(state, call) {
1496
+ const conflict = conflictOf(state, call);
1497
+ if (conflict !== void 0) throw lockIncompatible(conflict, `A locking clause cannot be combined with ${conflict}`);
1498
+ }
1467
1499
  function augmentSelectionForJoinColumns(selectedFields, requiredColumns) {
1468
1500
  if (!selectedFields) return {
1469
1501
  selectedForQuery: selectedFields,
@@ -2047,9 +2079,11 @@ function buildSelectAst(contract, tableName, state, options) {
2047
2079
  if (state.limit !== void 0) ast = ast.withLimit(state.limit);
2048
2080
  if (state.offset !== void 0) ast = ast.withOffset(state.offset);
2049
2081
  if (options.joins && options.joins.length > 0) ast = ast.withJoins(options.joins);
2082
+ if (state.locking !== void 0) ast = ast.withLocking(state.locking);
2050
2083
  return ast;
2051
2084
  }
2052
2085
  function compileSelect(contract, namespaceId, tableName, state, modelName) {
2086
+ assertLockCompatible(state);
2053
2087
  if (state.distinctOn !== void 0 && state.distinctOn.length > 0) assertDistinctOnCapability(contract, "distinctOn");
2054
2088
  const polyInfo = modelName ? resolvePolymorphismInfo(contract, namespaceId, modelName) : void 0;
2055
2089
  const selection = polyInfo && modelName ? resolvePolymorphicProjectionSelection(contract, namespaceId, modelName, polyInfo, state) : void 0;
@@ -2071,6 +2105,7 @@ function compileSelect(contract, namespaceId, tableName, state, modelName) {
2071
2105
  return buildOrmQueryPlan(contract, ast, params, state.annotations);
2072
2106
  }
2073
2107
  function compileSelectWithIncludes(contract, aggregates, namespaceId, tableName, state, modelName) {
2108
+ assertLockCompatible(state);
2074
2109
  const includeJoins = [];
2075
2110
  const includeProjection = [];
2076
2111
  const topLevelWhere = buildStateWhere(contract, tableName, state, { namespaceId });
@@ -4475,6 +4510,7 @@ var CollectionBase = class CollectionBase {
4475
4510
  * ```
4476
4511
  */
4477
4512
  groupBy(...fields) {
4513
+ assertLockCompatible(this.state, "groupBy");
4478
4514
  const groupByColumns = mapFieldsToColumns(this.contract, this.namespaceId, this.modelName, fields);
4479
4515
  return new GroupedCollection(this.ctx, this.modelName, {
4480
4516
  tableName: this.tableName,
@@ -4551,6 +4587,42 @@ var CollectionBase = class CollectionBase {
4551
4587
  distinctOn: distinctOnFields
4552
4588
  });
4553
4589
  }
4590
+ /**
4591
+ * Lock the selected rows of this model with `FOR UPDATE` until the transaction ends.
4592
+ *
4593
+ * Requires the `sql.forUpdate` and `sql.lockOf` capabilities, because the lock always names the model's table with `OF`.
4594
+ *
4595
+ * ```typescript
4596
+ * const job = await tx.orm.Job.where({ state: 'queued' }).limit(1).forUpdate({ skipLocked: true }).first();
4597
+ * ```
4598
+ */
4599
+ forUpdate(...options) {
4600
+ return this.#lock("forUpdate", options[0]);
4601
+ }
4602
+ /**
4603
+ * Lock the selected rows of this model with `FOR NO KEY UPDATE` until the transaction ends. Unlike `forUpdate`, it does not block foreign-key checks from rows that reference them.
4604
+ *
4605
+ * Requires the `postgres.forNoKeyUpdate` and `sql.lockOf` capabilities, because the lock always names the model's table with `OF`.
4606
+ */
4607
+ forNoKeyUpdate(...options) {
4608
+ return this.#lock("forNoKeyUpdate", options[0]);
4609
+ }
4610
+ /**
4611
+ * Lock the selected rows of this model with `FOR SHARE` until the transaction ends; other transactions may share-lock them but not write them.
4612
+ *
4613
+ * Requires the `sql.forShare` and `sql.lockOf` capabilities, because the lock always names the model's table with `OF`.
4614
+ */
4615
+ forShare(...options) {
4616
+ return this.#lock("forShare", options[0]);
4617
+ }
4618
+ /**
4619
+ * Lock the selected rows of this model with `FOR KEY SHARE` until the transaction ends; only deletes and key changes are blocked.
4620
+ *
4621
+ * Requires the `postgres.forKeyShare` and `sql.lockOf` capabilities, because the lock always names the model's table with `OF`.
4622
+ */
4623
+ forKeyShare(...options) {
4624
+ return this.#lock("forKeyShare", options[0]);
4625
+ }
4554
4626
  limit(n) {
4555
4627
  return this.#cloneSelf({ limit: typeof n === "number" ? n : toExpr(n) });
4556
4628
  }
@@ -4612,6 +4684,7 @@ var CollectionBase = class CollectionBase {
4612
4684
  return description.consume(queryPlanRows(this.ctx.runtime, description.plan));
4613
4685
  }
4614
4686
  #describeAggregate(fn, configure) {
4687
+ assertLockCompatible(this.state, "aggregate");
4615
4688
  const aggregateSpec = fn(createAggregateBuilder(this.contract, this.ctx.context.aggregateDescriptors, this.namespaceId, this.modelName));
4616
4689
  const entries = Object.entries(aggregateSpec);
4617
4690
  if (entries.length === 0) throw ormError("ORM.AGGREGATE_SELECTOR_MISSING", "aggregate() requires at least one aggregation selector", { meta: {
@@ -4651,6 +4724,7 @@ var CollectionBase = class CollectionBase {
4651
4724
  };
4652
4725
  }
4653
4726
  async create(data, configure) {
4727
+ assertLockCompatible(this.state, "mutation");
4654
4728
  assertReturningCapability(this.contract, "create()");
4655
4729
  const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "create");
4656
4730
  if (hasNestedMutationCallbacks(this.contract, this.namespaceId, this.modelName, blindCast(data))) {
@@ -4677,6 +4751,7 @@ var CollectionBase = class CollectionBase {
4677
4751
  } });
4678
4752
  }
4679
4753
  createAll(data, optionsOrConfigure, configure) {
4754
+ assertLockCompatible(this.state, "mutation");
4680
4755
  const { options, configureCallback } = splitCreateArguments(optionsOrConfigure, configure);
4681
4756
  const conflictSkip = this.#resolveConflictSkip(options, "createAll()");
4682
4757
  return this.#createAllWithAnnotations(data, this.#collectAnnotationsFromMeta(configureCallback, "write", "createAll"), conflictSkip);
@@ -4878,6 +4953,7 @@ var CollectionBase = class CollectionBase {
4878
4953
  * Not supported on MTI variants — use `createAll(...)` instead.
4879
4954
  */
4880
4955
  async createAndCount(data, optionsOrConfigure, configure) {
4956
+ assertLockCompatible(this.state, "mutation");
4881
4957
  const { options, configureCallback } = splitCreateArguments(optionsOrConfigure, configure);
4882
4958
  const conflictSkip = this.#resolveConflictSkip(options, "createAndCount()");
4883
4959
  if (data.length === 0) return 0;
@@ -4899,6 +4975,7 @@ var CollectionBase = class CollectionBase {
4899
4975
  return (await this.ctx.runtime.execute(compiled)).affectedRows;
4900
4976
  }
4901
4977
  async upsert(input, configure) {
4978
+ assertLockCompatible(this.state, "mutation");
4902
4979
  assertReturningCapability(this.contract, "upsert()");
4903
4980
  this.#assertNotMtiVariant("upsert()");
4904
4981
  const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "upsert");
@@ -4941,6 +5018,7 @@ var CollectionBase = class CollectionBase {
4941
5018
  } });
4942
5019
  }
4943
5020
  async update(data, configure) {
5021
+ assertLockCompatible(this.state, "mutation");
4944
5022
  assertReturningCapability(this.contract, "update()");
4945
5023
  const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "update");
4946
5024
  if (hasNestedMutationCallbacks(this.contract, this.namespaceId, this.modelName, blindCast(data))) {
@@ -4966,6 +5044,7 @@ var CollectionBase = class CollectionBase {
4966
5044
  }
4967
5045
  updateAll(data, configure) {
4968
5046
  assertBulkWriteIgnoresNothing(this.state, this.modelName, "updateAll");
5047
+ assertLockCompatible(this.state, "mutation");
4969
5048
  return this.#updateAllWithAnnotations(data, this.#collectAnnotationsFromMeta(configure, "write", "updateAll"));
4970
5049
  }
4971
5050
  #updateAllWithAnnotations(data, annotationsMap) {
@@ -4994,6 +5073,7 @@ var CollectionBase = class CollectionBase {
4994
5073
  }
4995
5074
  async updateAndCount(data, configure) {
4996
5075
  assertBulkWriteIgnoresNothing(this.state, this.modelName, "updateAndCount");
5076
+ assertLockCompatible(this.state, "mutation");
4997
5077
  const mappedData = mapModelDataToStorageRow(this.contract, this.namespaceId, this.modelName, data);
4998
5078
  if (Object.keys(mappedData).length === 0) return 0;
4999
5079
  applyUpdateDefaults(this.ctx, this.namespaceId, this.tableName, mappedData);
@@ -5002,6 +5082,7 @@ var CollectionBase = class CollectionBase {
5002
5082
  return (await this.ctx.runtime.execute(compiled)).affectedRows;
5003
5083
  }
5004
5084
  async delete(configure) {
5085
+ assertLockCompatible(this.state, "mutation");
5005
5086
  assertReturningCapability(this.contract, "delete()");
5006
5087
  const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "delete");
5007
5088
  return withMutationScope(this.ctx.runtime, async (scope) => {
@@ -5017,6 +5098,7 @@ var CollectionBase = class CollectionBase {
5017
5098
  }
5018
5099
  deleteAll(configure) {
5019
5100
  assertBulkWriteIgnoresNothing(this.state, this.modelName, "deleteAll");
5101
+ assertLockCompatible(this.state, "mutation");
5020
5102
  return this.#deleteAllWithAnnotations(this.#collectAnnotationsFromMeta(configure, "write", "deleteAll"));
5021
5103
  }
5022
5104
  #deleteAllWithAnnotations(annotationsMap) {
@@ -5076,6 +5158,7 @@ var CollectionBase = class CollectionBase {
5076
5158
  }
5077
5159
  async deleteAndCount(configure) {
5078
5160
  assertBulkWriteIgnoresNothing(this.state, this.modelName, "deleteAndCount");
5161
+ assertLockCompatible(this.state, "mutation");
5079
5162
  const annotationsMap = this.#collectAnnotationsFromMeta(configure, "write", "deleteAndCount");
5080
5163
  const compiled = mergeAnnotations(compileDeleteCount(this.contract, this.namespaceId, this.tableName, this.state.filters, this.state.variantName, this.modelName), annotationsMap);
5081
5164
  return (await this.ctx.runtime.execute(compiled)).affectedRows;
@@ -5170,6 +5253,18 @@ var CollectionBase = class CollectionBase {
5170
5253
  if (this.includeRefinementMode) return;
5171
5254
  throw ormError("ORM.INCLUDE_INVALID", `${action} is only available inside include() refinement callbacks`, { meta: { action } });
5172
5255
  }
5256
+ #lock(strength, options) {
5257
+ if (this.includeRefinementMode) throw lockIncompatible("includeRefinement", `${strength}() cannot be called inside an include() refinement callback`);
5258
+ assertLockCapability(this.contract, lockStrengthCapabilities[strength], strength);
5259
+ assertLockCapability(this.contract, lockOptionCapabilities.of, strength);
5260
+ const waitPolicy = lockWaitPolicyOf(strength, options);
5261
+ if (waitPolicy !== void 0) assertLockCapability(this.contract, lockOptionCapabilities[waitPolicy], strength);
5262
+ const clause = LockingClause.of(strength, {
5263
+ of: [this.tableName],
5264
+ ...ifDefined("waitPolicy", waitPolicy)
5265
+ });
5266
+ return this.#clone({ locking: [...this.state.locking ?? [], clause] });
5267
+ }
5173
5268
  #clone(overrides) {
5174
5269
  return this.#createSelf({
5175
5270
  ...this.state,