hierarchical-approval 3.0.0 → 3.2.0

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 (56) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/{ApprovalEngine-CCOwhMrs.d.ts → ApprovalEngine-Cslh4Goz.d.ts} +6 -6
  3. package/dist/{ApprovalEngine-Bfs5BnMm.d.cts → ApprovalEngine-zAgvH_aO.d.cts} +6 -6
  4. package/dist/{IAuditAdapter-DxdK4UVt.d.cts → IAuditAdapter-BkxGx6TI.d.cts} +1 -1
  5. package/dist/{IAuditAdapter-B33n15YP.d.ts → IAuditAdapter-udkAnnmu.d.ts} +1 -1
  6. package/dist/{IAuthorizationPolicy-BzGVzkLJ.d.cts → IAuthorizationPolicy-YQlSwj-8.d.cts} +1 -1
  7. package/dist/{IAuthorizationPolicy-DOm6KCwI.d.ts → IAuthorizationPolicy-Z4nkX-bu.d.ts} +1 -1
  8. package/dist/{INotificationAdapter-DMvA4R-c.d.ts → INotificationAdapter-C-PL3Pvp.d.ts} +1 -1
  9. package/dist/{INotificationAdapter-DFKvGpOp.d.cts → INotificationAdapter-D3PBQE1B.d.cts} +1 -1
  10. package/dist/{IOperationMiddleware-Nk8Q1Z8o.d.ts → IOperationMiddleware-Cbd05rje.d.ts} +1 -1
  11. package/dist/{IOperationMiddleware-C8i06wq4.d.cts → IOperationMiddleware-tgJcKzTP.d.cts} +1 -1
  12. package/dist/{IStorageAdapter-C2QxUwbX.d.ts → IStorageAdapter-CEKfu-U8.d.ts} +1 -1
  13. package/dist/{IStorageAdapter-C0qeZgs4.d.cts → IStorageAdapter-DUrmnJUs.d.cts} +1 -1
  14. package/dist/adapters/MemoryAdapter.cjs +3 -3
  15. package/dist/adapters/MemoryAdapter.cjs.map +1 -1
  16. package/dist/adapters/MemoryAdapter.d.cts +2 -2
  17. package/dist/adapters/MemoryAdapter.d.ts +2 -2
  18. package/dist/adapters/MemoryAdapter.js +3 -3
  19. package/dist/adapters/MemoryAdapter.js.map +1 -1
  20. package/dist/adapters/PostgresAdapter.cjs +18 -0
  21. package/dist/adapters/PostgresAdapter.cjs.map +1 -1
  22. package/dist/adapters/PostgresAdapter.d.cts +2 -2
  23. package/dist/adapters/PostgresAdapter.d.ts +2 -2
  24. package/dist/adapters/PostgresAdapter.js +18 -0
  25. package/dist/adapters/PostgresAdapter.js.map +1 -1
  26. package/dist/index.cjs +6 -3
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +8 -8
  29. package/dist/index.d.ts +8 -8
  30. package/dist/index.js +6 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/{instance-BvOyT00S.d.cts → instance-BXHxvTLE.d.cts} +10 -0
  33. package/dist/{instance-BvOyT00S.d.ts → instance-BXHxvTLE.d.ts} +10 -0
  34. package/dist/nestjs.cjs +6 -3
  35. package/dist/nestjs.cjs.map +1 -1
  36. package/dist/nestjs.d.cts +7 -7
  37. package/dist/nestjs.d.ts +7 -7
  38. package/dist/nestjs.js +6 -3
  39. package/dist/nestjs.js.map +1 -1
  40. package/dist/plugins/audit.d.cts +2 -2
  41. package/dist/plugins/audit.d.ts +2 -2
  42. package/dist/plugins/notify.d.cts +2 -2
  43. package/dist/plugins/notify.d.ts +2 -2
  44. package/dist/plugins/resilience.d.cts +3 -3
  45. package/dist/plugins/resilience.d.ts +3 -3
  46. package/dist/plugins/tracing.d.cts +2 -2
  47. package/dist/plugins/tracing.d.ts +2 -2
  48. package/dist/plugins/webhook.d.cts +2 -2
  49. package/dist/plugins/webhook.d.ts +2 -2
  50. package/dist/testing.cjs +6 -3
  51. package/dist/testing.cjs.map +1 -1
  52. package/dist/testing.d.cts +7 -7
  53. package/dist/testing.d.ts +7 -7
  54. package/dist/testing.js +6 -3
  55. package/dist/testing.js.map +1 -1
  56. package/package.json +1 -1
