@rytass/bpm-core-nestjs-module 0.4.0 → 0.5.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 (658) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/eslint.config.mjs +20 -0
  3. package/jest.config.cts +15 -0
  4. package/package.json +2 -2
  5. package/project.json +58 -0
  6. package/src/lib/attachment/attachment-options.spec.ts +45 -0
  7. package/src/lib/attachment/attachment-options.ts +130 -0
  8. package/src/lib/attachment/attachment-storage.provider.spec.ts +79 -0
  9. package/src/lib/attachment/attachment-storage.provider.ts +60 -0
  10. package/src/lib/attachment/{attachment-storage.token.d.ts → attachment-storage.token.ts} +3 -1
  11. package/src/lib/attachment/attachment.controller.ts +39 -0
  12. package/src/lib/attachment/attachment.entity.ts +59 -0
  13. package/src/lib/attachment/attachment.module.ts +149 -0
  14. package/src/lib/attachment/attachment.mutations.ts +22 -0
  15. package/src/lib/attachment/attachment.queries.ts +65 -0
  16. package/src/lib/attachment/attachment.service.spec.ts +319 -0
  17. package/src/lib/attachment/attachment.service.ts +477 -0
  18. package/src/lib/attachment/dto/upload-attachment.input.ts +60 -0
  19. package/src/lib/bpm/bpm-root.module.spec.ts +138 -0
  20. package/src/lib/bpm/bpm-root.module.ts +320 -0
  21. package/src/lib/bpm-auth/bpm-auth-context.extractor.ts +106 -0
  22. package/src/lib/bpm-auth/bpm-auth-context.ts +40 -0
  23. package/src/lib/bpm-auth/bpm-auth.authorization.ts +80 -0
  24. package/src/lib/bpm-auth/bpm-auth.decorators.ts +19 -0
  25. package/src/lib/bpm-auth/bpm-auth.guard.ts +31 -0
  26. package/src/lib/bpm-auth/bpm-auth.module.spec.ts +106 -0
  27. package/src/lib/bpm-auth/bpm-auth.module.ts +69 -0
  28. package/src/lib/bpm-auth/bpm-auth.options.ts +21 -0
  29. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.ts +55 -0
  30. package/src/lib/common/filters/all-exceptions.filter.ts +138 -0
  31. package/src/lib/common/iso-duration.ts +31 -0
  32. package/src/lib/condition/condition.module.ts +8 -0
  33. package/src/lib/condition/condition.service.spec.ts +50 -0
  34. package/src/lib/condition/condition.service.ts +141 -0
  35. package/src/lib/database/data-source.ts +7 -0
  36. package/src/lib/database/migration-runner.ts +26 -0
  37. package/src/lib/database/reconcile-legacy-migrations.ts +87 -0
  38. package/src/lib/database/typeorm.config.ts +217 -0
  39. package/src/lib/delegation/delegation-rule.entity.ts +84 -0
  40. package/src/lib/delegation/delegation.enums.ts +21 -0
  41. package/src/lib/delegation/delegation.module.ts +14 -0
  42. package/src/lib/delegation/delegation.mutations.ts +92 -0
  43. package/src/lib/delegation/delegation.queries.ts +111 -0
  44. package/src/lib/delegation/delegation.service.spec.ts +295 -0
  45. package/src/lib/delegation/delegation.service.ts +482 -0
  46. package/src/lib/delegation/dto/delegation-rule.input.ts +125 -0
  47. package/src/lib/form/dto/form-definition.input.ts +90 -0
  48. package/src/lib/form/form-definition-version.entity.ts +66 -0
  49. package/src/lib/form/form-definition.entity.ts +54 -0
  50. package/src/lib/form/form-schema-lint.object.ts +10 -0
  51. package/src/lib/form/form-schema.validator.spec.ts +180 -0
  52. package/src/lib/form/form-schema.validator.ts +538 -0
  53. package/src/lib/form/form.enums.ts +20 -0
  54. package/src/lib/form/form.module.ts +19 -0
  55. package/src/lib/form/form.mutations.ts +73 -0
  56. package/src/lib/form/form.queries.ts +72 -0
  57. package/src/lib/form/form.service.spec.ts +371 -0
  58. package/src/lib/form/form.service.ts +607 -0
  59. package/src/lib/identity/identity-options.ts +41 -0
  60. package/src/lib/identity/identity.module.ts +96 -0
  61. package/src/lib/identity/identity.queries.ts +61 -0
  62. package/src/lib/identity/identity.service.spec.ts +328 -0
  63. package/src/lib/identity/identity.service.ts +277 -0
  64. package/src/lib/identity/member-base.adapter.spec.ts +122 -0
  65. package/src/lib/identity/member-base.adapter.ts +302 -0
  66. package/src/lib/identity/member-metadata-cache.entity.ts +27 -0
  67. package/src/lib/identity/{member-not-found.exception.d.ts → member-not-found.exception.ts} +8 -3
  68. package/src/lib/identity/member-profile.object.ts +28 -0
  69. package/src/lib/identity/member-resolver.interface.ts +140 -0
  70. package/src/lib/migrations/0000000000001-enable-postgres-extensions.ts +14 -0
  71. package/src/lib/migrations/{0000000001000-identity-organization-foundation.js → 0000000001000-identity-organization-foundation.ts} +38 -29
  72. package/src/lib/migrations/{0000000002000-form-builder-foundation.js → 0000000002000-form-builder-foundation.ts} +22 -21
  73. package/src/lib/migrations/{0000000003000-approval-template-foundation.js → 0000000003000-approval-template-foundation.ts} +24 -21
  74. package/src/lib/migrations/{0000000004000-workflow-engine-foundation.js → 0000000004000-workflow-engine-foundation.ts} +46 -34
  75. package/src/lib/migrations/{0000000005000-delegation-rules.js → 0000000005000-delegation-rules.ts} +20 -19
  76. package/src/lib/migrations/{0000000006000-notifications-sla.js → 0000000006000-notifications-sla.ts} +26 -23
  77. package/src/lib/migrations/{0000000007000-signatures-attachments.js → 0000000007000-signatures-attachments.ts} +28 -27
  78. package/src/lib/migrations/{0000000008000-approval-template-categories.js → 0000000008000-approval-template-categories.ts} +28 -25
  79. package/src/lib/migrations/{0000000009000-task-candidates.js → 0000000009000-task-candidates.ts} +26 -23
  80. package/src/lib/migrations/{0000000010000-notification-delivery-state.js → 0000000010000-notification-delivery-state.ts} +16 -17
  81. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.ts +19 -0
  82. package/src/lib/migrations/0000000012000-notification-sla-idempotency.ts +22 -0
  83. package/src/lib/migrations/0000000013000-workflow-query-indexes.ts +113 -0
  84. package/src/lib/migrations/0000000014000-notification-resolution.ts +29 -0
  85. package/src/lib/migrations/{0000000015000-backfill-stale-notification-resolution.js → 0000000015000-backfill-stale-notification-resolution.ts} +15 -16
  86. package/src/lib/migrations/{0000000016000-archive-parallel-form-drafts.js → 0000000016000-archive-parallel-form-drafts.ts} +15 -16
  87. package/src/lib/migrations/{0000000017000-adhoc-directives.js → 0000000017000-adhoc-directives.ts} +18 -19
  88. package/src/lib/migrations/index.ts +59 -0
  89. package/src/lib/notification/dto/notification-preference.input.ts +46 -0
  90. package/src/lib/notification/notification-delivery-scheduler.service.ts +69 -0
  91. package/src/lib/notification/notification-delivery.service.spec.ts +315 -0
  92. package/src/lib/notification/notification-delivery.service.ts +339 -0
  93. package/src/lib/notification/notification-dispatcher.token.ts +13 -0
  94. package/src/lib/notification/notification-options.module.ts +67 -0
  95. package/src/lib/notification/notification-options.spec.ts +93 -0
  96. package/src/lib/notification/notification-options.ts +452 -0
  97. package/src/lib/notification/notification-preference.entity.ts +35 -0
  98. package/src/lib/notification/notification-sla-scheduler.service.ts +66 -0
  99. package/src/lib/notification/notification-template.spec.ts +33 -0
  100. package/src/lib/notification/notification-template.ts +97 -0
  101. package/src/lib/notification/notification.entity.ts +129 -0
  102. package/src/lib/notification/notification.enums.ts +64 -0
  103. package/src/lib/notification/notification.module.ts +37 -0
  104. package/src/lib/notification/notification.mutations.ts +47 -0
  105. package/src/lib/notification/notification.queries.ts +64 -0
  106. package/src/lib/notification/notification.service.spec.ts +412 -0
  107. package/src/lib/notification/notification.service.ts +1129 -0
  108. package/src/lib/organization/dto/manager-resolution.input.ts +91 -0
  109. package/src/lib/organization/dto/membership.input.ts +77 -0
  110. package/src/lib/organization/dto/org-unit.input.ts +96 -0
  111. package/src/lib/organization/dto/position.input.ts +50 -0
  112. package/src/lib/organization/json-metadata.ts +15 -0
  113. package/src/lib/organization/manager-resolution.entity.ts +44 -0
  114. package/src/lib/organization/membership.entity.ts +50 -0
  115. package/src/lib/organization/org-unit-tree-commit-result.object.ts +8 -0
  116. package/src/lib/organization/org-unit.entity.ts +53 -0
  117. package/src/lib/organization/organization-summary.object.ts +16 -0
  118. package/src/lib/organization/organization.enums.ts +19 -0
  119. package/src/lib/organization/organization.module.ts +27 -0
  120. package/src/lib/organization/organization.mutations.ts +115 -0
  121. package/src/lib/organization/organization.queries.ts +191 -0
  122. package/src/lib/organization/organization.service.spec.ts +835 -0
  123. package/src/lib/organization/organization.service.ts +1245 -0
  124. package/src/lib/organization/position.entity.ts +39 -0
  125. package/src/lib/organization/resolved-manager.object.ts +10 -0
  126. package/src/lib/signature/signature-options.spec.ts +60 -0
  127. package/src/lib/signature/signature-options.ts +120 -0
  128. package/src/lib/signature/signature-verification.object.ts +16 -0
  129. package/src/lib/signature/signature.entity.ts +62 -0
  130. package/src/lib/signature/signature.module.ts +80 -0
  131. package/src/lib/signature/signature.queries.ts +37 -0
  132. package/src/lib/signature/signature.service.spec.ts +134 -0
  133. package/src/lib/signature/signature.service.ts +205 -0
  134. package/src/lib/template/approval-template-category.entity.ts +40 -0
  135. package/src/lib/template/approval-template-version.entity.ts +82 -0
  136. package/src/lib/template/approval-template.entity.ts +64 -0
  137. package/src/lib/template/compose-approval-template.object.ts +23 -0
  138. package/src/lib/template/compose-template.mutations.ts +22 -0
  139. package/src/lib/template/dto/approval-template.input.ts +147 -0
  140. package/src/lib/template/dto/compose-approval-template.input.ts +80 -0
  141. package/src/lib/template/template.enums.ts +30 -0
  142. package/src/lib/template/template.module.ts +33 -0
  143. package/src/lib/template/template.mutations.ts +106 -0
  144. package/src/lib/template/template.queries.ts +119 -0
  145. package/src/lib/template/template.service.spec.ts +822 -0
  146. package/src/lib/template/template.service.ts +1082 -0
  147. package/src/lib/template/workflow-definition.validator.spec.ts +595 -0
  148. package/src/lib/template/workflow-definition.validator.ts +539 -0
  149. package/src/lib/testing/cel-js.jest.ts +46 -0
  150. package/src/lib/workflow-engine/activity-log.entity.ts +48 -0
  151. package/src/lib/workflow-engine/adhoc-directive.entity.ts +90 -0
  152. package/src/lib/workflow-engine/adhoc.enums.ts +42 -0
  153. package/src/lib/workflow-engine/approval-instance-page-info.object.ts +22 -0
  154. package/src/lib/workflow-engine/approval-instance.entity.ts +86 -0
  155. package/src/lib/workflow-engine/dto/adhoc-notification.input.ts +18 -0
  156. package/src/lib/workflow-engine/dto/adhoc-target.input.ts +52 -0
  157. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.ts +18 -0
  158. package/src/lib/workflow-engine/dto/decide-task.input.ts +33 -0
  159. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.ts +22 -0
  160. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.ts +22 -0
  161. package/src/lib/workflow-engine/dto/submit-approval-instance.input.ts +27 -0
  162. package/src/lib/workflow-engine/task-candidate.entity.ts +56 -0
  163. package/src/lib/workflow-engine/task-decision.entity.ts +43 -0
  164. package/src/lib/workflow-engine/task.entity.ts +102 -0
  165. package/src/lib/workflow-engine/workflow-condition-evaluator.ts +168 -0
  166. package/src/lib/workflow-engine/workflow-dashboard-summary.object.ts +22 -0
  167. package/src/lib/workflow-engine/workflow-dry-run.object.ts +58 -0
  168. package/src/lib/workflow-engine/workflow-engine.enums.ts +102 -0
  169. package/src/lib/workflow-engine/workflow-engine.module.ts +77 -0
  170. package/src/lib/workflow-engine/workflow-engine.mutations.ts +193 -0
  171. package/src/lib/workflow-engine/workflow-engine.queries.ts +241 -0
  172. package/src/lib/workflow-engine/workflow-engine.service.spec.ts +3345 -0
  173. package/src/lib/workflow-engine/workflow-engine.service.ts +6022 -0
  174. package/src/lib/workflow-engine/{workflow-engine.tokens.d.ts → workflow-engine.tokens.ts} +9 -3
  175. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.ts +69 -0
  176. package/src/lib/workflow-engine/workflow-token.entity.ts +40 -0
  177. package/tsconfig.json +24 -0
  178. package/tsconfig.lib.json +16 -0
  179. package/tsconfig.spec.json +16 -0
  180. package/src/index.js +0 -18
  181. package/src/index.js.map +0 -1
  182. package/src/lib/attachment/attachment-options.d.ts +0 -44
  183. package/src/lib/attachment/attachment-options.js +0 -62
  184. package/src/lib/attachment/attachment-options.js.map +0 -1
  185. package/src/lib/attachment/attachment-storage.provider.d.ts +0 -4
  186. package/src/lib/attachment/attachment-storage.provider.js +0 -35
  187. package/src/lib/attachment/attachment-storage.provider.js.map +0 -1
  188. package/src/lib/attachment/attachment-storage.token.js +0 -5
  189. package/src/lib/attachment/attachment-storage.token.js.map +0 -1
  190. package/src/lib/attachment/attachment.controller.d.ts +0 -8
  191. package/src/lib/attachment/attachment.controller.js +0 -38
  192. package/src/lib/attachment/attachment.controller.js.map +0 -1
  193. package/src/lib/attachment/attachment.entity.d.ts +0 -14
  194. package/src/lib/attachment/attachment.entity.js +0 -74
  195. package/src/lib/attachment/attachment.entity.js.map +0 -1
  196. package/src/lib/attachment/attachment.module.d.ts +0 -27
  197. package/src/lib/attachment/attachment.module.js +0 -103
  198. package/src/lib/attachment/attachment.module.js.map +0 -1
  199. package/src/lib/attachment/attachment.mutations.d.ts +0 -8
  200. package/src/lib/attachment/attachment.mutations.js +0 -35
  201. package/src/lib/attachment/attachment.mutations.js.map +0 -1
  202. package/src/lib/attachment/attachment.queries.d.ts +0 -9
  203. package/src/lib/attachment/attachment.queries.js +0 -78
  204. package/src/lib/attachment/attachment.queries.js.map +0 -1
  205. package/src/lib/attachment/attachment.service.d.ts +0 -49
  206. package/src/lib/attachment/attachment.service.js +0 -276
  207. package/src/lib/attachment/attachment.service.js.map +0 -1
  208. package/src/lib/attachment/dto/upload-attachment.input.d.ts +0 -11
  209. package/src/lib/attachment/dto/upload-attachment.input.js +0 -68
  210. package/src/lib/attachment/dto/upload-attachment.input.js.map +0 -1
  211. package/src/lib/attachment/index.js +0 -9
  212. package/src/lib/attachment/index.js.map +0 -1
  213. package/src/lib/bpm/bpm-root.module.d.ts +0 -155
  214. package/src/lib/bpm/bpm-root.module.js +0 -170
  215. package/src/lib/bpm/bpm-root.module.js.map +0 -1
  216. package/src/lib/bpm/index.js +0 -5
  217. package/src/lib/bpm/index.js.map +0 -1
  218. package/src/lib/bpm-auth/bpm-auth-context.d.ts +0 -24
  219. package/src/lib/bpm-auth/bpm-auth-context.extractor.d.ts +0 -4
  220. package/src/lib/bpm-auth/bpm-auth-context.extractor.js +0 -69
  221. package/src/lib/bpm-auth/bpm-auth-context.extractor.js.map +0 -1
  222. package/src/lib/bpm-auth/bpm-auth-context.js +0 -15
  223. package/src/lib/bpm-auth/bpm-auth-context.js.map +0 -1
  224. package/src/lib/bpm-auth/bpm-auth.authorization.d.ts +0 -12
  225. package/src/lib/bpm-auth/bpm-auth.authorization.js +0 -67
  226. package/src/lib/bpm-auth/bpm-auth.authorization.js.map +0 -1
  227. package/src/lib/bpm-auth/bpm-auth.decorators.d.ts +0 -3
  228. package/src/lib/bpm-auth/bpm-auth.decorators.js +0 -11
  229. package/src/lib/bpm-auth/bpm-auth.decorators.js.map +0 -1
  230. package/src/lib/bpm-auth/bpm-auth.guard.d.ts +0 -7
  231. package/src/lib/bpm-auth/bpm-auth.guard.js +0 -24
  232. package/src/lib/bpm-auth/bpm-auth.guard.js.map +0 -1
  233. package/src/lib/bpm-auth/bpm-auth.module.d.ts +0 -6
  234. package/src/lib/bpm-auth/bpm-auth.module.js +0 -69
  235. package/src/lib/bpm-auth/bpm-auth.module.js.map +0 -1
  236. package/src/lib/bpm-auth/bpm-auth.options.d.ts +0 -11
  237. package/src/lib/bpm-auth/bpm-auth.options.js +0 -3
  238. package/src/lib/bpm-auth/bpm-auth.options.js.map +0 -1
  239. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.d.ts +0 -10
  240. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js +0 -40
  241. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js.map +0 -1
  242. package/src/lib/bpm-auth/index.js +0 -10
  243. package/src/lib/bpm-auth/index.js.map +0 -1
  244. package/src/lib/common/filters/all-exceptions.filter.d.ts +0 -25
  245. package/src/lib/common/filters/all-exceptions.filter.js +0 -93
  246. package/src/lib/common/filters/all-exceptions.filter.js.map +0 -1
  247. package/src/lib/common/index.js +0 -5
  248. package/src/lib/common/index.js.map +0 -1
  249. package/src/lib/common/iso-duration.d.ts +0 -1
  250. package/src/lib/common/iso-duration.js +0 -27
  251. package/src/lib/common/iso-duration.js.map +0 -1
  252. package/src/lib/condition/condition.module.d.ts +0 -2
  253. package/src/lib/condition/condition.module.js +0 -16
  254. package/src/lib/condition/condition.module.js.map +0 -1
  255. package/src/lib/condition/condition.service.d.ts +0 -16
  256. package/src/lib/condition/condition.service.js +0 -82
  257. package/src/lib/condition/condition.service.js.map +0 -1
  258. package/src/lib/condition/index.js +0 -6
  259. package/src/lib/condition/index.js.map +0 -1
  260. package/src/lib/database/data-source.d.ts +0 -4
  261. package/src/lib/database/data-source.js +0 -7
  262. package/src/lib/database/data-source.js.map +0 -1
  263. package/src/lib/database/index.js +0 -6
  264. package/src/lib/database/index.js.map +0 -1
  265. package/src/lib/database/migration-runner.d.ts +0 -1
  266. package/src/lib/database/migration-runner.js +0 -25
  267. package/src/lib/database/migration-runner.js.map +0 -1
  268. package/src/lib/database/reconcile-legacy-migrations.d.ts +0 -13
  269. package/src/lib/database/reconcile-legacy-migrations.js +0 -70
  270. package/src/lib/database/reconcile-legacy-migrations.js.map +0 -1
  271. package/src/lib/database/typeorm.config.d.ts +0 -14
  272. package/src/lib/database/typeorm.config.js +0 -135
  273. package/src/lib/database/typeorm.config.js.map +0 -1
  274. package/src/lib/delegation/delegation-rule.entity.d.ts +0 -19
  275. package/src/lib/delegation/delegation-rule.entity.js +0 -99
  276. package/src/lib/delegation/delegation-rule.entity.js.map +0 -1
  277. package/src/lib/delegation/delegation.enums.d.ts +0 -10
  278. package/src/lib/delegation/delegation.enums.js +0 -23
  279. package/src/lib/delegation/delegation.enums.js.map +0 -1
  280. package/src/lib/delegation/delegation.module.d.ts +0 -2
  281. package/src/lib/delegation/delegation.module.js +0 -22
  282. package/src/lib/delegation/delegation.module.js.map +0 -1
  283. package/src/lib/delegation/delegation.mutations.d.ts +0 -11
  284. package/src/lib/delegation/delegation.mutations.js +0 -87
  285. package/src/lib/delegation/delegation.mutations.js.map +0 -1
  286. package/src/lib/delegation/delegation.queries.d.ts +0 -10
  287. package/src/lib/delegation/delegation.queries.js +0 -91
  288. package/src/lib/delegation/delegation.queries.js.map +0 -1
  289. package/src/lib/delegation/delegation.service.d.ts +0 -56
  290. package/src/lib/delegation/delegation.service.js +0 -268
  291. package/src/lib/delegation/delegation.service.js.map +0 -1
  292. package/src/lib/delegation/dto/delegation-rule.input.d.ts +0 -24
  293. package/src/lib/delegation/dto/delegation-rule.input.js +0 -143
  294. package/src/lib/delegation/dto/delegation-rule.input.js.map +0 -1
  295. package/src/lib/delegation/index.js +0 -9
  296. package/src/lib/delegation/index.js.map +0 -1
  297. package/src/lib/form/dto/form-definition.input.d.ts +0 -26
  298. package/src/lib/form/dto/form-definition.input.js +0 -126
  299. package/src/lib/form/dto/form-definition.input.js.map +0 -1
  300. package/src/lib/form/form-definition-version.entity.d.ts +0 -17
  301. package/src/lib/form/form-definition-version.entity.js +0 -84
  302. package/src/lib/form/form-definition-version.entity.js.map +0 -1
  303. package/src/lib/form/form-definition.entity.d.ts +0 -13
  304. package/src/lib/form/form-definition.entity.js +0 -66
  305. package/src/lib/form/form-definition.entity.js.map +0 -1
  306. package/src/lib/form/form-schema-lint.object.d.ts +0 -4
  307. package/src/lib/form/form-schema-lint.object.js +0 -20
  308. package/src/lib/form/form-schema-lint.object.js.map +0 -1
  309. package/src/lib/form/form-schema.validator.d.ts +0 -13
  310. package/src/lib/form/form-schema.validator.js +0 -354
  311. package/src/lib/form/form-schema.validator.js.map +0 -1
  312. package/src/lib/form/form.enums.d.ts +0 -9
  313. package/src/lib/form/form.enums.js +0 -22
  314. package/src/lib/form/form.enums.js.map +0 -1
  315. package/src/lib/form/form.module.d.ts +0 -2
  316. package/src/lib/form/form.module.js +0 -27
  317. package/src/lib/form/form.module.js.map +0 -1
  318. package/src/lib/form/form.mutations.d.ts +0 -14
  319. package/src/lib/form/form.mutations.js +0 -89
  320. package/src/lib/form/form.mutations.js.map +0 -1
  321. package/src/lib/form/form.queries.d.ts +0 -16
  322. package/src/lib/form/form.queries.js +0 -96
  323. package/src/lib/form/form.queries.js.map +0 -1
  324. package/src/lib/form/form.service.d.ts +0 -49
  325. package/src/lib/form/form.service.js +0 -346
  326. package/src/lib/form/form.service.js.map +0 -1
  327. package/src/lib/form/index.js +0 -12
  328. package/src/lib/form/index.js.map +0 -1
  329. package/src/lib/identity/identity-options.d.ts +0 -13
  330. package/src/lib/identity/identity-options.js +0 -20
  331. package/src/lib/identity/identity-options.js.map +0 -1
  332. package/src/lib/identity/identity.module.d.ts +0 -17
  333. package/src/lib/identity/identity.module.js +0 -65
  334. package/src/lib/identity/identity.module.js.map +0 -1
  335. package/src/lib/identity/identity.queries.d.ts +0 -12
  336. package/src/lib/identity/identity.queries.js +0 -79
  337. package/src/lib/identity/identity.queries.js.map +0 -1
  338. package/src/lib/identity/identity.service.d.ts +0 -22
  339. package/src/lib/identity/identity.service.js +0 -141
  340. package/src/lib/identity/identity.service.js.map +0 -1
  341. package/src/lib/identity/index.js +0 -8
  342. package/src/lib/identity/index.js.map +0 -1
  343. package/src/lib/identity/member-base.adapter.d.ts +0 -95
  344. package/src/lib/identity/member-base.adapter.js +0 -137
  345. package/src/lib/identity/member-base.adapter.js.map +0 -1
  346. package/src/lib/identity/member-metadata-cache.entity.d.ts +0 -8
  347. package/src/lib/identity/member-metadata-cache.entity.js +0 -39
  348. package/src/lib/identity/member-metadata-cache.entity.js.map +0 -1
  349. package/src/lib/identity/member-not-found.exception.js +0 -26
  350. package/src/lib/identity/member-not-found.exception.js.map +0 -1
  351. package/src/lib/identity/member-profile.object.d.ts +0 -8
  352. package/src/lib/identity/member-profile.object.js +0 -37
  353. package/src/lib/identity/member-profile.object.js.map +0 -1
  354. package/src/lib/identity/member-resolver.interface.d.ts +0 -79
  355. package/src/lib/identity/member-resolver.interface.js +0 -19
  356. package/src/lib/identity/member-resolver.interface.js.map +0 -1
  357. package/src/lib/migrations/0000000000001-enable-postgres-extensions.d.ts +0 -6
  358. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js +0 -17
  359. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js.map +0 -1
  360. package/src/lib/migrations/0000000001000-identity-organization-foundation.d.ts +0 -6
  361. package/src/lib/migrations/0000000001000-identity-organization-foundation.js.map +0 -1
  362. package/src/lib/migrations/0000000002000-form-builder-foundation.d.ts +0 -6
  363. package/src/lib/migrations/0000000002000-form-builder-foundation.js.map +0 -1
  364. package/src/lib/migrations/0000000003000-approval-template-foundation.d.ts +0 -6
  365. package/src/lib/migrations/0000000003000-approval-template-foundation.js.map +0 -1
  366. package/src/lib/migrations/0000000004000-workflow-engine-foundation.d.ts +0 -6
  367. package/src/lib/migrations/0000000004000-workflow-engine-foundation.js.map +0 -1
  368. package/src/lib/migrations/0000000005000-delegation-rules.d.ts +0 -6
  369. package/src/lib/migrations/0000000005000-delegation-rules.js.map +0 -1
  370. package/src/lib/migrations/0000000006000-notifications-sla.d.ts +0 -6
  371. package/src/lib/migrations/0000000006000-notifications-sla.js.map +0 -1
  372. package/src/lib/migrations/0000000007000-signatures-attachments.d.ts +0 -6
  373. package/src/lib/migrations/0000000007000-signatures-attachments.js.map +0 -1
  374. package/src/lib/migrations/0000000008000-approval-template-categories.d.ts +0 -6
  375. package/src/lib/migrations/0000000008000-approval-template-categories.js.map +0 -1
  376. package/src/lib/migrations/0000000009000-task-candidates.d.ts +0 -6
  377. package/src/lib/migrations/0000000009000-task-candidates.js.map +0 -1
  378. package/src/lib/migrations/0000000010000-notification-delivery-state.d.ts +0 -6
  379. package/src/lib/migrations/0000000010000-notification-delivery-state.js.map +0 -1
  380. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.d.ts +0 -6
  381. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js +0 -22
  382. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js.map +0 -1
  383. package/src/lib/migrations/0000000012000-notification-sla-idempotency.d.ts +0 -6
  384. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js +0 -21
  385. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js.map +0 -1
  386. package/src/lib/migrations/0000000013000-workflow-query-indexes.d.ts +0 -6
  387. package/src/lib/migrations/0000000013000-workflow-query-indexes.js +0 -80
  388. package/src/lib/migrations/0000000013000-workflow-query-indexes.js.map +0 -1
  389. package/src/lib/migrations/0000000014000-notification-resolution.d.ts +0 -6
  390. package/src/lib/migrations/0000000014000-notification-resolution.js +0 -30
  391. package/src/lib/migrations/0000000014000-notification-resolution.js.map +0 -1
  392. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.d.ts +0 -15
  393. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.js.map +0 -1
  394. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.d.ts +0 -15
  395. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.js.map +0 -1
  396. package/src/lib/migrations/0000000017000-adhoc-directives.d.ts +0 -6
  397. package/src/lib/migrations/0000000017000-adhoc-directives.js.map +0 -1
  398. package/src/lib/migrations/index.d.ts +0 -20
  399. package/src/lib/migrations/index.js +0 -61
  400. package/src/lib/migrations/index.js.map +0 -1
  401. package/src/lib/notification/dto/notification-preference.input.d.ts +0 -9
  402. package/src/lib/notification/dto/notification-preference.input.js +0 -53
  403. package/src/lib/notification/dto/notification-preference.input.js.map +0 -1
  404. package/src/lib/notification/index.js +0 -11
  405. package/src/lib/notification/index.js.map +0 -1
  406. package/src/lib/notification/notification-delivery-scheduler.service.d.ts +0 -13
  407. package/src/lib/notification/notification-delivery-scheduler.service.js +0 -53
  408. package/src/lib/notification/notification-delivery-scheduler.service.js.map +0 -1
  409. package/src/lib/notification/notification-delivery.service.d.ts +0 -23
  410. package/src/lib/notification/notification-delivery.service.js +0 -245
  411. package/src/lib/notification/notification-delivery.service.js.map +0 -1
  412. package/src/lib/notification/notification-dispatcher.token.d.ts +0 -7
  413. package/src/lib/notification/notification-dispatcher.token.js +0 -5
  414. package/src/lib/notification/notification-dispatcher.token.js.map +0 -1
  415. package/src/lib/notification/notification-options.d.ts +0 -215
  416. package/src/lib/notification/notification-options.js +0 -128
  417. package/src/lib/notification/notification-options.js.map +0 -1
  418. package/src/lib/notification/notification-options.module.d.ts +0 -23
  419. package/src/lib/notification/notification-options.module.js +0 -41
  420. package/src/lib/notification/notification-options.module.js.map +0 -1
  421. package/src/lib/notification/notification-preference.entity.d.ts +0 -10
  422. package/src/lib/notification/notification-preference.entity.js +0 -50
  423. package/src/lib/notification/notification-preference.entity.js.map +0 -1
  424. package/src/lib/notification/notification-sla-scheduler.service.d.ts +0 -13
  425. package/src/lib/notification/notification-sla-scheduler.service.js +0 -51
  426. package/src/lib/notification/notification-sla-scheduler.service.js.map +0 -1
  427. package/src/lib/notification/notification-template.d.ts +0 -13
  428. package/src/lib/notification/notification-template.js +0 -61
  429. package/src/lib/notification/notification-template.js.map +0 -1
  430. package/src/lib/notification/notification.entity.d.ts +0 -31
  431. package/src/lib/notification/notification.entity.js +0 -149
  432. package/src/lib/notification/notification.entity.js.map +0 -1
  433. package/src/lib/notification/notification.enums.d.ts +0 -38
  434. package/src/lib/notification/notification.enums.js +0 -63
  435. package/src/lib/notification/notification.enums.js.map +0 -1
  436. package/src/lib/notification/notification.module.d.ts +0 -2
  437. package/src/lib/notification/notification.module.js +0 -45
  438. package/src/lib/notification/notification.module.js.map +0 -1
  439. package/src/lib/notification/notification.mutations.d.ts +0 -11
  440. package/src/lib/notification/notification.mutations.js +0 -64
  441. package/src/lib/notification/notification.mutations.js.map +0 -1
  442. package/src/lib/notification/notification.queries.d.ts +0 -11
  443. package/src/lib/notification/notification.queries.js +0 -77
  444. package/src/lib/notification/notification.queries.js.map +0 -1
  445. package/src/lib/notification/notification.service.d.ts +0 -121
  446. package/src/lib/notification/notification.service.js +0 -713
  447. package/src/lib/notification/notification.service.js.map +0 -1
  448. package/src/lib/organization/dto/manager-resolution.input.d.ts +0 -18
  449. package/src/lib/organization/dto/manager-resolution.input.js +0 -107
  450. package/src/lib/organization/dto/manager-resolution.input.js.map +0 -1
  451. package/src/lib/organization/dto/membership.input.d.ts +0 -16
  452. package/src/lib/organization/dto/membership.input.js +0 -99
  453. package/src/lib/organization/dto/membership.input.js.map +0 -1
  454. package/src/lib/organization/dto/org-unit.input.d.ts +0 -24
  455. package/src/lib/organization/dto/org-unit.input.js +0 -119
  456. package/src/lib/organization/dto/org-unit.input.js.map +0 -1
  457. package/src/lib/organization/dto/position.input.d.ts +0 -13
  458. package/src/lib/organization/dto/position.input.js +0 -70
  459. package/src/lib/organization/dto/position.input.js.map +0 -1
  460. package/src/lib/organization/index.js +0 -16
  461. package/src/lib/organization/index.js.map +0 -1
  462. package/src/lib/organization/json-metadata.d.ts +0 -1
  463. package/src/lib/organization/json-metadata.js +0 -14
  464. package/src/lib/organization/json-metadata.js.map +0 -1
  465. package/src/lib/organization/manager-resolution.entity.d.ts +0 -11
  466. package/src/lib/organization/manager-resolution.entity.js +0 -55
  467. package/src/lib/organization/manager-resolution.entity.js.map +0 -1
  468. package/src/lib/organization/membership.entity.d.ts +0 -11
  469. package/src/lib/organization/membership.entity.js +0 -60
  470. package/src/lib/organization/membership.entity.js.map +0 -1
  471. package/src/lib/organization/org-unit-tree-commit-result.object.d.ts +0 -4
  472. package/src/lib/organization/org-unit-tree-commit-result.object.js +0 -17
  473. package/src/lib/organization/org-unit-tree-commit-result.object.js.map +0 -1
  474. package/src/lib/organization/org-unit.entity.d.ts +0 -13
  475. package/src/lib/organization/org-unit.entity.js +0 -64
  476. package/src/lib/organization/org-unit.entity.js.map +0 -1
  477. package/src/lib/organization/organization-summary.object.d.ts +0 -6
  478. package/src/lib/organization/organization-summary.object.js +0 -28
  479. package/src/lib/organization/organization-summary.object.js.map +0 -1
  480. package/src/lib/organization/organization.enums.d.ts +0 -11
  481. package/src/lib/organization/organization.enums.js +0 -22
  482. package/src/lib/organization/organization.enums.js.map +0 -1
  483. package/src/lib/organization/organization.module.d.ts +0 -2
  484. package/src/lib/organization/organization.module.js +0 -35
  485. package/src/lib/organization/organization.module.js.map +0 -1
  486. package/src/lib/organization/organization.mutations.d.ts +0 -26
  487. package/src/lib/organization/organization.mutations.js +0 -148
  488. package/src/lib/organization/organization.mutations.js.map +0 -1
  489. package/src/lib/organization/organization.queries.d.ts +0 -23
  490. package/src/lib/organization/organization.queries.js +0 -204
  491. package/src/lib/organization/organization.queries.js.map +0 -1
  492. package/src/lib/organization/organization.service.d.ts +0 -103
  493. package/src/lib/organization/organization.service.js +0 -768
  494. package/src/lib/organization/organization.service.js.map +0 -1
  495. package/src/lib/organization/position.entity.d.ts +0 -9
  496. package/src/lib/organization/position.entity.js +0 -48
  497. package/src/lib/organization/position.entity.js.map +0 -1
  498. package/src/lib/organization/resolved-manager.object.d.ts +0 -4
  499. package/src/lib/organization/resolved-manager.object.js +0 -20
  500. package/src/lib/organization/resolved-manager.object.js.map +0 -1
  501. package/src/lib/signature/index.js +0 -8
  502. package/src/lib/signature/index.js.map +0 -1
  503. package/src/lib/signature/signature-options.d.ts +0 -33
  504. package/src/lib/signature/signature-options.js +0 -51
  505. package/src/lib/signature/signature-options.js.map +0 -1
  506. package/src/lib/signature/signature-verification.object.d.ts +0 -6
  507. package/src/lib/signature/signature-verification.object.js +0 -28
  508. package/src/lib/signature/signature-verification.object.js.map +0 -1
  509. package/src/lib/signature/signature.entity.d.ts +0 -16
  510. package/src/lib/signature/signature.entity.js +0 -88
  511. package/src/lib/signature/signature.entity.js.map +0 -1
  512. package/src/lib/signature/signature.module.d.ts +0 -11
  513. package/src/lib/signature/signature.module.js +0 -60
  514. package/src/lib/signature/signature.module.js.map +0 -1
  515. package/src/lib/signature/signature.queries.d.ts +0 -11
  516. package/src/lib/signature/signature.queries.js +0 -46
  517. package/src/lib/signature/signature.queries.js.map +0 -1
  518. package/src/lib/signature/signature.service.d.ts +0 -25
  519. package/src/lib/signature/signature.service.js +0 -124
  520. package/src/lib/signature/signature.service.js.map +0 -1
  521. package/src/lib/template/approval-template-category.entity.d.ts +0 -9
  522. package/src/lib/template/approval-template-category.entity.js +0 -49
  523. package/src/lib/template/approval-template-category.entity.js.map +0 -1
  524. package/src/lib/template/approval-template-version.entity.d.ts +0 -21
  525. package/src/lib/template/approval-template-version.entity.js +0 -106
  526. package/src/lib/template/approval-template-version.entity.js.map +0 -1
  527. package/src/lib/template/approval-template.entity.d.ts +0 -14
  528. package/src/lib/template/approval-template.entity.js +0 -74
  529. package/src/lib/template/approval-template.entity.js.map +0 -1
  530. package/src/lib/template/compose-approval-template.object.d.ts +0 -11
  531. package/src/lib/template/compose-approval-template.object.js +0 -36
  532. package/src/lib/template/compose-approval-template.object.js.map +0 -1
  533. package/src/lib/template/compose-template.mutations.d.ts +0 -8
  534. package/src/lib/template/compose-template.mutations.js +0 -32
  535. package/src/lib/template/compose-template.mutations.js.map +0 -1
  536. package/src/lib/template/dto/approval-template.input.d.ts +0 -36
  537. package/src/lib/template/dto/approval-template.input.js +0 -187
  538. package/src/lib/template/dto/approval-template.input.js.map +0 -1
  539. package/src/lib/template/dto/compose-approval-template.input.d.ts +0 -17
  540. package/src/lib/template/dto/compose-approval-template.input.js +0 -99
  541. package/src/lib/template/dto/compose-approval-template.input.js.map +0 -1
  542. package/src/lib/template/index.js +0 -14
  543. package/src/lib/template/index.js.map +0 -1
  544. package/src/lib/template/template.enums.d.ts +0 -14
  545. package/src/lib/template/template.enums.js +0 -31
  546. package/src/lib/template/template.enums.js.map +0 -1
  547. package/src/lib/template/template.module.d.ts +0 -2
  548. package/src/lib/template/template.module.js +0 -41
  549. package/src/lib/template/template.module.js.map +0 -1
  550. package/src/lib/template/template.mutations.d.ts +0 -20
  551. package/src/lib/template/template.mutations.js +0 -139
  552. package/src/lib/template/template.mutations.js.map +0 -1
  553. package/src/lib/template/template.queries.d.ts +0 -16
  554. package/src/lib/template/template.queries.js +0 -133
  555. package/src/lib/template/template.queries.js.map +0 -1
  556. package/src/lib/template/template.service.d.ts +0 -83
  557. package/src/lib/template/template.service.js +0 -654
  558. package/src/lib/template/template.service.js.map +0 -1
  559. package/src/lib/template/workflow-definition.validator.d.ts +0 -9
  560. package/src/lib/template/workflow-definition.validator.js +0 -362
  561. package/src/lib/template/workflow-definition.validator.js.map +0 -1
  562. package/src/lib/testing/cel-js.jest.d.ts +0 -15
  563. package/src/lib/testing/cel-js.jest.js +0 -27
  564. package/src/lib/testing/cel-js.jest.js.map +0 -1
  565. package/src/lib/workflow-engine/activity-log.entity.d.ts +0 -12
  566. package/src/lib/workflow-engine/activity-log.entity.js +0 -62
  567. package/src/lib/workflow-engine/activity-log.entity.js.map +0 -1
  568. package/src/lib/workflow-engine/adhoc-directive.entity.d.ts +0 -31
  569. package/src/lib/workflow-engine/adhoc-directive.entity.js +0 -105
  570. package/src/lib/workflow-engine/adhoc-directive.entity.js.map +0 -1
  571. package/src/lib/workflow-engine/adhoc.enums.d.ts +0 -21
  572. package/src/lib/workflow-engine/adhoc.enums.js +0 -42
  573. package/src/lib/workflow-engine/adhoc.enums.js.map +0 -1
  574. package/src/lib/workflow-engine/approval-instance-page-info.object.d.ts +0 -8
  575. package/src/lib/workflow-engine/approval-instance-page-info.object.js +0 -36
  576. package/src/lib/workflow-engine/approval-instance-page-info.object.js.map +0 -1
  577. package/src/lib/workflow-engine/approval-instance.entity.d.ts +0 -22
  578. package/src/lib/workflow-engine/approval-instance.entity.js +0 -113
  579. package/src/lib/workflow-engine/approval-instance.entity.js.map +0 -1
  580. package/src/lib/workflow-engine/dto/adhoc-notification.input.d.ts +0 -6
  581. package/src/lib/workflow-engine/dto/adhoc-notification.input.js +0 -28
  582. package/src/lib/workflow-engine/dto/adhoc-notification.input.js.map +0 -1
  583. package/src/lib/workflow-engine/dto/adhoc-target.input.d.ts +0 -16
  584. package/src/lib/workflow-engine/dto/adhoc-target.input.js +0 -61
  585. package/src/lib/workflow-engine/dto/adhoc-target.input.js.map +0 -1
  586. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.d.ts +0 -5
  587. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js +0 -29
  588. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js.map +0 -1
  589. package/src/lib/workflow-engine/dto/decide-task.input.d.ts +0 -9
  590. package/src/lib/workflow-engine/dto/decide-task.input.js +0 -47
  591. package/src/lib/workflow-engine/dto/decide-task.input.js.map +0 -1
  592. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.d.ts +0 -6
  593. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js +0 -34
  594. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js.map +0 -1
  595. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +0 -6
  596. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +0 -34
  597. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +0 -1
  598. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +0 -7
  599. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +0 -40
  600. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +0 -1
  601. package/src/lib/workflow-engine/index.js +0 -28
  602. package/src/lib/workflow-engine/index.js.map +0 -1
  603. package/src/lib/workflow-engine/task-candidate.entity.d.ts +0 -14
  604. package/src/lib/workflow-engine/task-candidate.entity.js +0 -72
  605. package/src/lib/workflow-engine/task-candidate.entity.js.map +0 -1
  606. package/src/lib/workflow-engine/task-decision.entity.d.ts +0 -12
  607. package/src/lib/workflow-engine/task-decision.entity.js +0 -60
  608. package/src/lib/workflow-engine/task-decision.entity.js.map +0 -1
  609. package/src/lib/workflow-engine/task.entity.d.ts +0 -25
  610. package/src/lib/workflow-engine/task.entity.js +0 -130
  611. package/src/lib/workflow-engine/task.entity.js.map +0 -1
  612. package/src/lib/workflow-engine/workflow-condition-evaluator.d.ts +0 -5
  613. package/src/lib/workflow-engine/workflow-condition-evaluator.js +0 -107
  614. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +0 -1
  615. package/src/lib/workflow-engine/workflow-dashboard-summary.object.d.ts +0 -8
  616. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js +0 -36
  617. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js.map +0 -1
  618. package/src/lib/workflow-engine/workflow-dry-run.object.d.ts +0 -21
  619. package/src/lib/workflow-engine/workflow-dry-run.object.js +0 -86
  620. package/src/lib/workflow-engine/workflow-dry-run.object.js.map +0 -1
  621. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +0 -61
  622. package/src/lib/workflow-engine/workflow-engine.enums.js +0 -98
  623. package/src/lib/workflow-engine/workflow-engine.enums.js.map +0 -1
  624. package/src/lib/workflow-engine/workflow-engine.module.d.ts +0 -9
  625. package/src/lib/workflow-engine/workflow-engine.module.js +0 -78
  626. package/src/lib/workflow-engine/workflow-engine.module.js.map +0 -1
  627. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +0 -29
  628. package/src/lib/workflow-engine/workflow-engine.mutations.js +0 -218
  629. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +0 -1
  630. package/src/lib/workflow-engine/workflow-engine.queries.d.ts +0 -31
  631. package/src/lib/workflow-engine/workflow-engine.queries.js +0 -237
  632. package/src/lib/workflow-engine/workflow-engine.queries.js.map +0 -1
  633. package/src/lib/workflow-engine/workflow-engine.service.d.ts +0 -188
  634. package/src/lib/workflow-engine/workflow-engine.service.js +0 -3561
  635. package/src/lib/workflow-engine/workflow-engine.service.js.map +0 -1
  636. package/src/lib/workflow-engine/workflow-engine.tokens.js +0 -5
  637. package/src/lib/workflow-engine/workflow-engine.tokens.js.map +0 -1
  638. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.d.ts +0 -18
  639. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +0 -39
  640. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +0 -1
  641. package/src/lib/workflow-engine/workflow-token.entity.d.ts +0 -10
  642. package/src/lib/workflow-engine/workflow-token.entity.js +0 -50
  643. package/src/lib/workflow-engine/workflow-token.entity.js.map +0 -1
  644. /package/src/{index.d.ts → index.ts} +0 -0
  645. /package/src/lib/attachment/{index.d.ts → index.ts} +0 -0
  646. /package/src/lib/bpm/{index.d.ts → index.ts} +0 -0
  647. /package/src/lib/bpm-auth/{index.d.ts → index.ts} +0 -0
  648. /package/src/lib/common/{index.d.ts → index.ts} +0 -0
  649. /package/src/lib/condition/{index.d.ts → index.ts} +0 -0
  650. /package/src/lib/database/{index.d.ts → index.ts} +0 -0
  651. /package/src/lib/delegation/{index.d.ts → index.ts} +0 -0
  652. /package/src/lib/form/{index.d.ts → index.ts} +0 -0
  653. /package/src/lib/identity/{index.d.ts → index.ts} +0 -0
  654. /package/src/lib/notification/{index.d.ts → index.ts} +0 -0
  655. /package/src/lib/organization/{index.d.ts → index.ts} +0 -0
  656. /package/src/lib/signature/{index.d.ts → index.ts} +0 -0
  657. /package/src/lib/template/{index.d.ts → index.ts} +0 -0
  658. /package/src/lib/workflow-engine/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,277 @@
