@zenstackhq/runtime 3.0.0-alpha.25 → 3.0.0-alpha.27

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.
@@ -1,5 +1,5 @@
1
1
  import * as kysely from 'kysely';
2
- import { R as RuntimePlugin, V as OnKyselyQueryArgs } from '../../contract-BOWN0dwS.cjs';
2
+ import { R as RuntimePlugin, V as OnKyselyQueryArgs } from '../../contract-c8GpEAl3.cjs';
3
3
  import { SchemaDef } from '@zenstackhq/sdk/schema';
4
4
  import 'decimal.js';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import * as kysely from 'kysely';
2
- import { R as RuntimePlugin, V as OnKyselyQueryArgs } from '../../contract-BOWN0dwS.js';
2
+ import { R as RuntimePlugin, V as OnKyselyQueryArgs } from '../../contract-c8GpEAl3.js';
3
3
  import { SchemaDef } from '@zenstackhq/sdk/schema';
4
4
  import 'decimal.js';
5
5
 
@@ -337,6 +337,16 @@ function flattenCompoundUniqueFilters(schema, model, filter) {
337
337
  return result;
338
338
  }
339
339
  __name(flattenCompoundUniqueFilters, "flattenCompoundUniqueFilters");
340
+ function ensureArray(value) {
341
+ if (Array.isArray(value)) {
342
+ return value;
343
+ } else {
344
+ return [
345
+ value
346
+ ];
347
+ }
348
+ }
349
+ __name(ensureArray, "ensureArray");
340
350
  function getDelegateDescendantModels(schema, model, collected = /* @__PURE__ */ new Set()) {
341
351
  const subModels = Object.values(schema.models).filter((m) => m.baseModel === model);
342
352
  subModels.forEach((def) => {
@@ -399,6 +409,33 @@ var BaseCrudDialect = class {
399
409
  }
400
410
  return result;
401
411
  }
412
+ buildFilterSortTake(model, args, query) {
413
+ let result = query;
414
+ if (args.where) {
415
+ result = result.where((eb) => this.buildFilter(eb, model, model, args?.where));
416
+ }
417
+ let negateOrderBy = false;
418
+ const skip = args.skip;
419
+ let take = args.take;
420
+ if (take !== void 0 && take < 0) {
421
+ negateOrderBy = true;
422
+ take = -take;
423
+ }
424
+ result = this.buildSkipTake(result, skip, take);
425
+ result = this.buildOrderBy(result, model, model, args.orderBy, skip !== void 0 || take !== void 0, negateOrderBy);
426
+ if ("distinct" in args && args.distinct) {
427
+ const distinct = ensureArray(args.distinct);
428
+ if (this.supportsDistinctOn) {
429
+ result = result.distinctOn(distinct.map((f) => sql.ref(`${model}.${f}`)));
430
+ } else {
431
+ throw new QueryError(`"distinct" is not supported by "${this.schema.provider.type}" provider`);
432
+ }
433
+ }
434
+ if (args.cursor) {
435
+ result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy);
436
+ }
437
+ return result;
438
+ }
402
439
  buildFilter(eb, model, modelAlias, where) {
403
440
  if (where === true || where === void 0) {
404
441
  return this.true(eb);
@@ -436,6 +473,26 @@ var BaseCrudDialect = class {
436
473
  }
437
474
  return result;
438
475
  }
476
+ buildCursorFilter(model, query, cursor, orderBy, negateOrderBy) {
477
+ const _orderBy = orderBy ?? makeDefaultOrderBy(this.schema, model);
478
+ const orderByItems = ensureArray(_orderBy).flatMap((obj) => Object.entries(obj));
479
+ const eb = expressionBuilder();
480
+ const cursorFilter = this.buildFilter(eb, model, model, cursor);
481
+ let result = query;
482
+ const filters = [];
483
+ for (let i = orderByItems.length - 1; i >= 0; i--) {
484
+ const andFilters = [];
485
+ for (let j = 0; j <= i; j++) {
486
+ const [field, order] = orderByItems[j];
487
+ const _order = negateOrderBy ? order === "asc" ? "desc" : "asc" : order;
488
+ const op = j === i ? _order === "asc" ? ">=" : "<=" : "=";
489
+ andFilters.push(eb(eb.ref(`${model}.${field}`), op, eb.selectFrom(model).select(`${model}.${field}`).where(cursorFilter)));
490
+ }
491
+ filters.push(eb.and(andFilters));
492
+ }
493
+ result = result.where((eb2) => eb2.or(filters));
494
+ return result;
495
+ }
439
496
  isLogicalCombinator(key) {
440
497
  return LOGICAL_COMBINATORS.includes(key);
441
498
  }
@@ -962,18 +1019,7 @@ var PostgresCrudDialect = class extends BaseCrudDialect {
962
1019
  let subQuery = this.buildSelectModel(eb, relationModel);
963
1020
  subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
964
1021
  if (payload && typeof payload === "object") {
965
- if (payload.where) {
966
- subQuery = subQuery.where((eb2) => this.buildFilter(eb2, relationModel, relationModel, payload.where));
967
- }
968
- const skip = payload.skip;
969
- let take = payload.take;
970
- let negateOrderBy = false;
971
- if (take !== void 0 && take < 0) {
972
- negateOrderBy = true;
973
- take = -take;
974
- }
975
- subQuery = this.buildSkipTake(subQuery, skip, take);
976
- subQuery = this.buildOrderBy(subQuery, relationModel, relationModel, payload.orderBy, skip !== void 0 || take !== void 0, negateOrderBy);
1022
+ subQuery = this.buildFilterSortTake(relationModel, payload, subQuery);
977
1023
  }
978
1024
  const m2m = getManyToManyRelation(this.schema, model, relationField);
979
1025
  if (m2m) {
@@ -1136,18 +1182,7 @@ var SqliteCrudDialect = class extends BaseCrudDialect {
1136
1182
  let subQuery = this.buildSelectModel(eb, relationModel);
1137
1183
  subQuery = this.buildSelectAllFields(relationModel, subQuery, typeof payload === "object" ? payload?.omit : void 0);
1138
1184
  if (payload && typeof payload === "object") {
1139
- if (payload.where) {
1140
- subQuery = subQuery.where((eb2) => this.buildFilter(eb2, relationModel, relationModel, payload.where));
1141
- }
1142
- const skip = payload.skip;
1143
- let take = payload.take;
1144
- let negateOrderBy = false;
1145
- if (take !== void 0 && take < 0) {
1146
- negateOrderBy = true;
1147
- take = -take;
1148
- }
1149
- subQuery = this.buildSkipTake(subQuery, skip, take);
1150
- subQuery = this.buildOrderBy(subQuery, relationModel, relationModel, payload.orderBy, skip !== void 0 || take !== void 0, negateOrderBy);
1185
+ subQuery = this.buildFilterSortTake(relationModel, payload, subQuery);
1151
1186
  }
1152
1187
  const m2m = getManyToManyRelation(this.schema, model, relationField);
1153
1188
  if (m2m) {