@tstdl/base 0.93.182 → 0.93.183

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 (353) hide show
  1. package/api/server/api-request-token.provider.js +1 -1
  2. package/api/server/gateway.js +6 -1
  3. package/authentication/authentication.api.d.ts +13 -40
  4. package/authentication/authentication.api.js +5 -14
  5. package/authentication/client/authentication.service.d.ts +6 -14
  6. package/authentication/client/authentication.service.js +22 -4
  7. package/authentication/client/module.d.ts +1 -1
  8. package/authentication/client/module.js +4 -4
  9. package/authentication/models/index.d.ts +1 -0
  10. package/authentication/models/index.js +1 -0
  11. package/authentication/models/totp-results.model.d.ts +11 -0
  12. package/authentication/models/totp-results.model.js +37 -0
  13. package/authentication/server/authentication.api-controller.d.ts +3 -3
  14. package/authentication/server/authentication.api-controller.js +31 -4
  15. package/authentication/server/authentication.service.d.ts +5 -14
  16. package/authentication/server/authentication.service.js +6 -4
  17. package/core.d.ts +0 -5
  18. package/core.js +0 -8
  19. package/document-management/api/document-management.api.d.ts +2 -2
  20. package/document-management/service-models/document.service-model.d.ts +1 -1
  21. package/examples/config.d.ts +25 -0
  22. package/examples/config.js +26 -0
  23. package/notification/server/module.d.ts +1 -1
  24. package/notification/server/module.js +1 -1
  25. package/package.json +5 -5
  26. package/signals/api.d.ts +5 -1
  27. package/signals/api.js +3 -1
  28. package/signals/implementation/api.d.ts +13 -5
  29. package/signals/implementation/api.js +7 -1
  30. package/signals/implementation/asserts.d.ts +2 -2
  31. package/signals/implementation/asserts.js +3 -3
  32. package/signals/implementation/computed.d.ts +7 -34
  33. package/signals/implementation/computed.js +14 -83
  34. package/signals/implementation/configure.js +6 -2
  35. package/signals/implementation/effect.d.ts +65 -46
  36. package/signals/implementation/effect.js +97 -62
  37. package/signals/implementation/index.d.ts +2 -4
  38. package/signals/implementation/index.js +2 -4
  39. package/signals/implementation/linked_signal.d.ts +36 -0
  40. package/signals/implementation/linked_signal.js +34 -0
  41. package/signals/implementation/primitive/computed.d.ts +55 -0
  42. package/signals/implementation/primitive/computed.js +107 -0
  43. package/signals/implementation/primitive/effect.d.ts +26 -0
  44. package/signals/implementation/primitive/effect.js +31 -0
  45. package/signals/implementation/{equality.d.ts → primitive/equality.d.ts} +1 -1
  46. package/signals/implementation/{equality.js → primitive/equality.js} +1 -1
  47. package/signals/implementation/primitive/errors.d.ts +10 -0
  48. package/signals/implementation/{errors.js → primitive/errors.js} +3 -4
  49. package/signals/implementation/primitive/formatter.d.ts +19 -0
  50. package/signals/implementation/primitive/formatter.js +136 -0
  51. package/signals/implementation/{graph.d.ts → primitive/graph.d.ts} +68 -36
  52. package/signals/implementation/primitive/graph.js +386 -0
  53. package/signals/implementation/primitive/linked_signal.d.ts +46 -0
  54. package/signals/implementation/primitive/linked_signal.js +110 -0
  55. package/signals/implementation/primitive/signal.d.ts +31 -0
  56. package/signals/implementation/primitive/signal.js +80 -0
  57. package/signals/implementation/primitive/untracked.d.ts +12 -0
  58. package/signals/implementation/primitive/untracked.js +23 -0
  59. package/signals/implementation/{watch.d.ts → primitive/watch.d.ts} +1 -2
  60. package/signals/implementation/{watch.js → primitive/watch.js} +22 -16
  61. package/signals/implementation/resource/api.d.ts +275 -0
  62. package/signals/implementation/resource/api.js +26 -0
  63. package/signals/implementation/resource/debounce.d.ts +13 -0
  64. package/signals/implementation/resource/debounce.js +113 -0
  65. package/signals/implementation/resource/from_snapshots.d.ts +16 -0
  66. package/signals/implementation/resource/from_snapshots.js +44 -0
  67. package/signals/implementation/resource/index.d.ts +11 -0
  68. package/signals/implementation/resource/index.js +11 -0
  69. package/signals/implementation/resource/resource.d.ts +110 -0
  70. package/signals/implementation/resource/resource.js +402 -0
  71. package/signals/implementation/root_effect_scheduler.d.ts +50 -0
  72. package/signals/implementation/root_effect_scheduler.js +66 -0
  73. package/signals/implementation/signal.d.ts +42 -18
  74. package/signals/implementation/signal.js +29 -49
  75. package/signals/implementation/to-observable.d.ts +12 -5
  76. package/signals/implementation/to-observable.js +12 -2
  77. package/signals/implementation/to-signal.d.ts +9 -18
  78. package/signals/implementation/to-signal.js +46 -13
  79. package/signals/implementation/untracked.d.ts +1 -1
  80. package/signals/implementation/untracked.js +3 -11
  81. package/signals/operators/debounce.d.ts +8 -0
  82. package/signals/operators/debounce.js +19 -0
  83. package/signals/operators/derive-async.js +43 -15
  84. package/signals/operators/index.d.ts +2 -0
  85. package/signals/operators/index.js +2 -0
  86. package/signals/operators/throttle.d.ts +8 -0
  87. package/signals/operators/throttle.js +31 -0
  88. package/ai/genkit/tests/multi-region.test.d.ts +0 -2
  89. package/ai/genkit/tests/multi-region.test.js +0 -179
  90. package/ai/genkit/tests/token-limit-fallback.test.d.ts +0 -2
  91. package/ai/genkit/tests/token-limit-fallback.test.js +0 -209
  92. package/ai/prompts/tests/prompt-builder.test.d.ts +0 -1
  93. package/ai/prompts/tests/prompt-builder.test.js +0 -22
  94. package/ai/tests/instructions-formatter.test.d.ts +0 -1
  95. package/ai/tests/instructions-formatter.test.js +0 -116
  96. package/ai/tests/steering.test.d.ts +0 -1
  97. package/ai/tests/steering.test.js +0 -37
  98. package/api/client/tests/api-client.test.d.ts +0 -1
  99. package/api/client/tests/api-client.test.js +0 -194
  100. package/api/server/tests/csrf.middleware.test.d.ts +0 -1
  101. package/api/server/tests/csrf.middleware.test.js +0 -91
  102. package/authentication/tests/authentication-password-requirements.validator.test.d.ts +0 -1
  103. package/authentication/tests/authentication-password-requirements.validator.test.js +0 -29
  104. package/authentication/tests/authentication.api-controller.test.d.ts +0 -1
  105. package/authentication/tests/authentication.api-controller.test.js +0 -156
  106. package/authentication/tests/authentication.api-request-token.provider.test.d.ts +0 -1
  107. package/authentication/tests/authentication.api-request-token.provider.test.js +0 -48
  108. package/authentication/tests/authentication.client-error-handling.test.d.ts +0 -1
  109. package/authentication/tests/authentication.client-error-handling.test.js +0 -123
  110. package/authentication/tests/authentication.client-middleware.test.d.ts +0 -1
  111. package/authentication/tests/authentication.client-middleware.test.js +0 -118
  112. package/authentication/tests/authentication.client-service-methods.test.d.ts +0 -1
  113. package/authentication/tests/authentication.client-service-methods.test.js +0 -177
  114. package/authentication/tests/authentication.client-service-refresh.test.d.ts +0 -1
  115. package/authentication/tests/authentication.client-service-refresh.test.js +0 -153
  116. package/authentication/tests/authentication.client-service.test.d.ts +0 -1
  117. package/authentication/tests/authentication.client-service.test.js +0 -76
  118. package/authentication/tests/authentication.refresh-busy-loop.test.d.ts +0 -1
  119. package/authentication/tests/authentication.refresh-busy-loop.test.js +0 -84
  120. package/authentication/tests/authentication.service.test.d.ts +0 -1
  121. package/authentication/tests/authentication.service.test.js +0 -167
  122. package/authentication/tests/authentication.test-ancillary-service.d.ts +0 -9
  123. package/authentication/tests/authentication.test-ancillary-service.js +0 -27
  124. package/authentication/tests/brute-force-protection.test.d.ts +0 -1
  125. package/authentication/tests/brute-force-protection.test.js +0 -211
  126. package/authentication/tests/helper.test.d.ts +0 -1
  127. package/authentication/tests/helper.test.js +0 -122
  128. package/authentication/tests/password-requirements.error.test.d.ts +0 -1
  129. package/authentication/tests/password-requirements.error.test.js +0 -14
  130. package/authentication/tests/remember.api.test.d.ts +0 -1
  131. package/authentication/tests/remember.api.test.js +0 -117
  132. package/authentication/tests/remember.service.test.d.ts +0 -1
  133. package/authentication/tests/remember.service.test.js +0 -83
  134. package/authentication/tests/subject.service.test.d.ts +0 -1
  135. package/authentication/tests/subject.service.test.js +0 -140
  136. package/authentication/tests/suspended-subject.test.d.ts +0 -1
  137. package/authentication/tests/suspended-subject.test.js +0 -120
  138. package/authentication/tests/totp.enrollment.test.d.ts +0 -1
  139. package/authentication/tests/totp.enrollment.test.js +0 -123
  140. package/authentication/tests/totp.login.test.d.ts +0 -1
  141. package/authentication/tests/totp.login.test.js +0 -213
  142. package/authentication/tests/totp.recovery-codes.test.d.ts +0 -1
  143. package/authentication/tests/totp.recovery-codes.test.js +0 -97
  144. package/authentication/tests/totp.status.test.d.ts +0 -1
  145. package/authentication/tests/totp.status.test.js +0 -72
  146. package/cancellation/tests/coverage.test.d.ts +0 -1
  147. package/cancellation/tests/coverage.test.js +0 -49
  148. package/cancellation/tests/leak.test.d.ts +0 -1
  149. package/cancellation/tests/leak.test.js +0 -35
  150. package/cancellation/tests/token.test.d.ts +0 -1
  151. package/cancellation/tests/token.test.js +0 -136
  152. package/circuit-breaker/tests/circuit-breaker.test.d.ts +0 -1
  153. package/circuit-breaker/tests/circuit-breaker.test.js +0 -116
  154. package/cryptography/tests/cryptography.test.d.ts +0 -1
  155. package/cryptography/tests/cryptography.test.js +0 -175
  156. package/cryptography/tests/jwt.test.d.ts +0 -1
  157. package/cryptography/tests/jwt.test.js +0 -54
  158. package/cryptography/tests/modern.test.d.ts +0 -1
  159. package/cryptography/tests/modern.test.js +0 -105
  160. package/cryptography/tests/module.test.d.ts +0 -1
  161. package/cryptography/tests/module.test.js +0 -100
  162. package/cryptography/tests/totp.test.d.ts +0 -1
  163. package/cryptography/tests/totp.test.js +0 -108
  164. package/document-management/tests/ai-config-hierarchy.test.d.ts +0 -1
  165. package/document-management/tests/ai-config-hierarchy.test.js +0 -59
  166. package/document-management/tests/ai-config-integration.test.d.ts +0 -1
  167. package/document-management/tests/ai-config-integration.test.js +0 -125
  168. package/document-management/tests/ai-config-merge.test.d.ts +0 -1
  169. package/document-management/tests/ai-config-merge.test.js +0 -46
  170. package/document-management/tests/document-management-ai-overrides.test.d.ts +0 -1
  171. package/document-management/tests/document-management-ai-overrides.test.js +0 -63
  172. package/document-management/tests/document-management-core.test.d.ts +0 -1
  173. package/document-management/tests/document-management-core.test.js +0 -157
  174. package/document-management/tests/document-management.api.test.d.ts +0 -1
  175. package/document-management/tests/document-management.api.test.js +0 -101
  176. package/document-management/tests/document-statistics.service.test.d.ts +0 -1
  177. package/document-management/tests/document-statistics.service.test.js +0 -498
  178. package/document-management/tests/document-validation-ai-overrides.test.d.ts +0 -1
  179. package/document-management/tests/document-validation-ai-overrides.test.js +0 -87
  180. package/document-management/tests/document.service.test.d.ts +0 -1
  181. package/document-management/tests/document.service.test.js +0 -143
  182. package/document-management/tests/enum-helpers.test.d.ts +0 -1
  183. package/document-management/tests/enum-helpers.test.js +0 -452
  184. package/document-management/tests/helper.d.ts +0 -24
  185. package/document-management/tests/helper.js +0 -39
  186. package/errors/tests/format.test.d.ts +0 -1
  187. package/errors/tests/format.test.js +0 -84
  188. package/http/tests/server-timing.test.d.ts +0 -1
  189. package/http/tests/server-timing.test.js +0 -42
  190. package/injector/tests/advanced.test.d.ts +0 -1
  191. package/injector/tests/advanced.test.js +0 -116
  192. package/injector/tests/async-init.test.d.ts +0 -1
  193. package/injector/tests/async-init.test.js +0 -77
  194. package/injector/tests/basic.test.d.ts +0 -1
  195. package/injector/tests/basic.test.js +0 -114
  196. package/injector/tests/hierarchical.test.d.ts +0 -1
  197. package/injector/tests/hierarchical.test.js +0 -59
  198. package/injector/tests/leak.test.d.ts +0 -1
  199. package/injector/tests/leak.test.js +0 -45
  200. package/injector/tests/lifecycles.test.d.ts +0 -1
  201. package/injector/tests/lifecycles.test.js +0 -109
  202. package/logger/tests/pretty-print.test.d.ts +0 -1
  203. package/logger/tests/pretty-print.test.js +0 -60
  204. package/notification/tests/notification-api.test.d.ts +0 -1
  205. package/notification/tests/notification-api.test.js +0 -124
  206. package/notification/tests/notification-client.test.d.ts +0 -1
  207. package/notification/tests/notification-client.test.js +0 -101
  208. package/notification/tests/notification-flow.test.d.ts +0 -1
  209. package/notification/tests/notification-flow.test.js +0 -296
  210. package/notification/tests/notification-sse.service.test.d.ts +0 -1
  211. package/notification/tests/notification-sse.service.test.js +0 -43
  212. package/notification/tests/notification-type.service.test.d.ts +0 -1
  213. package/notification/tests/notification-type.service.test.js +0 -41
  214. package/object-storage/s3/tests/s3.object-storage.integration.test.d.ts +0 -1
  215. package/object-storage/s3/tests/s3.object-storage.integration.test.js +0 -303
  216. package/orm/tests/build-jsonb.test.d.ts +0 -1
  217. package/orm/tests/build-jsonb.test.js +0 -39
  218. package/orm/tests/data-types.test.d.ts +0 -1
  219. package/orm/tests/data-types.test.js +0 -39
  220. package/orm/tests/database-extension.test.d.ts +0 -1
  221. package/orm/tests/database-extension.test.js +0 -63
  222. package/orm/tests/database-migration.test.d.ts +0 -1
  223. package/orm/tests/database-migration.test.js +0 -83
  224. package/orm/tests/decorators.test.d.ts +0 -1
  225. package/orm/tests/decorators.test.js +0 -77
  226. package/orm/tests/encryption.test.d.ts +0 -1
  227. package/orm/tests/encryption.test.js +0 -31
  228. package/orm/tests/query-complex.test.d.ts +0 -1
  229. package/orm/tests/query-complex.test.js +0 -172
  230. package/orm/tests/query-converter-complex.test.d.ts +0 -1
  231. package/orm/tests/query-converter-complex.test.js +0 -131
  232. package/orm/tests/query-converter.test.d.ts +0 -1
  233. package/orm/tests/query-converter.test.js +0 -123
  234. package/orm/tests/repository-advanced.test.d.ts +0 -1
  235. package/orm/tests/repository-advanced.test.js +0 -189
  236. package/orm/tests/repository-attributes.test.d.ts +0 -1
  237. package/orm/tests/repository-attributes.test.js +0 -83
  238. package/orm/tests/repository-compound-primary-key.test.d.ts +0 -2
  239. package/orm/tests/repository-compound-primary-key.test.js +0 -226
  240. package/orm/tests/repository-comprehensive.test.d.ts +0 -1
  241. package/orm/tests/repository-comprehensive.test.js +0 -162
  242. package/orm/tests/repository-coverage.test.d.ts +0 -2
  243. package/orm/tests/repository-coverage.test.js +0 -242
  244. package/orm/tests/repository-cti-complex.test.d.ts +0 -1
  245. package/orm/tests/repository-cti-complex.test.js +0 -151
  246. package/orm/tests/repository-cti-embedded.test.d.ts +0 -1
  247. package/orm/tests/repository-cti-embedded.test.js +0 -178
  248. package/orm/tests/repository-cti-extensive.test.d.ts +0 -2
  249. package/orm/tests/repository-cti-extensive.test.js +0 -279
  250. package/orm/tests/repository-cti-mapping.test.d.ts +0 -2
  251. package/orm/tests/repository-cti-mapping.test.js +0 -108
  252. package/orm/tests/repository-cti-search.test.d.ts +0 -1
  253. package/orm/tests/repository-cti-search.test.js +0 -141
  254. package/orm/tests/repository-cti-soft-delete.test.d.ts +0 -2
  255. package/orm/tests/repository-cti-soft-delete.test.js +0 -103
  256. package/orm/tests/repository-cti-transactions.test.d.ts +0 -1
  257. package/orm/tests/repository-cti-transactions.test.js +0 -112
  258. package/orm/tests/repository-cti-upsert-many.test.d.ts +0 -2
  259. package/orm/tests/repository-cti-upsert-many.test.js +0 -115
  260. package/orm/tests/repository-cti.test.d.ts +0 -2
  261. package/orm/tests/repository-cti.test.js +0 -390
  262. package/orm/tests/repository-edge-cases.test.d.ts +0 -1
  263. package/orm/tests/repository-edge-cases.test.js +0 -178
  264. package/orm/tests/repository-expiration.test.d.ts +0 -2
  265. package/orm/tests/repository-expiration.test.js +0 -140
  266. package/orm/tests/repository-extra-coverage.test.d.ts +0 -2
  267. package/orm/tests/repository-extra-coverage.test.js +0 -402
  268. package/orm/tests/repository-mapping.test.d.ts +0 -2
  269. package/orm/tests/repository-mapping.test.js +0 -65
  270. package/orm/tests/repository-regression.test.d.ts +0 -1
  271. package/orm/tests/repository-regression.test.js +0 -288
  272. package/orm/tests/repository-search-coverage.test.d.ts +0 -1
  273. package/orm/tests/repository-search-coverage.test.js +0 -107
  274. package/orm/tests/repository-search.test.d.ts +0 -1
  275. package/orm/tests/repository-search.test.js +0 -105
  276. package/orm/tests/repository-soft-delete.test.d.ts +0 -1
  277. package/orm/tests/repository-soft-delete.test.js +0 -118
  278. package/orm/tests/repository-transactions-nested.test.d.ts +0 -1
  279. package/orm/tests/repository-transactions-nested.test.js +0 -178
  280. package/orm/tests/repository-types.test.d.ts +0 -1
  281. package/orm/tests/repository-types.test.js +0 -184
  282. package/orm/tests/repository-undelete.test.d.ts +0 -2
  283. package/orm/tests/repository-undelete.test.js +0 -201
  284. package/orm/tests/schema-converter.test.d.ts +0 -1
  285. package/orm/tests/schema-converter.test.js +0 -82
  286. package/orm/tests/schema-generation.test.d.ts +0 -2
  287. package/orm/tests/schema-generation.test.js +0 -174
  288. package/orm/tests/sql-helpers.test.d.ts +0 -1
  289. package/orm/tests/sql-helpers.test.js +0 -67
  290. package/orm/tests/transaction-safety.test.d.ts +0 -1
  291. package/orm/tests/transaction-safety.test.js +0 -81
  292. package/orm/tests/transactional.test.d.ts +0 -1
  293. package/orm/tests/transactional.test.js +0 -215
  294. package/orm/tests/utils.test.d.ts +0 -1
  295. package/orm/tests/utils.test.js +0 -70
  296. package/pdf/tests/utils.test.d.ts +0 -1
  297. package/pdf/tests/utils.test.js +0 -187
  298. package/process/tests/spawn.test.d.ts +0 -1
  299. package/process/tests/spawn.test.js +0 -182
  300. package/rate-limit/tests/postgres-rate-limiter.test.d.ts +0 -1
  301. package/rate-limit/tests/postgres-rate-limiter.test.js +0 -84
  302. package/renderer/tests/renderer.test.d.ts +0 -1
  303. package/renderer/tests/renderer.test.js +0 -88
  304. package/rpc/tests/rpc.integration.test.d.ts +0 -1
  305. package/rpc/tests/rpc.integration.test.js +0 -615
  306. package/signals/implementation/errors.d.ts +0 -2
  307. package/signals/implementation/graph.js +0 -312
  308. package/signals/implementation/writable-signal.d.ts +0 -48
  309. package/signals/implementation/writable-signal.js +0 -32
  310. package/task-queue/tests/coverage-branch.test.d.ts +0 -1
  311. package/task-queue/tests/coverage-branch.test.js +0 -395
  312. package/task-queue/tests/coverage-enhancement.test.d.ts +0 -1
  313. package/task-queue/tests/coverage-enhancement.test.js +0 -150
  314. package/task-queue/tests/dag.test.d.ts +0 -1
  315. package/task-queue/tests/dag.test.js +0 -188
  316. package/task-queue/tests/dependencies.test.d.ts +0 -1
  317. package/task-queue/tests/dependencies.test.js +0 -296
  318. package/task-queue/tests/enqueue-batch.test.d.ts +0 -1
  319. package/task-queue/tests/enqueue-batch.test.js +0 -125
  320. package/task-queue/tests/enqueue-item.test.d.ts +0 -1
  321. package/task-queue/tests/enqueue-item.test.js +0 -12
  322. package/task-queue/tests/fan-out-spawning.test.d.ts +0 -1
  323. package/task-queue/tests/fan-out-spawning.test.js +0 -94
  324. package/task-queue/tests/idempotent-replacement.test.d.ts +0 -1
  325. package/task-queue/tests/idempotent-replacement.test.js +0 -114
  326. package/task-queue/tests/missing-idempotent-tasks.test.d.ts +0 -1
  327. package/task-queue/tests/missing-idempotent-tasks.test.js +0 -39
  328. package/task-queue/tests/optimization-edge-cases.test.d.ts +0 -1
  329. package/task-queue/tests/optimization-edge-cases.test.js +0 -124
  330. package/task-queue/tests/queue-generic.test.d.ts +0 -1
  331. package/task-queue/tests/queue-generic.test.js +0 -8
  332. package/task-queue/tests/queue.test.d.ts +0 -1
  333. package/task-queue/tests/queue.test.js +0 -756
  334. package/task-queue/tests/shutdown.test.d.ts +0 -1
  335. package/task-queue/tests/shutdown.test.js +0 -41
  336. package/task-queue/tests/task-context.test.d.ts +0 -1
  337. package/task-queue/tests/task-context.test.js +0 -7
  338. package/task-queue/tests/task-union.test.d.ts +0 -1
  339. package/task-queue/tests/task-union.test.js +0 -18
  340. package/task-queue/tests/transactions.test.d.ts +0 -1
  341. package/task-queue/tests/transactions.test.js +0 -47
  342. package/task-queue/tests/typing.test.d.ts +0 -1
  343. package/task-queue/tests/typing.test.js +0 -9
  344. package/task-queue/tests/worker.test.d.ts +0 -1
  345. package/task-queue/tests/worker.test.js +0 -258
  346. package/task-queue/tests/zombie-parent.test.d.ts +0 -1
  347. package/task-queue/tests/zombie-parent.test.js +0 -45
  348. package/task-queue/tests/zombie-recovery.test.d.ts +0 -1
  349. package/task-queue/tests/zombie-recovery.test.js +0 -51
  350. package/utils/tests/backoff.test.d.ts +0 -1
  351. package/utils/tests/backoff.test.js +0 -41
  352. package/utils/tests/retry-with-backoff.test.d.ts +0 -1
  353. package/utils/tests/retry-with-backoff.test.js +0 -49