1
+ import { Inject, Injectable, Optional } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { In, Repository } from 'typeorm';
4
+ import { MemberMetadata } from '@rytass/bpm-core-shared';
5
+ import {
6
+ BPM_IDENTITY_OPTIONS,
7
+ BPMResolvedIdentityOptions,
8
+ DEFAULT_BPM_IDENTITY_OPTIONS,
9
+ } from './identity-options';
10
+ import { MemberMetadataCacheEntity } from './member-metadata-cache.entity';
11
+ import { MEMBER_RESOLVER, MemberResolver } from './member-resolver.interface';
12
+
13
+ const DEFAULT_MEMBER_PAGE = 1;
14
+ const DEFAULT_MEMBER_PAGE_SIZE = 10;
15
+ const MAX_MEMBER_PAGE_SIZE = 100;
16
+
17
+ interface SearchMembersOptions {
18
+ readonly page?: number;
19
+ readonly pageSize?: number;
20
+ }
21
+
22
+ const normalizePage = (page?: number): number =>
23
+ Number.isInteger(page) && page !== undefined && page > 0
24
+ ? page
25
+ : DEFAULT_MEMBER_PAGE;
26
+
27
+ const normalizePageSize = (pageSize?: number): number => {
28
+ if (!Number.isInteger(pageSize) || pageSize === undefined || pageSize <= 0) {
29
+ return DEFAULT_MEMBER_PAGE_SIZE;
30
+ }
31
+
32
+ return Math.min(pageSize, MAX_MEMBER_PAGE_SIZE);
33
+ };
34
+
35
+ const paginateMembers = (
36
+ members: readonly MemberMetadata[],
37
+ options: SearchMembersOptions,
38
+ ): readonly MemberMetadata[] => {
39
+ const page = normalizePage(options.page);
40
+ const pageSize = normalizePageSize(options.pageSize);
41
+ const offset = (page - 1) * pageSize;
42
+
43
+ return members.slice(offset, offset + pageSize);
44
+ };
45
+
46
+ @Injectable()
47
+ export class IdentityService {
48
+ constructor(
49
+ @InjectRepository(MemberMetadataCacheEntity)
50
+ private readonly cacheRepository: Repository<MemberMetadataCacheEntity>,
51
+ @Inject(MEMBER_RESOLVER)
52
+ private readonly memberResolver: MemberResolver,
53
+ @Optional()
54
+ @Inject(BPM_IDENTITY_OPTIONS)
55
+ private readonly identityOptions: BPMResolvedIdentityOptions = DEFAULT_BPM_IDENTITY_OPTIONS,
56
+ ) {}
57
+
58
+ async resolveMember(memberId: string): Promise<MemberMetadata> {
59
+ const now = new Date();
60
+ const cached = await this.cacheRepository.findOne({ where: { memberId } });
61
+
62
+ if (cached && cached.expiresAt > now) {
63
+ return cached.metadata;
64
+ }
65
+
66
+ const metadata = await this.memberResolver.resolve(memberId);
67
+ const fetchedAt = now;
68
+ const expiresAt = new Date(
69
+ now.getTime() + this.identityOptions.memberMetadataCacheTtlMs,
70
+ );
71
+
72
+ const cacheEntity = cached ?? new MemberMetadataCacheEntity();
73
+ cacheEntity.fetchedAt = fetchedAt;
74
+ cacheEntity.expiresAt = expiresAt;
75
+ cacheEntity.memberId = memberId;
76
+ cacheEntity.metadata = metadata;
77
+
78
+ await this.cacheRepository.save(cacheEntity);
79
+
80
+ return metadata;
81
+ }
82
+
83
+ async resolveMembers(
84
+ memberIds: readonly string[],
85
+ ): Promise<readonly MemberMetadata[]> {
86
+ const uniqueMemberIds = [...new Set(memberIds)].filter(
87
+ (memberId) => memberId.length > 0,
88
+ );
89
+
90
+ if (uniqueMemberIds.length === 0) {
91
+ return [];
92
+ }
93
+
94
+ const now = new Date();
95
+ const cachedRows = await this.cacheRepository.find({
96
+ where: { memberId: In([...uniqueMemberIds]) },
97
+ });
98
+ const cacheEntityByMemberId = new Map(
99
+ cachedRows.map((row): readonly [string, MemberMetadataCacheEntity] => [
100
+ row.memberId,
101
+ row,
102
+ ]),
103
+ );
104
+ const metadataByMemberId = new Map<string, MemberMetadata>();
105
+ const staleMemberIds: string[] = [];
106
+
107
+ for (const memberId of uniqueMemberIds) {
108
+ const cached = cacheEntityByMemberId.get(memberId);
109
+
110
+ if (cached && cached.expiresAt > now) {
111
+ metadataByMemberId.set(memberId, cached.metadata);
112
+ } else {
113
+ staleMemberIds.push(memberId);
114
+ }
115
+ }
116
+
117
+ if (staleMemberIds.length > 0) {
118
+ const resolvedMap =
119
+ await this.memberResolver.resolveMany(staleMemberIds);
120
+ const expiresAt = new Date(
121
+ now.getTime() + this.identityOptions.memberMetadataCacheTtlMs,
122
+ );
123
+ const entitiesToSave: MemberMetadataCacheEntity[] = [];
124
+
125
+ for (const memberId of staleMemberIds) {
126
+ const metadata = resolvedMap.get(memberId);
127
+
128
+ if (!metadata) {
129
+ continue;
130
+ }
131
+
132
+ const cacheEntity =
133
+ cacheEntityByMemberId.get(memberId) ??
134
+ new MemberMetadataCacheEntity();
135
+
136
+ cacheEntity.memberId = memberId;
137
+ cacheEntity.metadata = metadata;
138
+ cacheEntity.fetchedAt = now;
139
+ cacheEntity.expiresAt = expiresAt;
140
+
141
+ entitiesToSave.push(cacheEntity);
142
+ metadataByMemberId.set(memberId, metadata);
143
+ }
144
+
145
+ if (entitiesToSave.length > 0) {
146
+ await this.cacheRepository.save(entitiesToSave);
147
+ }
148
+ }
149
+
150
+ return memberIds
151
+ .map((memberId) => metadataByMemberId.get(memberId))
152
+ .filter((metadata): metadata is MemberMetadata => Boolean(metadata));
153
+ }
154
+
155
+ async listCachedMembers(): Promise<readonly MemberMetadataCacheEntity[]> {
156
+ return this.cacheRepository.find({ order: { memberId: 'ASC' } });
157
+ }
158
+
159
+ async countMembers(searchText: string): Promise<number> {
160
+ if (this.memberResolver.searchPaged) {
161
+ const page = await this.memberResolver.searchPaged(searchText, {
162
+ page: DEFAULT_MEMBER_PAGE,
163
+ pageSize: 1,
164
+ });
165
+
166
+ return page.total;
167
+ }
168
+
169
+ const members = await this.searchAllMembers(searchText);
170
+
171
+ return members.length;
172
+ }
173
+
174
+ async searchMembers(
175
+ searchText: string,
176
+ options: SearchMembersOptions = {},
177
+ ): Promise<readonly MemberMetadata[]> {
178
+ const wantsPagination =
179
+ options.page !== undefined || options.pageSize !== undefined;
180
+
181
+ if (wantsPagination && this.memberResolver.searchPaged) {
182
+ const page = await this.memberResolver.searchPaged(searchText, {
183
+ page: normalizePage(options.page),
184
+ pageSize: normalizePageSize(options.pageSize),
185
+ });
186
+
187
+ await this.cacheMemberMetadata(page.items);
188
+
189
+ return page.items;
190
+ }
191
+
192
+ const members = await this.searchAllMembers(searchText);
193
+
194
+ if (!wantsPagination) {
195
+ return members;
196
+ }
197
+
198
+ return paginateMembers(members, options);
199
+ }
200
+
201
+ /**
202
+ * Backfills the per-id `member_metadata_cache` rows for members
203
+ * returned by a paged search, reusing the same row entities and TTL as
204
+ * `resolveMany`. Unlike `resolveMany` (which only rewrites rows it had
205
+ * to re-fetch), every returned member is refreshed here since a paged
206
+ * search always carries authoritative host data. The page query itself
207
+ * is never row-cached; only the individual member metadata is.
208
+ */
209
+ private async cacheMemberMetadata(
210
+ members: readonly MemberMetadata[],
211
+ ): Promise<void> {
212
+ if (members.length === 0) {
213
+ return;
214
+ }
215
+
216
+ const now = new Date();
217
+ const expiresAt = new Date(
218
+ now.getTime() + this.identityOptions.memberMetadataCacheTtlMs,
219
+ );
220
+ const memberIds = members.map((member) => member.memberId);
221
+ const existingRows = await this.cacheRepository.find({
222
+ where: { memberId: In([...memberIds]) },
223
+ });
224
+ const existingRowByMemberId = new Map(
225
+ existingRows.map((row): readonly [string, MemberMetadataCacheEntity] => [
226
+ row.memberId,
227
+ row,
228
+ ]),
229
+ );
230
+ const seenMemberIds = new Set<string>();
231
+ const entitiesToSave: MemberMetadataCacheEntity[] = [];
232
+
233
+ for (const metadata of members) {
234
+ if (seenMemberIds.has(metadata.memberId)) {
235
+ continue;
236
+ }
237
+
238
+ seenMemberIds.add(metadata.memberId);
239
+
240
+ const cacheEntity =
241
+ existingRowByMemberId.get(metadata.memberId) ??
242
+ new MemberMetadataCacheEntity();
243
+
244
+ cacheEntity.memberId = metadata.memberId;
245
+ cacheEntity.metadata = metadata;
246
+ cacheEntity.fetchedAt = now;
247
+ cacheEntity.expiresAt = expiresAt;
248
+
249
+ entitiesToSave.push(cacheEntity);
250
+ }
251
+
252
+ await this.cacheRepository.save(entitiesToSave);
253
+ }
254
+
255
+ private async searchAllMembers(
256
+ searchText: string,
257
+ ): Promise<readonly MemberMetadata[]> {
258
+ if (this.memberResolver.search) {
259
+ return this.memberResolver.search(searchText);
260
+ }
261
+
262
+ const normalizedSearchText = searchText.trim().toLocaleLowerCase();
263
+ const cachedMembers = await this.listCachedMembers();
264
+
265
+ return cachedMembers
266
+ .map((member) => member.metadata)
267
+ .filter((metadata) => {
268
+ if (!normalizedSearchText) {
269
+ return true;
270
+ }
271
+
272
+ return [metadata.email, metadata.memberId, metadata.name].some(
273
+ (value) => value.toLocaleLowerCase().includes(normalizedSearchText),
274
+ );
275
+ });
276
+ }
277
+ }
@@ -0,0 +1,122 @@
1
+ import {
2
+ BPMMemberBaseResolverAdapter,
3
+ createBPMAuthContextFromMemberBaseMember,
4
+ } from './member-base.adapter';
5
+
6
+ interface TestMemberBaseMember {
7
+ readonly email: string;
8
+ readonly id: string;
9
+ readonly name: string;
10
+ readonly permissions: readonly string[];
11
+ readonly roles: readonly string[];
12
+ }
13
+
14
+ describe('member-base adapter', () => {
15
+ it('creates BPM auth context from a host member-base member', (): void => {
16
+ const context = createBPMAuthContextFromMemberBaseMember(
17
+ createMember('member-001'),
18
+ {
19
+ readCustomFields: (member): Readonly<Record<string, unknown>> => ({
20
+ source: 'member-base',
21
+ tenantMemberId: member.id,
22
+ }),
23
+ readPermissions: (member): readonly string[] => member.permissions,
24
+ readRoles: (member): readonly string[] => member.roles,
25
+ },
26
+ );
27
+
28
+ expect(context).toEqual({
29
+ memberId: 'member-001',
30
+ metadata: {
31
+ source: 'member-base',
32
+ tenantMemberId: 'member-001',
33
+ },
34
+ permissions: ['bpm:approve'],
35
+ roles: ['approver'],
36
+ });
37
+ });
38
+
39
+ it('adapts member-base lookup and search to BPM member metadata', async (): Promise<void> => {
40
+ const members = [createMember('member-001'), createMember('member-002')];
41
+ const resolver = new BPMMemberBaseResolverAdapter<TestMemberBaseMember>({
42
+ resolveMember: (memberId): Promise<TestMemberBaseMember | null> =>
43
+ Promise.resolve(
44
+ members.find((member) => member.id === memberId) ?? null,
45
+ ),
46
+ searchMembers: (searchText): Promise<readonly TestMemberBaseMember[]> =>
47
+ Promise.resolve(
48
+ members.filter((member) => member.email.includes(searchText)),
49
+ ),
50
+ });
51
+
52
+ await expect(resolver.resolve('member-001')).resolves.toEqual({
53
+ customFields: {},
54
+ email: 'member-001@example.com',
55
+ memberId: 'member-001',
56
+ name: 'Member member-001',
57
+ });
58
+ await expect(resolver.search?.('member-002')).resolves.toEqual([
59
+ {
60
+ customFields: {},
61
+ email: 'member-002@example.com',
62
+ memberId: 'member-002',
63
+ name: 'Member member-002',
64
+ },
65
+ ]);
66
+ });
67
+
68
+ it('leaves searchPaged undefined when the directory does not implement searchMembersPaged', (): void => {
69
+ const resolver = new BPMMemberBaseResolverAdapter<TestMemberBaseMember>({
70
+ resolveMember: (): Promise<TestMemberBaseMember | null> =>
71
+ Promise.resolve(null),
72
+ });
73
+
74
+ expect(resolver.searchPaged).toBeUndefined();
75
+ });
76
+
77
+ it('delegates searchPaged to the directory and maps items to member metadata', async (): Promise<void> => {
78
+ const members = [
79
+ createMember('member-001'),
80
+ createMember('member-002'),
81
+ createMember('member-003'),
82
+ ];
83
+ const resolver = new BPMMemberBaseResolverAdapter<TestMemberBaseMember>({
84
+ resolveMember: (memberId): Promise<TestMemberBaseMember | null> =>
85
+ Promise.resolve(
86
+ members.find((member) => member.id === memberId) ?? null,
87
+ ),
88
+ searchMembersPaged: (_searchText, options) => {
89
+ const offset = (options.page - 1) * options.pageSize;
90
+
91
+ return Promise.resolve({
92
+ items: members.slice(offset, offset + options.pageSize),
93
+ total: members.length,
94
+ });
95
+ },
96
+ });
97
+
98
+ await expect(
99
+ resolver.searchPaged?.('', { page: 2, pageSize: 2 }),
100
+ ).resolves.toEqual({
101
+ items: [
102
+ {
103
+ customFields: {},
104
+ email: 'member-003@example.com',
105
+ memberId: 'member-003',
106
+ name: 'Member member-003',
107
+ },
108
+ ],
109
+ total: 3,
110
+ });
111
+ });
112
+ });
113
+
114
+ function createMember(id: string): TestMemberBaseMember {
115
+ return {
116
+ email: `${id}@example.com`,
117
+ id,
118
+ name: `Member ${id}`,
119
+ permissions: ['bpm:approve'],
120
+ roles: ['approver'],
121
+ };
122
+ }
@@ -0,0 +1,302 @@
1
+ import { InjectionToken, Provider } from '@nestjs/common';
2
+ import { MemberMetadata } from '@rytass/bpm-core-shared';
3
+ import { BPMAuthContext } from '../bpm-auth';
4
+ import {
5
+ BPMMemberResolver,
6
+ BPMMemberSearchPage,
7
+ BPMMemberSearchPageOptions,
8
+ } from './member-resolver.interface';
9
+
10
+ /**
11
+ * Structural contract a host identity backend should implement (or a thin
12
+ * adapter wrap) so BPM can be plugged into any `member-base`-style
13
+ * directory without coupling `@rytass/bpm-core-nestjs-module` to a
14
+ * specific identity package.
15
+ *
16
+ * `TMember` is the host's own member shape; the adapter walks it through
17
+ * {@link BPMMemberBaseAdapterOptions} field readers.
18
+ */
19
+ export interface BPMMemberBaseDirectory<TMember> {
20
+ readonly resolveMember: (memberId: string) => Promise<TMember | null>;
21
+ readonly resolveMembers?: (
22
+ memberIds: readonly string[],
23
+ ) => Promise<readonly TMember[]>;
24
+ readonly searchMembers?: (searchText: string) => Promise<readonly TMember[]>;
25
+ /**
26
+ * Optional paged directory search. Implement this (in addition to, or
27
+ * instead of, `searchMembers`) to let BPM page through a directory
28
+ * larger than `searchMembers`' member-picker cap and report an
29
+ * accurate total on the admin members list. `page` is 1-based and
30
+ * already normalized/clamped by BPM. Return the requested slice as
31
+ * `items` and the full match count as `total`. When omitted, the
32
+ * adapter's `searchPaged` stays `undefined` and BPM falls back to the
33
+ * `searchMembers`-and-slice path.
34
+ */
35
+ readonly searchMembersPaged?: (
36
+ searchText: string,
37
+ options: BPMMemberSearchPageOptions,
38
+ ) => Promise<BPMMemberBaseSearchPage<TMember>>;
39
+ }
40
+
41
+ /**
42
+ * Host-shaped page returned by
43
+ * {@link BPMMemberBaseDirectory.searchMembersPaged}. The adapter maps
44
+ * each `TMember` in `items` through the field readers into
45
+ * {@link MemberMetadata} and forwards `total` unchanged.
46
+ */
47
+ export interface BPMMemberBaseSearchPage<TMember> {
48
+ readonly items: readonly TMember[];
49
+ readonly total: number;
50
+ }
51
+
52
+ /**
53
+ * Per-host field readers that tell the adapter how to extract canonical
54
+ * BPM fields out of the host's `TMember`. Each reader is optional;
55
+ * sensible defaults are inferred when the host uses common conventions
56
+ * (`memberId` / `id` / `sub` for the member id, `email` for the email,
57
+ * `name` / `displayName` for the name, etc.).
58
+ *
59
+ * Provide `readPermissions` and `readRoles` if you want BPM's
60
+ * `BPMAdminGuard` / `BPMDesignerGuard` to receive the host's RBAC
61
+ * strings; otherwise the resolved `BPMAuthContext` will carry empty
62
+ * arrays.
63
+ */
64
+ export interface BPMMemberBaseAdapterOptions<TMember> {
65
+ readonly readCustomFields?: (
66
+ member: TMember,
67
+ ) => Readonly<Record<string, unknown>>;
68
+ readonly readEmail?: (member: TMember) => string | null;
69
+ readonly readMemberId?: (member: TMember) => string | null;
70
+ readonly readName?: (member: TMember) => string | null;
71
+ readonly readPermissions?: (member: TMember) => readonly string[];
72
+ readonly readRoles?: (member: TMember) => readonly string[];
73
+ }
74
+
75
+ export interface BPMMemberBaseResolverProviderOptions<TMember> {
76
+ readonly adapterOptions?: BPMMemberBaseAdapterOptions<TMember>;
77
+ readonly directoryToken: InjectionToken<BPMMemberBaseDirectory<TMember>>;
78
+ readonly provide: InjectionToken<BPMMemberResolver>;
79
+ }
80
+
81
+ export class BPMMemberBaseResolverAdapter<TMember>
82
+ implements BPMMemberResolver
83
+ {
84
+ /**
85
+ * Present only when the wrapped directory implements
86
+ * `searchMembersPaged`. Left `undefined` otherwise so `IdentityService`
87
+ * capability detection falls back to the `search`-and-slice path,
88
+ * preserving pre-0.5.0 behavior.
89
+ */
90
+ readonly searchPaged?: (
91
+ searchText: string,
92
+ options: BPMMemberSearchPageOptions,
93
+ ) => Promise<BPMMemberSearchPage>;
94
+
95
+ constructor(
96
+ private readonly directory: BPMMemberBaseDirectory<TMember>,
97
+ private readonly options: BPMMemberBaseAdapterOptions<TMember> = {},
98
+ ) {
99
+ const searchMembersPaged = directory.searchMembersPaged;
100
+
101
+ if (searchMembersPaged) {
102
+ this.searchPaged = async (
103
+ searchText: string,
104
+ pageOptions: BPMMemberSearchPageOptions,
105
+ ): Promise<BPMMemberSearchPage> => {
106
+ const page = await searchMembersPaged(searchText, pageOptions);
107
+
108
+ return {
109
+ items: page.items.map((member): MemberMetadata =>
110
+ readMemberMetadataFromMemberBaseMember(member, this.options),
111
+ ),
112
+ total: page.total,
113
+ };
114
+ };
115
+ }
116
+ }
117
+
118
+ async resolve(memberId: string): Promise<MemberMetadata> {
119
+ const member = await this.directory.resolveMember(memberId);
120
+
121
+ if (!member) {
122
+ throw new Error(`member-base member ${memberId} was not found`);
123
+ }
124
+
125
+ return readMemberMetadataFromMemberBaseMember(member, this.options);
126
+ }
127
+
128
+ async resolveMany(
129
+ memberIds: readonly string[],
130
+ ): Promise<ReadonlyMap<string, MemberMetadata>> {
131
+ const members = this.directory.resolveMembers
132
+ ? await this.directory.resolveMembers(memberIds)
133
+ : await Promise.all(
134
+ memberIds.map((memberId): Promise<TMember | null> =>
135
+ this.directory.resolveMember(memberId),
136
+ ),
137
+ );
138
+
139
+ return members
140
+ .filter((member): member is TMember => Boolean(member))
141
+ .map((member): MemberMetadata =>
142
+ readMemberMetadataFromMemberBaseMember(member, this.options),
143
+ )
144
+ .reduce<ReadonlyMap<string, MemberMetadata>>(
145
+ (metadataByMemberId, metadata): ReadonlyMap<string, MemberMetadata> =>
146
+ new Map(metadataByMemberId).set(metadata.memberId, metadata),
147
+ new Map(),
148
+ );
149
+ }
150
+
151
+ async search(searchText: string): Promise<readonly MemberMetadata[]> {
152
+ if (!this.directory.searchMembers) {
153
+ return [];
154
+ }
155
+
156
+ return (await this.directory.searchMembers(searchText)).map(
157
+ (member): MemberMetadata =>
158
+ readMemberMetadataFromMemberBaseMember(member, this.options),
159
+ );
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Helper for hosts that already hold an authenticated `TMember` (for
165
+ * example from `@rytass/member-base-nestjs-module`) and want to project it
166
+ * into a {@link BPMAuthContext} without writing the boilerplate by hand.
167
+ *
168
+ * Returns `null` when the input is nullish or when the member is missing
169
+ * an id — never throws. Pair this with `BPMRootModuleOptions.authContextFactory`
170
+ * so BPM resolvers receive the projected context on every request.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const bpmAuth = createBPMAuthContextFromMemberBaseMember(memberBaseUser, {
175
+ * readRoles: (m) => m.roles,
176
+ * readPermissions: (m) => m.permissions,
177
+ * readCustomFields: (m) => ({ tenantId: m.tenantId }),
178
+ * });
179
+ * ```
180
+ */
181
+ export function createBPMAuthContextFromMemberBaseMember<TMember>(
182
+ member: TMember | null | undefined,
183
+ options: BPMMemberBaseAdapterOptions<TMember> = {},
184
+ ): BPMAuthContext | null {
185
+ if (!member) {
186
+ return null;
187
+ }
188
+
189
+ const memberId = readMemberId(member, options);
190
+
191
+ return memberId
192
+ ? {
193
+ memberId,
194
+ metadata: options.readCustomFields?.(member) ?? {},
195
+ permissions: options.readPermissions?.(member) ?? [],
196
+ roles: options.readRoles?.(member) ?? [],
197
+ }
198
+ : null;
199
+ }
200
+
201
+ /**
202
+ * Builds a Nest `Provider` that adapts a host-provided
203
+ * {@link BPMMemberBaseDirectory} into a {@link BPMMemberResolver}, then
204
+ * registers it under the host-chosen injection token (typically
205
+ * {@link BPM_MEMBER_RESOLVER}).
206
+ *
207
+ * Pass the result inside `BPMRootModuleOptions.memberResolverProvider`.
208
+ *
209
+ * @example
210
+ * ```ts
211
+ * BPMRootModule.forRoot({
212
+ * memberResolverProvider: createBPMMemberBaseResolverProvider({
213
+ * provide: BPM_MEMBER_RESOLVER,
214
+ * directoryToken: HOST_MEMBER_DIRECTORY,
215
+ * adapterOptions: {
216
+ * readEmail: (m) => m.email,
217
+ * readName: (m) => m.name,
218
+ * },
219
+ * }),
220
+ * // ...
221
+ * });
222
+ * ```
223
+ */
224
+ export function createBPMMemberBaseResolverProvider<TMember>({
225
+ adapterOptions,
226
+ directoryToken,
227
+ provide,
228
+ }: BPMMemberBaseResolverProviderOptions<TMember>): Provider<BPMMemberResolver> {
229
+ return {
230
+ inject: [directoryToken],
231
+ provide,
232
+ useFactory: (
233
+ directory: BPMMemberBaseDirectory<TMember>,
234
+ ): BPMMemberResolver =>
235
+ new BPMMemberBaseResolverAdapter(directory, adapterOptions),
236
+ };
237
+ }
238
+
239
+ export function readMemberMetadataFromMemberBaseMember<TMember>(
240
+ member: TMember,
241
+ options: BPMMemberBaseAdapterOptions<TMember> = {},
242
+ ): MemberMetadata {
243
+ const memberId = readMemberId(member, options);
244
+
245
+ if (!memberId) {
246
+ throw new Error('member-base member id is required for BPM integration');
247
+ }
248
+
249
+ return {
250
+ customFields: options.readCustomFields?.(member) ?? {},
251
+ email: readMemberEmail(member, options) ?? '',
252
+ memberId,
253
+ name: readMemberName(member, options) ?? memberId,
254
+ };
255
+ }
256
+
257
+ function readMemberId<TMember>(
258
+ member: TMember,
259
+ options: BPMMemberBaseAdapterOptions<TMember>,
260
+ ): string | null {
261
+ return (
262
+ normalizeText(options.readMemberId?.(member)) ??
263
+ readStringProperty(member, 'memberId') ??
264
+ readStringProperty(member, 'id') ??
265
+ readStringProperty(member, 'sub')
266
+ );
267
+ }
268
+
269
+ function readMemberEmail<TMember>(
270
+ member: TMember,
271
+ options: BPMMemberBaseAdapterOptions<TMember>,
272
+ ): string | null {
273
+ return normalizeText(options.readEmail?.(member)) ?? readStringProperty(member, 'email');
274
+ }
275
+
276
+ function readMemberName<TMember>(
277
+ member: TMember,
278
+ options: BPMMemberBaseAdapterOptions<TMember>,
279
+ ): string | null {
280
+ return (
281
+ normalizeText(options.readName?.(member)) ??
282
+ readStringProperty(member, 'name') ??
283
+ readStringProperty(member, 'displayName') ??
284
+ readMemberEmail(member, options)
285
+ );
286
+ }
287
+
288
+ function readStringProperty(value: unknown, key: string): string | null {
289
+ if (!isRecord(value)) {
290
+ return null;
291
+ }
292
+
293
+ return normalizeText(value[key]);
294
+ }
295
+
296
+ function normalizeText(value: unknown): string | null {
297
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
298
+ }
299
+
300
+ function isRecord(value: unknown): value is Readonly<Record<string, unknown>> {
301
+ return typeof value === 'object' && value !== null;
302
+ }