@@ -261,6 +261,16 @@ interface ApprovalLevelInstance {
261
261
  escalationDueAt?: Date;
262
262
  escalationAfterDays?: number;
263
263
  escalationAfterHours?: number;
264
+ /**
265
+ * When this level started collecting decisions.
266
+ *
267
+ * Escalation rungs are measured from here. Recorded on the level rather than
268
+ * inferred from the audit trail, because a `level_advanced` entry carries only
269
+ * the group's lowest level number — so an upper branch of a parallel group had
270
+ * no entry to find, and its rungs were measured from the previous escalation
271
+ * instead.
272
+ */
273
+ openedAt?: Date;
264
274
  /** How many escalation rungs have fired on this level. */
265
275
  escalationStep?: number;
266
276
  /** When the next reminder for this level is due; cleared when the level closes. */
@@ -261,6 +261,16 @@ interface ApprovalLevelInstance {
261
261
  escalationDueAt?: Date;
262
262
  escalationAfterDays?: number;
263
263
  escalationAfterHours?: number;
264
+ /**
265
+ * When this level started collecting decisions.
266
+ *
267
+ * Escalation rungs are measured from here. Recorded on the level rather than
268
+ * inferred from the audit trail, because a `level_advanced` entry carries only
269
+ * the group's lowest level number — so an upper branch of a parallel group had
270
+ * no entry to find, and its rungs were measured from the previous escalation
271
+ * instead.
272
+ */
273
+ openedAt?: Date;
264
274
  /** How many escalation rungs have fired on this level. */
265
275
  escalationStep?: number;
266
276
  /** When the next reminder for this level is due; cleared when the level closes. */
package/dist/nestjs.cjs CHANGED
@@ -201,6 +201,7 @@ function reviveDates(instance) {
201
201
  if (l.escalationDueAt) level.escalationDueAt = new Date(l.escalationDueAt);
202
202
  if (l.delegatedUntil) level.delegatedUntil = new Date(l.delegatedUntil);
203
203
  if (l.reminderDueAt) level.reminderDueAt = new Date(l.reminderDueAt);
204
+ if (l.openedAt) level.openedAt = new Date(l.openedAt);
204
205
  return level;
205
206
  })
206
207
  };
@@ -303,9 +304,8 @@ var MemoryAdapter = class {
303
304
  }
304
305
  async getOverdueInstances(tenantId, asOf, filter = {}) {
305
306
  return [...this.instances.values()].filter((i) => {
306
- if (i.tenantId !== tenantId || i.status !== "pending") return false;
307
- if (filter.documentType && i.documentType !== filter.documentType) return false;
308
- if (filter.submittedBy && i.submittedBy !== filter.submittedBy) return false;
307
+ if (i.tenantId !== tenantId) return false;
308
+ if (!applyFilter(i, { ...filter, status: "pending" })) return false;
309
309
  const hasOverdueEscalation = i.levels.some(
310
310
  (l) => l.escalationDueAt != null && new Date(l.escalationDueAt) <= asOf
311
311
  );
@@ -4071,6 +4071,7 @@ var ApprovalEngine = class _ApprovalEngine {
4071
4071
  remindersSent: 0
4072
4072
  };
4073
4073
  if (opts.open) {
4074
+ level.openedAt = opts.now;
4074
4075
  level.escalationDueAt = this.levelEscalationDue(opts.now, cfg, opts.firstRung);
4075
4076
  this.scheduleReminder(level, opts.now);
4076
4077
  }
@@ -4113,6 +4114,7 @@ var ApprovalEngine = class _ApprovalEngine {
4113
4114
  * the ladder no worse off than the single-step behaviour it replaces.
4114
4115
  */
4115
4116
  levelOpenedAt(instance, level, fallback) {
4117
+ if (level.openedAt) return new Date(level.openedAt);
4116
4118
  for (let i = instance.auditLog.length - 1; i >= 0; i--) {
4117
4119
  const entry = instance.auditLog[i];
4118
4120
  if (!entry) continue;
@@ -4233,6 +4235,7 @@ var ApprovalEngine = class _ApprovalEngine {
4233
4235
  now
4234
4236
  );
4235
4237
  }
4238
+ lvl.openedAt = now;
4236
4239
  lvl.escalationDueAt = this.levelEscalationDue(now, lvl, firstRung);
4237
4240
  lvl.escalationStep = 0;
4238
4241
  this.scheduleReminder(lvl, now);