@@ -1,452 +0,0 @@
1
- import { afterAll, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest';
2
- import { GenkitModuleOptions } from '../../ai/genkit/module.js';
3
- import { NotFoundError } from '../../errors/not-found.error.js';
4
- import { runInInjectionContext } from '../../injector/index.js';
5
- import { ObjectStorage } from '../../object-storage/index.js';
6
- import { TaskQueue } from '../../task-queue/index.js';
7
- import { clearTenantData, setupIntegrationTest } from '../../testing/index.js';
8
- import { DocumentPropertyDataType } from '../models/document-property.model.js';
9
- import { configureDocumentManagement } from '../server/configure.js';
10
- import { DocumentCategoryTypeService } from '../server/services/document-category-type.service.js';
11
- import { DocumentManagementAiService } from '../server/services/document-management-ai.service.js';
12
- import { DocumentManagementService } from '../server/services/document-management.service.js';
13
- import { DocumentPropertyService } from '../server/services/document-property.service.js';
14
- import { TestDocumentManagementAncillaryService, TestDocumentManagementAuthorizationService } from './helper.js';
15
- describe('Document Management Extended Suite', () => {
16
- let injector;
17
- let database;
18
- let documentManagementService;
19
- let categoryTypeService;
20
- let propertyService;
21
- const schema = 'document_management';
22
- const tenantId = crypto.randomUUID();
23
- const otherTenantId = crypto.randomUUID();
24
- beforeAll(async () => {
25
- ({ injector, database } = await setupIntegrationTest({
26
- modules: { taskQueue: false, messageBus: true, documentManagement: true },
27
- orm: { schema },
28
- }));
29
- injector.register(GenkitModuleOptions, { useValue: {} });
30
- injector.register(DocumentManagementAiService, { useValue: { extractContent: vi.fn(), classifyDocumentType: vi.fn(), extractData: vi.fn(), findSuitableCollectionsForDocument: vi.fn(), findSuitableRequestForDocument: vi.fn() } });
31
- injector.register(ObjectStorage, {
32
- useValue: {
33
- uploadObject: vi.fn(),
34
- getDownloadUrl: vi.fn(),
35
- getContent: vi.fn(),
36
- getContentStream: vi.fn(),
37
- getObject: vi.fn(),
38
- exists: vi.fn(),
39
- },
40
- });
41
- injector.register(TaskQueue, {
42
- useValue: {
43
- enqueue: vi.fn(),
44
- enqueueMany: vi.fn(),
45
- process: vi.fn(),
46
- },
47
- });
48
- configureDocumentManagement({
49
- ancillaryService: TestDocumentManagementAncillaryService,
50
- authorizationService: TestDocumentManagementAuthorizationService,
51
- fileObjectStorageModule: 'documents',
52
- fileUploadObjectStorageModule: 'document-uploads',
53
- filePreviewObjectStorageModule: 'document-previews',
54
- injector,
55
- });
56
- documentManagementService = await injector.resolveAsync(DocumentManagementService);
57
- categoryTypeService = await injector.resolveAsync(DocumentCategoryTypeService);
58
- propertyService = await injector.resolveAsync(DocumentPropertyService);
59
- });
60
- afterAll(async () => {
61
- await injector?.dispose();
62
- });
63
- beforeEach(async () => {
64
- await clearTenantData(database, schema, ['type_property', 'property', 'type', 'category'], tenantId);
65
- await clearTenantData(database, schema, ['type_property', 'property', 'type', 'category'], otherTenantId);
66
- categoryTypeService.invalidateCache(tenantId);
67
- propertyService.invalidateCache(tenantId);
68
- categoryTypeService.invalidateCache(otherTenantId);
69
- propertyService.invalidateCache(otherTenantId);
70
- });
71
- // --- 1. Category Management ---
72
- test('1. Create category with key', async () => {
73
- await runInInjectionContext(injector, async () => {
74
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Cat Key', parentId: null, key: 'cat-key' });
75
- expect(category.key).toBe('cat-key');
76
- expect(await categoryTypeService.getCategoryId(tenantId, 'cat-key')).toBe(category.id);
77
- });
78
- });
79
- test('2. Create category without key', async () => {
80
- await runInInjectionContext(injector, async () => {
81
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Cat No Key', parentId: null });
82
- expect(category.key).toBeNull();
83
- await expect(categoryTypeService.getCategoryId(tenantId, 'cat-no-key')).rejects.toThrow(NotFoundError);
84
- });
85
- });
86
- test('3. Category Hierarchy with keys', async () => {
87
- await runInInjectionContext(injector, async () => {
88
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
89
- categoryLabels: { root: 'Root', child: 'Child' },
90
- categoryParents: { root: null, child: 'root' },
91
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
92
- });
93
- const rootId = await categoryTypeService.getCategoryId(tenantId, 'root');
94
- const childId = await categoryTypeService.getCategoryId(tenantId, 'child');
95
- const child = await categoryTypeService.loadCategory(tenantId, childId);
96
- expect(child.parentId).toBe(rootId);
97
- });
98
- });
99
- test('4. Update category label via initialize', async () => {
100
- await runInInjectionContext(injector, async () => {
101
- await categoryTypeService.createCategory({ tenantId, label: 'Old Label', parentId: null, key: 'cat-update' });
102
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
103
- categoryLabels: { 'cat-update': 'New Label' },
104
- categoryParents: { 'cat-update': null },
105
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
106
- });
107
- const id = await categoryTypeService.getCategoryId(tenantId, 'cat-update');
108
- const category = await categoryTypeService.loadCategory(tenantId, id);
109
- expect(category.label).toBe('New Label');
110
- });
111
- });
112
- test('5. Update category parent via initialize', async () => {
113
- await runInInjectionContext(injector, async () => {
114
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
115
- categoryLabels: { 'root': 'Root', 'child': 'Child', 'new-root': 'New Root' },
116
- categoryParents: { 'root': null, 'child': 'root', 'new-root': null },
117
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
118
- });
119
- // Move child to new-root
120
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
121
- categoryLabels: { 'root': 'Root', 'child': 'Child', 'new-root': 'New Root' },
122
- categoryParents: { 'root': null, 'child': 'new-root', 'new-root': null },
123
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
124
- });
125
- const childId = await categoryTypeService.getCategoryId(tenantId, 'child');
126
- const newRootId = await categoryTypeService.getCategoryId(tenantId, 'new-root');
127
- const child = await categoryTypeService.loadCategory(tenantId, childId);
128
- expect(child.parentId).toBe(newRootId);
129
- });
130
- });
131
- // --- 2. Type Management ---
132
- test('6. Create type with key', async () => {
133
- await runInInjectionContext(injector, async () => {
134
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Cat', parentId: null });
135
- const type = await categoryTypeService.createType({ tenantId, label: 'Type Key', categoryId: category.id, key: 'type-key' });
136
- expect(type.key).toBe('type-key');
137
- expect(await categoryTypeService.getTypeId(tenantId, 'type-key')).toBe(type.id);
138
- });
139
- });
140
- test('7. Create type without key', async () => {
141
- await runInInjectionContext(injector, async () => {
142
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Cat', parentId: null });
143
- const type = await categoryTypeService.createType({ tenantId, label: 'Type No Key', categoryId: category.id });
144
- expect(type.key).toBeNull();
145
- });
146
- });
147
- test('8. Assign type to category via initialize', async () => {
148
- await runInInjectionContext(injector, async () => {
149
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
150
- categoryLabels: { cat: 'Category' },
151
- categoryParents: { cat: null },
152
- typeLabels: { type: 'Type' },
153
- typeCategories: { type: 'cat' },
154
- propertyConfigurations: {}, typeProperties: { type: [] },
155
- });
156
- const catId = await categoryTypeService.getCategoryId(tenantId, 'cat');
157
- const typeId = await categoryTypeService.getTypeId(tenantId, 'type');
158
- const type = await categoryTypeService.loadType(tenantId, typeId);
159
- expect(type.categoryId).toBe(catId);
160
- });
161
- });
162
- test('9. Update type label via initialize', async () => {
163
- await runInInjectionContext(injector, async () => {
164
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
165
- categoryLabels: { cat: 'Category' },
166
- categoryParents: { cat: null },
167
- typeLabels: { type: 'Old Type Label' },
168
- typeCategories: { type: 'cat' },
169
- propertyConfigurations: {}, typeProperties: { type: [] },
170
- });
171
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
172
- categoryLabels: { cat: 'Category' },
173
- categoryParents: { cat: null },
174
- typeLabels: { type: 'New Type Label' },
175
- typeCategories: { type: 'cat' },
176
- propertyConfigurations: {}, typeProperties: { type: [] },
177
- });
178
- const typeId = await categoryTypeService.getTypeId(tenantId, 'type');
179
- const type = await categoryTypeService.loadType(tenantId, typeId);
180
- expect(type.label).toBe('New Type Label');
181
- });
182
- });
183
- test('10. Update type category assignment', async () => {
184
- await runInInjectionContext(injector, async () => {
185
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
186
- categoryLabels: { cat1: 'Cat 1', cat2: 'Cat 2' },
187
- categoryParents: { cat1: null, cat2: null },
188
- typeLabels: { type: 'Type' },
189
- typeCategories: { type: 'cat1' },
190
- propertyConfigurations: {}, typeProperties: { type: [] },
191
- });
192
- const cat2Id = await categoryTypeService.getCategoryId(tenantId, 'cat2');
193
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
194
- categoryLabels: { cat1: 'Cat 1', cat2: 'Cat 2' },
195
- categoryParents: { cat1: null, cat2: null },
196
- typeLabels: { type: 'Type' },
197
- typeCategories: { type: 'cat2' }, // Move to cat2
198
- propertyConfigurations: {}, typeProperties: { type: [] },
199
- });
200
- const typeId = await categoryTypeService.getTypeId(tenantId, 'type');
201
- const type = await categoryTypeService.loadType(tenantId, typeId);
202
- expect(type.categoryId).toBe(cat2Id);
203
- });
204
- });
205
- // --- 3. Property Management ---
206
- test('11. Create property with key (Text)', async () => {
207
- await runInInjectionContext(injector, async () => {
208
- const prop = await propertyService.createProperty({ tenantId, label: 'Text Prop', dataType: DocumentPropertyDataType.Text, key: 'prop-text' });
209
- expect(prop.dataType).toBe(DocumentPropertyDataType.Text);
210
- expect(await propertyService.getPropertyId(tenantId, 'prop-text')).toBe(prop.id);
211
- });
212
- });
213
- test('12. Create property with key (Number)', async () => {
214
- await runInInjectionContext(injector, async () => {
215
- const prop = await propertyService.createProperty({ tenantId, label: 'Num Prop', dataType: DocumentPropertyDataType.Integer, key: 'prop-num' });
216
- expect(prop.dataType).toBe(DocumentPropertyDataType.Integer);
217
- });
218
- });
219
- test('13. Update property label', async () => {
220
- await runInInjectionContext(injector, async () => {
221
- await propertyService.createProperty({ tenantId, label: 'Old', dataType: DocumentPropertyDataType.Text, key: 'prop' });
222
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
223
- categoryLabels: {}, categoryParents: {}, typeLabels: {}, typeCategories: {},
224
- propertyConfigurations: { prop: [DocumentPropertyDataType.Text, 'New'] },
225
- typeProperties: {},
226
- });
227
- const id = await propertyService.getPropertyId(tenantId, 'prop');
228
- const prop = (await propertyService.loadViews(tenantId)).find(p => p.id === id);
229
- expect(prop?.label).toBe('New');
230
- });
231
- });
232
- test('14. Update property data type', async () => {
233
- await runInInjectionContext(injector, async () => {
234
- await propertyService.createProperty({ tenantId, label: 'Prop', dataType: DocumentPropertyDataType.Text, key: 'prop' });
235
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
236
- categoryLabels: {}, categoryParents: {}, typeLabels: {}, typeCategories: {},
237
- propertyConfigurations: { prop: [DocumentPropertyDataType.Integer, 'Prop'] },
238
- typeProperties: {},
239
- });
240
- const id = await propertyService.getPropertyId(tenantId, 'prop');
241
- const prop = (await propertyService.loadViews(tenantId)).find(p => p.id === id);
242
- expect(prop?.dataType).toBe(DocumentPropertyDataType.Integer);
243
- });
244
- });
245
- test('15. Assign properties to types', async () => {
246
- await runInInjectionContext(injector, async () => {
247
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
248
- categoryLabels: { cat: 'Cat' }, categoryParents: { cat: null },
249
- typeLabels: { type: 'Type' }, typeCategories: { type: 'cat' },
250
- propertyConfigurations: { prop1: [DocumentPropertyDataType.Text, 'P1'], prop2: [DocumentPropertyDataType.Integer, 'P2'] },
251
- typeProperties: { type: ['prop1', 'prop2'] },
252
- });
253
- const typeId = await categoryTypeService.getTypeId(tenantId, 'type');
254
- const prop1Id = await propertyService.getPropertyId(tenantId, 'prop1');
255
- const prop2Id = await propertyService.getPropertyId(tenantId, 'prop2');
256
- const props = await propertyService.loadViews(tenantId);
257
- const p1 = props.find(p => p.id === prop1Id);
258
- const p2 = props.find(p => p.id === prop2Id);
259
- expect(p1?.typeIds).toContain(typeId);
260
- expect(p2?.typeIds).toContain(typeId);
261
- });
262
- });
263
- // --- 4. Cache Behavior ---
264
- test('16. Verify cache hit', async () => {
265
- await runInInjectionContext(injector, async () => {
266
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Cache Test', parentId: null, key: 'cache-hit' });
267
- // Load once to populate cache
268
- await categoryTypeService.getCategoryId(tenantId, 'cache-hit');
269
- // Delete from DB manually
270
- await categoryTypeService.categoryRepository.hardDeleteByQuery({ tenantId, id: category.id });
271
- // Should still find it in cache
272
- expect(await categoryTypeService.getCategoryId(tenantId, 'cache-hit')).toBe(category.id);
273
- });
274
- });
275
- test('17. Verify cache miss throws NotFound', async () => {
276
- await runInInjectionContext(injector, async () => {
277
- await expect(categoryTypeService.getCategoryId(tenantId, 'missing')).rejects.toThrow(NotFoundError);
278
- });
279
- });
280
- test('18. Manual cache invalidation', async () => {
281
- await runInInjectionContext(injector, async () => {
282
- const category = await categoryTypeService.createCategory({ tenantId, label: 'Invalidate', parentId: null, key: 'inv' });
283
- await categoryTypeService.getCategoryId(tenantId, 'inv'); // cache it
284
- categoryTypeService.invalidateCache(tenantId);
285
- await categoryTypeService.categoryRepository.hardDeleteByQuery({ tenantId, id: category.id });
286
- // Should fail now as cache is cleared and DB is empty
287
- await expect(categoryTypeService.getCategoryId(tenantId, 'inv')).rejects.toThrow(NotFoundError);
288
- });
289
- });
290
- test('19. Automatic invalidation after initialize', async () => {
291
- await runInInjectionContext(injector, async () => {
292
- await categoryTypeService.createCategory({ tenantId, label: 'Auto', parentId: null, key: 'auto' });
293
- await categoryTypeService.getCategoryId(tenantId, 'auto'); // cache it
294
- // Run initialize (should invalidate)
295
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
296
- categoryLabels: { auto: 'Auto Updated' },
297
- categoryParents: { auto: null },
298
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
299
- });
300
- // If we query DB directly, we see the update
301
- const id = await categoryTypeService.getCategoryId(tenantId, 'auto');
302
- const cat = await categoryTypeService.loadCategory(tenantId, id);
303
- expect(cat.label).toBe('Auto Updated');
304
- });
305
- });
306
- test('20. Multi-tenant isolation', async () => {
307
- await runInInjectionContext(injector, async () => {
308
- await categoryTypeService.createCategory({ tenantId, label: 'T1', parentId: null, key: 'shared' });
309
- await categoryTypeService.createCategory({ tenantId: otherTenantId, label: 'T2', parentId: null, key: 'shared' });
310
- const id1 = await categoryTypeService.getCategoryId(tenantId, 'shared');
311
- const id2 = await categoryTypeService.getCategoryId(otherTenantId, 'shared');
312
- expect(id1).not.toBe(id2);
313
- });
314
- });
315
- // --- 5. Initialization Logic ---
316
- test('21. Initialize from scratch', async () => {
317
- await runInInjectionContext(injector, async () => {
318
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
319
- categoryLabels: { c: 'C' }, categoryParents: { c: null },
320
- typeLabels: { t: 'T' }, typeCategories: { t: 'c' },
321
- propertyConfigurations: { p: [DocumentPropertyDataType.Text, 'P'] },
322
- typeProperties: { t: ['p'] },
323
- });
324
- expect(await categoryTypeService.getCategoryId(tenantId, 'c')).toBeDefined();
325
- expect(await categoryTypeService.getTypeId(tenantId, 't')).toBeDefined();
326
- expect(await propertyService.getPropertyId(tenantId, 'p')).toBeDefined();
327
- });
328
- });
329
- test('22. Idempotent initialization', async () => {
330
- await runInInjectionContext(injector, async () => {
331
- const config = {
332
- categoryLabels: { c: 'C' }, categoryParents: { c: null },
333
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
334
- };
335
- await documentManagementService.initializeCategoriesAndTypes(tenantId, config);
336
- const id1 = await categoryTypeService.getCategoryId(tenantId, 'c');
337
- await documentManagementService.initializeCategoriesAndTypes(tenantId, config);
338
- const id2 = await categoryTypeService.getCategoryId(tenantId, 'c');
339
- expect(id1).toBe(id2);
340
- });
341
- });
342
- test('23. Partial update (add newly defined entity)', async () => {
343
- await runInInjectionContext(injector, async () => {
344
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
345
- categoryLabels: { c1: 'C1' }, categoryParents: { c1: null },
346
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
347
- });
348
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
349
- categoryLabels: { c1: 'C1', c2: 'C2' },
350
- categoryParents: { c1: null, c2: null },
351
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
352
- });
353
- expect(await categoryTypeService.getCategoryId(tenantId, 'c1')).toBeDefined();
354
- expect(await categoryTypeService.getCategoryId(tenantId, 'c2')).toBeDefined();
355
- });
356
- });
357
- test('24. Initialize with invalid parent key throws', async () => {
358
- await runInInjectionContext(injector, async () => {
359
- await expect(documentManagementService.initializeCategoriesAndTypes(tenantId, {
360
- categoryLabels: { child: 'Child' },
361
- // @ts-expect-error - Intentional invalid parent key
362
- categoryParents: { child: 'missing-parent' },
363
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
364
- })).rejects.toThrow();
365
- });
366
- });
367
- test('25. Initialize with invalid type category throws', async () => {
368
- await runInInjectionContext(injector, async () => {
369
- await expect(documentManagementService.initializeCategoriesAndTypes(tenantId, {
370
- categoryLabels: {}, categoryParents: {},
371
- typeLabels: { type: 'Type' },
372
- // @ts-expect-error - Intentional invalid type category
373
- typeCategories: { type: 'missing-cat' },
374
- propertyConfigurations: {}, typeProperties: { type: [] },
375
- })).rejects.toThrow();
376
- });
377
- });
378
- // --- 6. Edge Cases ---
379
- test('26. Duplicate keys prevented by DB constraint', async () => {
380
- // This tests the DB constraint we added
381
- await runInInjectionContext(injector, async () => {
382
- await categoryTypeService.createCategory({ tenantId, label: 'C1', parentId: null, key: 'dup' });
383
- await expect(categoryTypeService.createCategory({ tenantId, label: 'C2', parentId: null, key: 'dup' }))
384
- .rejects.toThrow();
385
- });
386
- });
387
- test('27. Null key allows duplicates', async () => {
388
- // This confirms that nulls are not unique
389
- await runInInjectionContext(injector, async () => {
390
- await categoryTypeService.createCategory({ tenantId, label: 'C1', parentId: null }); // key is null
391
- await expect(categoryTypeService.createCategory({ tenantId, label: 'C2', parentId: null }))
392
- .resolves.toBeDefined();
393
- });
394
- });
395
- test('28. Initialize with multiple properties for a type', async () => {
396
- await runInInjectionContext(injector, async () => {
397
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
398
- categoryLabels: { cat: 'Cat' }, categoryParents: { cat: null },
399
- typeLabels: { type: 'Type' }, typeCategories: { type: 'cat' },
400
- propertyConfigurations: {
401
- p1: [DocumentPropertyDataType.Text, 'P1'],
402
- p2: [DocumentPropertyDataType.Integer, 'P2'],
403
- p3: [DocumentPropertyDataType.Boolean, 'P3'],
404
- },
405
- typeProperties: { type: ['p1', 'p2', 'p3'] },
406
- });
407
- const typeId = await categoryTypeService.getTypeId(tenantId, 'type');
408
- const p1Id = await propertyService.getPropertyId(tenantId, 'p1');
409
- const p3Id = await propertyService.getPropertyId(tenantId, 'p3');
410
- const props = await propertyService.loadViews(tenantId);
411
- const p1 = props.find(p => p.id === p1Id);
412
- const p3 = props.find(p => p.id === p3Id);
413
- expect(p1?.typeIds).toContain(typeId);
414
- expect(p3?.typeIds).toContain(typeId);
415
- });
416
- });
417
- test('29. Large number of entities', async () => {
418
- await runInInjectionContext(injector, async () => {
419
- const count = 50;
420
- const categoryLabels = {};
421
- const categoryParents = {};
422
- for (let i = 0; i < count; i++) {
423
- categoryLabels[`cat-${i}`] = `Category ${i}`;
424
- categoryParents[`cat-${i}`] = null;
425
- }
426
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
427
- categoryLabels, categoryParents,
428
- typeLabels: {}, typeCategories: {}, propertyConfigurations: {}, typeProperties: {},
429
- });
430
- const id = await categoryTypeService.getCategoryId(tenantId, `cat-${count - 1}`);
431
- expect(id).toBeDefined();
432
- });
433
- });
434
- test('Missing key throws NotFoundError', async () => {
435
- await runInInjectionContext(injector, async () => {
436
- await expect(categoryTypeService.getCategoryId(tenantId, 'non-existent')).rejects.toThrow(NotFoundError);
437
- });
438
- });
439
- test('loadCategoriesAndTypes returns properties', async () => {
440
- await runInInjectionContext(injector, async () => {
441
- await documentManagementService.initializeCategoriesAndTypes(tenantId, {
442
- categoryLabels: {}, categoryParents: {}, typeLabels: {}, typeCategories: {},
443
- propertyConfigurations: { p1: [DocumentPropertyDataType.Text, 'P1'] },
444
- typeProperties: {},
445
- });
446
- const result = await categoryTypeService.loadCategoriesAndTypes(tenantId);
447
- expect(result.properties).toBeDefined();
448
- expect(result.properties).toHaveLength(1);
449
- expect(result.properties[0]?.label).toBe('P1');
450
- });
451
- });
452
- });
@@ -1,24 +0,0 @@
1
- import { DocumentManagementAuthorizationService } from '../authorization/document-management-authorization.service.js';
2
- import type { DocumentCollection } from '../models/document-collection.model.js';
3
- import { DocumentManagementAncillaryService } from '../server/services/document-management-ancillary.service.js';
4
- import type { DocumentCollectionMetadata } from '../service-models/document-collection-metadata.service-model.js';
5
- export declare class TestDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
6
- resolveMetadata(_tenantId: string, collections: DocumentCollection[]): DocumentCollectionMetadata[];
7
- }
8
- export declare class TestDocumentManagementAuthorizationService extends DocumentManagementAuthorizationService {
9
- getTenantId(): string;
10
- getSubject(): string;
11
- canReadCollection(): boolean;
12
- canCreateDocuments(): boolean;
13
- canDeleteDocuments(): boolean;
14
- canAssignDocuments(): boolean;
15
- canUpdateDocument(): boolean;
16
- canApproveDocument(): boolean;
17
- canRejectDocument(): boolean;
18
- canManageRequests(): boolean;
19
- canManageCategoriesAndTypes(): boolean;
20
- canReadDocumentRequestsTemplates(): boolean;
21
- canManageDocumentRequestsTemplates(): boolean;
22
- canManageValidationDefinitions(): boolean;
23
- canProgressDocumentWorkflow(): boolean;
24
- }
@@ -1,39 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { Singleton } from '../../injector/index.js';
8
- import { DocumentManagementAuthorizationService } from '../authorization/document-management-authorization.service.js';
9
- import { DocumentManagementAncillaryService } from '../server/services/document-management-ancillary.service.js';
10
- let TestDocumentManagementAncillaryService = class TestDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
11
- resolveMetadata(_tenantId, collections) {
12
- return collections.map((c) => ({ id: c.id, name: `Collection ${c.id}`, group: 'Test' }));
13
- }
14
- };
15
- TestDocumentManagementAncillaryService = __decorate([
16
- Singleton()
17
- ], TestDocumentManagementAncillaryService);
18
- export { TestDocumentManagementAncillaryService };
19
- let TestDocumentManagementAuthorizationService = class TestDocumentManagementAuthorizationService extends DocumentManagementAuthorizationService {
20
- getTenantId() { return 'test-tenant'; }
21
- getSubject() { return 'test-user'; }
22
- canReadCollection() { return true; }
23
- canCreateDocuments() { return true; }
24
- canDeleteDocuments() { return true; }
25
- canAssignDocuments() { return true; }
26
- canUpdateDocument() { return true; }
27
- canApproveDocument() { return true; }
28
- canRejectDocument() { return true; }
29
- canManageRequests() { return true; }
30
- canManageCategoriesAndTypes() { return true; }
31
- canReadDocumentRequestsTemplates() { return true; }
32
- canManageDocumentRequestsTemplates() { return true; }
33
- canManageValidationDefinitions() { return true; }
34
- canProgressDocumentWorkflow() { return true; }
35
- };
36
- TestDocumentManagementAuthorizationService = __decorate([
37
- Singleton()
38
- ], TestDocumentManagementAuthorizationService);
39
- export { TestDocumentManagementAuthorizationService };
@@ -1 +0,0 @@
1
- export {};
@@ -1,84 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { formatError } from '../format.js';
3
- describe('formatError', () => {
4
- it('should format a simple error', () => {
5
- const error = new Error('test message');
6
- const formatted = formatError(error, { includeStack: false });
7
- expect(formatted).toBe('Error: test message');
8
- });
9
- it('should align multi-line messages', () => {
10
- const error = new Error('line 1\nline 2');
11
- const formatted = formatError(error, { includeStack: false });
12
- expect(formatted).toBe('Error: line 1\n line 2');
13
- });
14
- it('should format nested errors with causes', () => {
15
- const cause = new Error('cause message');
16
- const error = new Error('top message', { cause });
17
- const formatted = formatError(error, { includeStack: true });
18
- expect(formatted).toContain('Error: top message');
19
- expect(formatted).toContain('Caused by:');
20
- expect(formatted).toContain('Error: cause message');
21
- });
22
- it('should deduplicate stack header', () => {
23
- const error = new Error('test message');
24
- const formatted = formatError(error, { includeStack: true });
25
- const lines = formatted.split('\n');
26
- expect(lines[0]).toBe('Error: test message');
27
- expect(lines[1].trim()).toMatch(/^at /);
28
- });
29
- it('should handle multi-line message alignment with stack deduplication', () => {
30
- const error = new Error('multi\nline');
31
- const formatted = formatError(error, { includeStack: true });
32
- expect(formatted).toContain('Error: multi\n line');
33
- const lines = formatted.split('\n');
34
- expect(lines[0]).toBe('Error: multi');
35
- expect(lines[1]).toBe(' line');
36
- expect(lines[2].trim()).toMatch(/^at /);
37
- });
38
- it('should format rest properties', () => {
39
- const error = new Error('message');
40
- error.code = 'ERR_CODE';
41
- error.details = { foo: 'bar' };
42
- const formatted = formatError(error, { includeStack: false, includeRest: true });
43
- expect(formatted).toContain('Error: message');
44
- expect(formatted).toContain('"code": "ERR_CODE"');
45
- expect(formatted).toContain('"foo": "bar"');
46
- });
47
- it('should format AggregateError', () => {
48
- const error1 = new Error('sub error 1');
49
- const error2 = new Error('sub error 2');
50
- const aggregateError = new AggregateError([error1, error2], 'aggregate message');
51
- const formatted = formatError(aggregateError, { includeStack: false });
52
- expect(formatted).toContain('AggregateError: aggregate message');
53
- expect(formatted).toContain('Sub-error #1:');
54
- expect(formatted).toContain('Error: sub error 1');
55
- expect(formatted).toContain('Sub-error #2:');
56
- expect(formatted).toContain('Error: sub error 2');
57
- });
58
- it('should handle deep cause chains', () => {
59
- const cause2 = new Error('bottom');
60
- const cause1 = new Error('middle', { cause: cause2 });
61
- const error = new Error('top', { cause: cause1 });
62
- const formatted = formatError(error, { includeStack: true });
63
- expect(formatted).toContain('Error: top');
64
- expect(formatted).toContain('Caused by:\n Error: middle');
65
- expect(formatted).toContain('\n Caused by:\n Error: bottom');
66
- });
67
- it('should handle non-error objects', () => {
68
- const obj = { foo: 'bar', baz: 123 };
69
- const formatted = formatError(obj);
70
- expect(formatted).toContain('"foo": "bar"');
71
- expect(formatted).toContain('"baz": 123');
72
- });
73
- it('should handle errors with empty messages', () => {
74
- const error = new Error('');
75
- error.name = 'CustomError';
76
- const formatted = formatError(error, { includeStack: false });
77
- expect(formatted).toBe('CustomError: ');
78
- });
79
- it('should handle null or undefined', () => {
80
- // Current behavior defaults name to 'Error' for non-raw-object fallback
81
- expect(formatError(null)).toBe('Error: null');
82
- expect(formatError(undefined)).toBe('Error: undefined');
83
- });
84
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,42 +0,0 @@
1
- import { describe, expect, test } from 'vitest';
2
- import { ServerTiming } from '../server-timing.js';
3
- describe('ServerTiming', () => {
4
- test('should be empty by default', () => {
5
- const timing = new ServerTiming();
6
- expect(timing.hasMetrics).toBe(false);
7
- expect(timing.toString()).toBe('');
8
- });
9
- test('should add a simple metric', () => {
10
- const timing = new ServerTiming();
11
- timing.add('db');
12
- expect(timing.hasMetrics).toBe(true);
13
- expect(timing.toString()).toBe('db');
14
- });
15
- test('should add a metric with duration', () => {
16
- const timing = new ServerTiming();
17
- timing.add('db', 53.2);
18
- expect(timing.toString()).toBe('db;dur=53.2');
19
- });
20
- test('should add a metric with duration and description', () => {
21
- const timing = new ServerTiming();
22
- timing.add('db', 53.2, 'Database Query');
23
- expect(timing.toString()).toBe('db;dur=53.2;desc="Database Query"');
24
- });
25
- test('should add multiple metrics', () => {
26
- const timing = new ServerTiming();
27
- timing.add('cache', undefined, 'Cache Miss');
28
- timing.add('db', 53.2);
29
- timing.add('total', 123.45);
30
- expect(timing.toString()).toBe('cache;desc="Cache Miss", db;dur=53.2, total;dur=123.45');
31
- });
32
- test('should use start/stop for metrics', async () => {
33
- const timing = new ServerTiming();
34
- const stop = timing.start('total');
35
- await new Promise((resolve) => setTimeout(resolve, 11));
36
- stop();
37
- const result = timing.toString();
38
- expect(result).toMatch(/total;dur=\d+\.\d+/);
39
- const duration = Number.parseFloat(result.split('=')[1]);
40
- expect(duration).toBeGreaterThanOrEqual(10);
41
- });
42
- });
@@ -1 +0,0 @@
1
- import '../../polyfills.js';