@bluelibs/runner 3.4.2 → 4.0.1

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 (375) hide show
  1. package/AI.md +621 -0
  2. package/README.md +1024 -577
  3. package/dist/context.d.ts +4 -8
  4. package/dist/context.js +5 -12
  5. package/dist/context.js.map +1 -1
  6. package/dist/define.d.ts +9 -113
  7. package/dist/define.js +29 -358
  8. package/dist/define.js.map +1 -1
  9. package/dist/definers/defineEvent.d.ts +2 -0
  10. package/dist/definers/defineEvent.js +23 -0
  11. package/dist/definers/defineEvent.js.map +1 -0
  12. package/dist/definers/defineHook.d.ts +6 -0
  13. package/dist/definers/defineHook.js +24 -0
  14. package/dist/definers/defineHook.js.map +1 -0
  15. package/dist/definers/defineOverride.d.ts +14 -0
  16. package/dist/definers/defineOverride.js +13 -0
  17. package/dist/definers/defineOverride.js.map +1 -0
  18. package/dist/definers/defineResource.d.ts +2 -0
  19. package/dist/definers/defineResource.js +69 -0
  20. package/dist/definers/defineResource.js.map +1 -0
  21. package/dist/definers/defineResourceMiddleware.d.ts +2 -0
  22. package/dist/definers/defineResourceMiddleware.js +42 -0
  23. package/dist/definers/defineResourceMiddleware.js.map +1 -0
  24. package/dist/definers/defineTag.d.ts +12 -0
  25. package/dist/definers/defineTag.js +106 -0
  26. package/dist/definers/defineTag.js.map +1 -0
  27. package/dist/definers/defineTask.d.ts +15 -0
  28. package/dist/definers/defineTask.js +42 -0
  29. package/dist/definers/defineTask.js.map +1 -0
  30. package/dist/definers/defineTaskMiddleware.d.ts +2 -0
  31. package/dist/definers/defineTaskMiddleware.js +42 -0
  32. package/dist/definers/defineTaskMiddleware.js.map +1 -0
  33. package/dist/definers/tools.d.ts +45 -0
  34. package/dist/definers/tools.js +75 -0
  35. package/dist/definers/tools.js.map +1 -0
  36. package/dist/defs.d.ts +16 -424
  37. package/dist/defs.js +26 -38
  38. package/dist/defs.js.map +1 -1
  39. package/dist/errors.d.ts +23 -8
  40. package/dist/errors.js +50 -10
  41. package/dist/errors.js.map +1 -1
  42. package/dist/globals/globalEvents.d.ts +15 -39
  43. package/dist/globals/globalEvents.js +20 -81
  44. package/dist/globals/globalEvents.js.map +1 -1
  45. package/dist/globals/globalMiddleware.d.ts +24 -17
  46. package/dist/globals/globalMiddleware.js +12 -4
  47. package/dist/globals/globalMiddleware.js.map +1 -1
  48. package/dist/globals/globalResources.d.ts +13 -28
  49. package/dist/globals/globalResources.js +15 -7
  50. package/dist/globals/globalResources.js.map +1 -1
  51. package/dist/globals/globalTags.d.ts +9 -0
  52. package/dist/globals/globalTags.js +23 -0
  53. package/dist/globals/globalTags.js.map +1 -0
  54. package/dist/globals/middleware/cache.middleware.d.ts +10 -17
  55. package/dist/globals/middleware/cache.middleware.js +4 -16
  56. package/dist/globals/middleware/cache.middleware.js.map +1 -1
  57. package/dist/globals/middleware/requireContext.middleware.d.ts +1 -1
  58. package/dist/globals/middleware/requireContext.middleware.js +5 -14
  59. package/dist/globals/middleware/requireContext.middleware.js.map +1 -1
  60. package/dist/globals/middleware/retry.middleware.d.ts +2 -1
  61. package/dist/globals/middleware/retry.middleware.js +32 -5
  62. package/dist/globals/middleware/retry.middleware.js.map +1 -1
  63. package/dist/globals/middleware/timeout.middleware.d.ts +2 -1
  64. package/dist/globals/middleware/timeout.middleware.js +31 -5
  65. package/dist/globals/middleware/timeout.middleware.js.map +1 -1
  66. package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
  67. package/dist/globals/resources/debug/debug.resource.js +29 -0
  68. package/dist/globals/resources/debug/debug.resource.js.map +1 -0
  69. package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
  70. package/dist/globals/resources/debug/debug.tag.js +12 -0
  71. package/dist/globals/resources/debug/debug.tag.js.map +1 -0
  72. package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
  73. package/dist/globals/resources/debug/debugConfig.resource.js +20 -0
  74. package/dist/globals/resources/debug/debugConfig.resource.js.map +1 -0
  75. package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
  76. package/dist/globals/resources/debug/executionTracker.middleware.js +87 -0
  77. package/dist/globals/resources/debug/executionTracker.middleware.js.map +1 -0
  78. package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
  79. package/dist/globals/resources/debug/globalEvent.hook.js +38 -0
  80. package/dist/globals/resources/debug/globalEvent.hook.js.map +1 -0
  81. package/dist/globals/resources/debug/hook.hook.d.ts +25 -0
  82. package/dist/globals/resources/debug/hook.hook.js +42 -0
  83. package/dist/globals/resources/debug/hook.hook.js.map +1 -0
  84. package/dist/globals/resources/debug/index.d.ts +6 -0
  85. package/dist/{types → globals/resources/debug}/index.js +6 -11
  86. package/dist/globals/resources/debug/index.js.map +1 -0
  87. package/dist/globals/resources/debug/middleware.hook.d.ts +25 -0
  88. package/dist/globals/resources/debug/middleware.hook.js +71 -0
  89. package/dist/globals/resources/debug/middleware.hook.js.map +1 -0
  90. package/dist/globals/resources/debug/types.d.ts +25 -0
  91. package/dist/globals/resources/debug/types.js +65 -0
  92. package/dist/globals/resources/debug/types.js.map +1 -0
  93. package/dist/globals/resources/debug/utils.d.ts +2 -0
  94. package/dist/globals/resources/debug/utils.js +9 -0
  95. package/dist/globals/resources/debug/utils.js.map +1 -0
  96. package/dist/globals/resources/queue.resource.d.ts +3 -3
  97. package/dist/globals/resources/queue.resource.js.map +1 -1
  98. package/dist/globals/types.d.ts +1 -0
  99. package/dist/{task.types.js → globals/types.js} +2 -7
  100. package/dist/globals/types.js.map +1 -0
  101. package/dist/index.d.ts +58 -85
  102. package/dist/index.js +23 -10
  103. package/dist/index.js.map +1 -1
  104. package/dist/models/DependencyProcessor.d.ts +8 -6
  105. package/dist/models/DependencyProcessor.js +116 -33
  106. package/dist/models/DependencyProcessor.js.map +1 -1
  107. package/dist/models/EventManager.d.ts +127 -7
  108. package/dist/models/EventManager.js +251 -78
  109. package/dist/models/EventManager.js.map +1 -1
  110. package/dist/models/LogPrinter.d.ts +55 -0
  111. package/dist/models/LogPrinter.js +196 -0
  112. package/dist/models/LogPrinter.js.map +1 -0
  113. package/dist/models/Logger.d.ts +47 -27
  114. package/dist/models/Logger.js +133 -155
  115. package/dist/models/Logger.js.map +1 -1
  116. package/dist/models/MiddlewareManager.d.ts +86 -0
  117. package/dist/models/MiddlewareManager.js +409 -0
  118. package/dist/models/MiddlewareManager.js.map +1 -0
  119. package/dist/models/OverrideManager.d.ts +3 -3
  120. package/dist/models/OverrideManager.js +22 -7
  121. package/dist/models/OverrideManager.js.map +1 -1
  122. package/dist/models/ResourceInitializer.d.ts +4 -3
  123. package/dist/models/ResourceInitializer.js +12 -68
  124. package/dist/models/ResourceInitializer.js.map +1 -1
  125. package/dist/models/RunResult.d.ts +35 -0
  126. package/dist/models/RunResult.js +68 -0
  127. package/dist/models/RunResult.js.map +1 -0
  128. package/dist/models/Store.d.ts +30 -17
  129. package/dist/models/Store.js +87 -25
  130. package/dist/models/Store.js.map +1 -1
  131. package/dist/models/StoreRegistry.d.ts +34 -19
  132. package/dist/models/StoreRegistry.js +248 -100
  133. package/dist/models/StoreRegistry.js.map +1 -1
  134. package/dist/models/StoreValidator.d.ts +5 -7
  135. package/dist/models/StoreValidator.js +50 -17
  136. package/dist/models/StoreValidator.js.map +1 -1
  137. package/dist/models/TaskRunner.d.ts +3 -2
  138. package/dist/models/TaskRunner.js +6 -103
  139. package/dist/models/TaskRunner.js.map +1 -1
  140. package/dist/models/UnhandledError.d.ts +11 -0
  141. package/dist/models/UnhandledError.js +30 -0
  142. package/dist/models/UnhandledError.js.map +1 -0
  143. package/dist/models/index.d.ts +3 -0
  144. package/dist/models/index.js +3 -0
  145. package/dist/models/index.js.map +1 -1
  146. package/dist/{tools → models/utils}/findCircularDependencies.js +8 -16
  147. package/dist/models/utils/findCircularDependencies.js.map +1 -0
  148. package/dist/models/utils/safeStringify.d.ts +3 -0
  149. package/dist/models/utils/safeStringify.js +45 -0
  150. package/dist/models/utils/safeStringify.js.map +1 -0
  151. package/dist/processHooks.d.ts +2 -0
  152. package/dist/processHooks.js +70 -0
  153. package/dist/processHooks.js.map +1 -0
  154. package/dist/run.d.ts +14 -27
  155. package/dist/run.js +100 -36
  156. package/dist/run.js.map +1 -1
  157. package/dist/testing.d.ts +5 -4
  158. package/dist/testing.js +3 -2
  159. package/dist/testing.js.map +1 -1
  160. package/dist/tools/getCallerFile.d.ts +0 -8
  161. package/dist/tools/getCallerFile.js +0 -51
  162. package/dist/tools/getCallerFile.js.map +1 -1
  163. package/dist/types/contracts.d.ts +55 -0
  164. package/dist/types/contracts.js +4 -0
  165. package/dist/types/contracts.js.map +1 -0
  166. package/dist/types/event.d.ts +26 -7
  167. package/dist/types/event.js +1 -1
  168. package/dist/types/event.js.map +1 -1
  169. package/dist/types/hook.d.ts +21 -0
  170. package/dist/{models/StoreTypes.js → types/hook.js} +2 -1
  171. package/dist/types/hook.js.map +1 -0
  172. package/dist/types/meta.d.ts +6 -1
  173. package/dist/types/meta.js +4 -2
  174. package/dist/types/meta.js.map +1 -1
  175. package/dist/types/resource.d.ts +40 -52
  176. package/dist/types/resource.js +1 -0
  177. package/dist/types/resource.js.map +1 -1
  178. package/dist/types/resourceMiddleware.d.ts +47 -0
  179. package/dist/{middleware.types.js → types/resourceMiddleware.js} +1 -1
  180. package/dist/types/resourceMiddleware.js.map +1 -0
  181. package/dist/types/runner.d.ts +37 -0
  182. package/dist/types/{base.js → runner.js} +1 -1
  183. package/dist/types/runner.js.map +1 -0
  184. package/dist/types/storeTypes.d.ts +40 -0
  185. package/dist/types/{metadata.js → storeTypes.js} +1 -1
  186. package/dist/types/storeTypes.js.map +1 -0
  187. package/dist/types/symbols.d.ts +10 -21
  188. package/dist/types/symbols.js +17 -22
  189. package/dist/types/symbols.js.map +1 -1
  190. package/dist/types/tag.d.ts +46 -0
  191. package/dist/{resource.types.js → types/tag.js} +2 -1
  192. package/dist/types/tag.js.map +1 -0
  193. package/dist/types/task.d.ts +28 -52
  194. package/dist/types/task.js +1 -0
  195. package/dist/types/task.js.map +1 -1
  196. package/dist/types/taskMiddleware.d.ts +48 -0
  197. package/dist/{event.types.js → types/taskMiddleware.js} +1 -1
  198. package/dist/types/taskMiddleware.js.map +1 -0
  199. package/dist/types/utilities.d.ts +105 -6
  200. package/dist/types/utilities.js +16 -2
  201. package/dist/types/utilities.js.map +1 -1
  202. package/package.json +14 -5
  203. package/dist/cli/extract-docs.d.ts +0 -2
  204. package/dist/cli/extract-docs.js +0 -88
  205. package/dist/cli/extract-docs.js.map +0 -1
  206. package/dist/common.types.d.ts +0 -20
  207. package/dist/common.types.js +0 -4
  208. package/dist/common.types.js.map +0 -1
  209. package/dist/defs/core.d.ts +0 -144
  210. package/dist/defs/core.js +0 -6
  211. package/dist/defs/core.js.map +0 -1
  212. package/dist/defs/symbols.d.ts +0 -42
  213. package/dist/defs/symbols.js +0 -45
  214. package/dist/defs/symbols.js.map +0 -1
  215. package/dist/defs/tags.d.ts +0 -70
  216. package/dist/defs/tags.js +0 -6
  217. package/dist/defs/tags.js.map +0 -1
  218. package/dist/defs.returnTag.d.ts +0 -36
  219. package/dist/defs.returnTag.js +0 -4
  220. package/dist/defs.returnTag.js.map +0 -1
  221. package/dist/docs/introspect.d.ts +0 -7
  222. package/dist/docs/introspect.js +0 -199
  223. package/dist/docs/introspect.js.map +0 -1
  224. package/dist/docs/markdown.d.ts +0 -2
  225. package/dist/docs/markdown.js +0 -148
  226. package/dist/docs/markdown.js.map +0 -1
  227. package/dist/docs/model.d.ts +0 -62
  228. package/dist/docs/model.js +0 -33
  229. package/dist/docs/model.js.map +0 -1
  230. package/dist/event.types.d.ts +0 -18
  231. package/dist/event.types.js.map +0 -1
  232. package/dist/examples/express-mongo/index.d.ts +0 -0
  233. package/dist/examples/express-mongo/index.js +0 -3
  234. package/dist/examples/express-mongo/index.js.map +0 -1
  235. package/dist/examples/registrator-example.d.ts +0 -122
  236. package/dist/examples/registrator-example.js +0 -147
  237. package/dist/examples/registrator-example.js.map +0 -1
  238. package/dist/express/docsRouter.d.ts +0 -12
  239. package/dist/express/docsRouter.js +0 -54
  240. package/dist/express/docsRouter.js.map +0 -1
  241. package/dist/globalEvents.d.ts +0 -40
  242. package/dist/globalEvents.js +0 -94
  243. package/dist/globalEvents.js.map +0 -1
  244. package/dist/globalResources.d.ts +0 -10
  245. package/dist/globalResources.js +0 -43
  246. package/dist/globalResources.js.map +0 -1
  247. package/dist/middleware.types.d.ts +0 -40
  248. package/dist/middleware.types.js.map +0 -1
  249. package/dist/models/StoreConstants.d.ts +0 -14
  250. package/dist/models/StoreConstants.js +0 -19
  251. package/dist/models/StoreConstants.js.map +0 -1
  252. package/dist/models/StoreTypes.d.ts +0 -21
  253. package/dist/models/StoreTypes.js.map +0 -1
  254. package/dist/models/VarStore.d.ts +0 -17
  255. package/dist/models/VarStore.js +0 -60
  256. package/dist/models/VarStore.js.map +0 -1
  257. package/dist/resource.types.d.ts +0 -31
  258. package/dist/resource.types.js.map +0 -1
  259. package/dist/symbols.d.ts +0 -24
  260. package/dist/symbols.js +0 -29
  261. package/dist/symbols.js.map +0 -1
  262. package/dist/t1.d.ts +0 -1
  263. package/dist/t1.js +0 -13
  264. package/dist/t1.js.map +0 -1
  265. package/dist/task.types.d.ts +0 -55
  266. package/dist/task.types.js.map +0 -1
  267. package/dist/tools/findCircularDependencies.js.map +0 -1
  268. package/dist/tools/registratorId.d.ts +0 -4
  269. package/dist/tools/registratorId.js +0 -40
  270. package/dist/tools/registratorId.js.map +0 -1
  271. package/dist/tools/simpleHash.d.ts +0 -9
  272. package/dist/tools/simpleHash.js +0 -34
  273. package/dist/tools/simpleHash.js.map +0 -1
  274. package/dist/types/base-interfaces.d.ts +0 -18
  275. package/dist/types/base-interfaces.js +0 -6
  276. package/dist/types/base-interfaces.js.map +0 -1
  277. package/dist/types/base.d.ts +0 -13
  278. package/dist/types/base.js.map +0 -1
  279. package/dist/types/dependencies.d.ts +0 -51
  280. package/dist/types/dependencies.js +0 -3
  281. package/dist/types/dependencies.js.map +0 -1
  282. package/dist/types/dependency-core.d.ts +0 -14
  283. package/dist/types/dependency-core.js +0 -5
  284. package/dist/types/dependency-core.js.map +0 -1
  285. package/dist/types/events.d.ts +0 -52
  286. package/dist/types/events.js +0 -6
  287. package/dist/types/events.js.map +0 -1
  288. package/dist/types/hooks.d.ts +0 -16
  289. package/dist/types/hooks.js +0 -5
  290. package/dist/types/hooks.js.map +0 -1
  291. package/dist/types/index.d.ts +0 -8
  292. package/dist/types/index.js.map +0 -1
  293. package/dist/types/metadata.d.ts +0 -75
  294. package/dist/types/metadata.js.map +0 -1
  295. package/dist/types/middleware.d.ts +0 -63
  296. package/dist/types/middleware.js +0 -3
  297. package/dist/types/middleware.js.map +0 -1
  298. package/dist/types/registerable.d.ts +0 -10
  299. package/dist/types/registerable.js +0 -5
  300. package/dist/types/registerable.js.map +0 -1
  301. package/dist/types/resources.d.ts +0 -44
  302. package/dist/types/resources.js +0 -5
  303. package/dist/types/resources.js.map +0 -1
  304. package/dist/types/tasks.d.ts +0 -41
  305. package/dist/types/tasks.js +0 -5
  306. package/dist/types/tasks.js.map +0 -1
  307. package/src/__tests__/benchmark/benchmark.test.ts +0 -148
  308. package/src/__tests__/benchmark/task-benchmark.test.ts +0 -132
  309. package/src/__tests__/context.test.ts +0 -91
  310. package/src/__tests__/createTestResource.test.ts +0 -139
  311. package/src/__tests__/errors.test.ts +0 -341
  312. package/src/__tests__/globalEvents.test.ts +0 -542
  313. package/src/__tests__/globals/cache.middleware.test.ts +0 -772
  314. package/src/__tests__/globals/queue.resource.test.ts +0 -141
  315. package/src/__tests__/globals/requireContext.middleware.test.ts +0 -98
  316. package/src/__tests__/globals/retry.middleware.test.ts +0 -157
  317. package/src/__tests__/globals/timeout.middleware.test.ts +0 -88
  318. package/src/__tests__/index.helper.test.ts +0 -55
  319. package/src/__tests__/models/EventManager.test.ts +0 -585
  320. package/src/__tests__/models/Logger.test.ts +0 -519
  321. package/src/__tests__/models/Queue.test.ts +0 -189
  322. package/src/__tests__/models/ResourceInitializer.test.ts +0 -148
  323. package/src/__tests__/models/Semaphore.test.ts +0 -713
  324. package/src/__tests__/models/Store.test.ts +0 -227
  325. package/src/__tests__/models/TaskRunner.test.ts +0 -221
  326. package/src/__tests__/override.test.ts +0 -104
  327. package/src/__tests__/recursion/README.md +0 -3
  328. package/src/__tests__/recursion/a.resource.ts +0 -25
  329. package/src/__tests__/recursion/b.resource.ts +0 -33
  330. package/src/__tests__/recursion/c.resource.ts +0 -18
  331. package/src/__tests__/run.anonymous.test.ts +0 -706
  332. package/src/__tests__/run.dynamic-register-and-dependencies.test.ts +0 -1185
  333. package/src/__tests__/run.middleware.test.ts +0 -549
  334. package/src/__tests__/run.overrides.test.ts +0 -424
  335. package/src/__tests__/run.test.ts +0 -1040
  336. package/src/__tests__/setOutput.test.ts +0 -244
  337. package/src/__tests__/tags.test.ts +0 -396
  338. package/src/__tests__/tools/findCircularDependencies.test.ts +0 -217
  339. package/src/__tests__/tools/getCallerFile.test.ts +0 -179
  340. package/src/__tests__/typesafety.test.ts +0 -423
  341. package/src/__tests__/validation-edge-cases.test.ts +0 -111
  342. package/src/__tests__/validation-interface.test.ts +0 -428
  343. package/src/context.ts +0 -86
  344. package/src/define.ts +0 -480
  345. package/src/defs.returnTag.ts +0 -91
  346. package/src/defs.ts +0 -596
  347. package/src/errors.ts +0 -105
  348. package/src/globals/globalEvents.ts +0 -125
  349. package/src/globals/globalMiddleware.ts +0 -16
  350. package/src/globals/globalResources.ts +0 -53
  351. package/src/globals/middleware/cache.middleware.ts +0 -115
  352. package/src/globals/middleware/requireContext.middleware.ts +0 -36
  353. package/src/globals/middleware/retry.middleware.ts +0 -56
  354. package/src/globals/middleware/timeout.middleware.ts +0 -46
  355. package/src/globals/resources/queue.resource.ts +0 -34
  356. package/src/index.ts +0 -39
  357. package/src/models/DependencyProcessor.ts +0 -257
  358. package/src/models/EventManager.ts +0 -210
  359. package/src/models/Logger.ts +0 -282
  360. package/src/models/OverrideManager.ts +0 -79
  361. package/src/models/Queue.ts +0 -66
  362. package/src/models/ResourceInitializer.ts +0 -165
  363. package/src/models/Semaphore.ts +0 -208
  364. package/src/models/Store.ts +0 -193
  365. package/src/models/StoreConstants.ts +0 -18
  366. package/src/models/StoreRegistry.ts +0 -253
  367. package/src/models/StoreTypes.ts +0 -47
  368. package/src/models/StoreValidator.ts +0 -43
  369. package/src/models/TaskRunner.ts +0 -203
  370. package/src/models/index.ts +0 -8
  371. package/src/run.ts +0 -116
  372. package/src/testing.ts +0 -66
  373. package/src/tools/findCircularDependencies.ts +0 -69
  374. package/src/tools/getCallerFile.ts +0 -96
  375. /package/dist/{tools → models/utils}/findCircularDependencies.d.ts +0 -0
@@ -1,585 +0,0 @@
1
- import {
2
- IEvent,
3
- IEventEmission,
4
- symbolEvent,
5
- symbolFilePath,
6
- } from "../../defs";
7
- import { EventManager } from "../../models/EventManager";
8
-
9
- describe("EventManager", () => {
10
- let eventManager: EventManager;
11
- let eventDefinition: IEvent<string>;
12
-
13
- beforeEach(() => {
14
- eventManager = new EventManager();
15
- eventDefinition = {
16
- id: "testEvent",
17
- [symbolEvent]: true,
18
- [symbolFilePath]: "test.ts",
19
- };
20
- });
21
-
22
- it("should add and emit event listener", async () => {
23
- const handler = jest.fn();
24
- eventManager.addListener(eventDefinition, handler);
25
-
26
- await eventManager.emit(eventDefinition, "testData", "test");
27
-
28
- expect(handler).toHaveBeenCalledTimes(1);
29
- expect(handler).toHaveBeenCalledWith(
30
- expect.objectContaining({
31
- id: "testEvent",
32
- data: "testData",
33
- timestamp: expect.any(Date),
34
- })
35
- );
36
- });
37
-
38
- it("should respect listener order", async () => {
39
- const results: number[] = [];
40
-
41
- eventManager.addListener(
42
- eventDefinition,
43
- () => {
44
- results.push(1);
45
- },
46
- { order: 2 }
47
- );
48
-
49
- eventManager.addListener(
50
- eventDefinition,
51
- () => {
52
- results.push(0);
53
- },
54
- { order: 1 }
55
- );
56
-
57
- eventManager.addListener(
58
- eventDefinition,
59
- () => {
60
- results.push(3);
61
- },
62
- { order: 4 }
63
- );
64
-
65
- eventManager.addListener(
66
- eventDefinition,
67
- () => {
68
- results.push(2);
69
- },
70
- { order: 3 }
71
- );
72
-
73
- await eventManager.emit(eventDefinition, "testData", "test");
74
-
75
- expect(results).toEqual([0, 1, 2, 3]);
76
- });
77
-
78
- it("should apply filters correctly", async () => {
79
- const handler = jest.fn();
80
- const filter = (event: IEventEmission<string>) => event.data === "allowed";
81
-
82
- eventManager.addListener(eventDefinition, handler, { filter });
83
-
84
- await eventManager.emit(eventDefinition, "blocked", "test");
85
- expect(handler).not.toHaveBeenCalled();
86
-
87
- await eventManager.emit(eventDefinition, "allowed", "test");
88
- expect(handler).toHaveBeenCalledTimes(1);
89
- expect(handler).toHaveBeenCalledWith(
90
- expect.objectContaining({
91
- data: "allowed",
92
- })
93
- );
94
- });
95
-
96
- it("should add and emit global listener", async () => {
97
- const handler = jest.fn();
98
-
99
- eventManager.addGlobalListener(handler);
100
-
101
- await eventManager.emit(eventDefinition, "testData", "test");
102
-
103
- expect(handler).toHaveBeenCalledTimes(1);
104
- expect(handler).toHaveBeenCalledWith(
105
- expect.objectContaining({
106
- id: "testEvent",
107
- data: "testData",
108
- timestamp: expect.any(Date),
109
- })
110
- );
111
- });
112
-
113
- it("global listeners should respect order with event listeners", async () => {
114
- const results: string[] = [];
115
-
116
- eventManager.addListener(
117
- eventDefinition,
118
- () => {
119
- results.push("eventListener1");
120
- },
121
- { order: 2 }
122
- );
123
-
124
- eventManager.addGlobalListener(
125
- () => {
126
- results.push("globalListener1");
127
- },
128
- { order: 1 }
129
- );
130
-
131
- eventManager.addListener(
132
- eventDefinition,
133
- () => {
134
- results.push("eventListener2");
135
- },
136
- { order: 4 }
137
- );
138
-
139
- eventManager.addGlobalListener(
140
- () => {
141
- results.push("globalListener2");
142
- },
143
- { order: 3 }
144
- );
145
-
146
- await eventManager.emit(eventDefinition, "testData", "test");
147
-
148
- expect(results).toEqual([
149
- "globalListener1",
150
- "eventListener1",
151
- "globalListener2",
152
- "eventListener2",
153
- ]);
154
- });
155
-
156
- it("should lock and prevent adding new listeners", () => {
157
- eventManager.lock();
158
-
159
- expect(eventManager.isLocked).toBe(true);
160
-
161
- const handler = jest.fn();
162
-
163
- expect(() => {
164
- eventManager.addListener(eventDefinition, handler);
165
- }).toThrowError("Cannot modify the EventManager when it is locked.");
166
-
167
- expect(() => {
168
- eventManager.addGlobalListener(handler);
169
- }).toThrowError("Cannot modify the EventManager when it is locked.");
170
- });
171
-
172
- it("should handle multiple events", async () => {
173
- const eventDef1: IEvent<string> = {
174
- id: "event1",
175
- [symbolEvent]: true,
176
- [symbolFilePath]: "test.ts",
177
- };
178
- const eventDef2: IEvent<string> = {
179
- id: "event2",
180
- [symbolEvent]: true,
181
- [symbolFilePath]: "test.ts",
182
- };
183
-
184
- const handler1 = jest.fn();
185
- const handler2 = jest.fn();
186
-
187
- eventManager.addListener(eventDef1, handler1);
188
- eventManager.addListener(eventDef2, handler2);
189
-
190
- await eventManager.emit(eventDef1, "data1", "test");
191
- await eventManager.emit(eventDef2, "data2", "test");
192
-
193
- expect(handler1).toHaveBeenCalledTimes(1);
194
- expect(handler1).toHaveBeenCalledWith(
195
- expect.objectContaining({
196
- id: "event1",
197
- data: "data1",
198
- timestamp: expect.any(Date),
199
- })
200
- );
201
-
202
- expect(handler2).toHaveBeenCalledTimes(1);
203
- expect(handler2).toHaveBeenCalledWith(
204
- expect.objectContaining({
205
- id: "event2",
206
- data: "data2",
207
- })
208
- );
209
- });
210
-
211
- it("should allow adding multiple listeners to the same event", async () => {
212
- const handler1 = jest.fn();
213
- const handler2 = jest.fn();
214
-
215
- eventManager.addListener(eventDefinition, handler1);
216
- eventManager.addListener(eventDefinition, handler2);
217
-
218
- await eventManager.emit(eventDefinition, "testData", "test");
219
-
220
- expect(handler1).toHaveBeenCalledTimes(1);
221
- expect(handler2).toHaveBeenCalledTimes(1);
222
- });
223
-
224
- it("should handle listeners added to multiple events", async () => {
225
- const eventDef1: IEvent<string> = {
226
- id: "event1",
227
- [symbolEvent]: true,
228
- [symbolFilePath]: "test.ts",
229
- };
230
- const eventDef2: IEvent<string> = {
231
- id: "event2",
232
- [symbolEvent]: true,
233
- [symbolFilePath]: "test.ts",
234
- };
235
-
236
- const handler = jest.fn();
237
-
238
- eventManager.addListener([eventDef1, eventDef2], handler);
239
-
240
- await eventManager.emit(eventDef1, "data1", "test");
241
- await eventManager.emit(eventDef2, "data2", "test");
242
-
243
- expect(handler).toHaveBeenCalledTimes(2);
244
- expect(handler).toHaveBeenNthCalledWith(
245
- 1,
246
- expect.objectContaining({
247
- id: "event1",
248
- data: "data1",
249
- })
250
- );
251
- expect(handler).toHaveBeenNthCalledWith(
252
- 2,
253
- expect.objectContaining({
254
- id: "event2",
255
- data: "data2",
256
- })
257
- );
258
- });
259
-
260
- it("should not affect other events when emitting one", async () => {
261
- const eventDef1: IEvent<string> = {
262
- id: "event1",
263
- [symbolEvent]: true,
264
- [symbolFilePath]: "test.ts",
265
- };
266
- const eventDef2: IEvent<string> = {
267
- id: "event2",
268
- [symbolEvent]: true,
269
- [symbolFilePath]: "test.ts",
270
- };
271
-
272
- const handler1 = jest.fn();
273
- const handler2 = jest.fn();
274
-
275
- eventManager.addListener(eventDef1, handler1);
276
- eventManager.addListener(eventDef2, handler2);
277
-
278
- await eventManager.emit(eventDef1, "data1", "test");
279
-
280
- expect(handler1).toHaveBeenCalledTimes(1);
281
- expect(handler2).not.toHaveBeenCalled();
282
- });
283
-
284
- it("should handle asynchronous handlers", async () => {
285
- const results: number[] = [];
286
-
287
- eventManager.addListener(
288
- eventDefinition,
289
- async () => {
290
- await new Promise((resolve) => setTimeout(resolve, 100));
291
- results.push(1);
292
- },
293
- { order: 1 }
294
- );
295
-
296
- eventManager.addListener(
297
- eventDefinition,
298
- () => {
299
- results.push(0);
300
- },
301
- { order: 0 }
302
- );
303
-
304
- await eventManager.emit(eventDefinition, "testData", "test");
305
-
306
- expect(results).toEqual([0, 1]);
307
- });
308
-
309
- it("should handle handler throwing an error", async () => {
310
- const handler = jest.fn().mockImplementation(() => {
311
- throw new Error("Handler error");
312
- });
313
-
314
- eventManager.addListener(eventDefinition, handler);
315
-
316
- await expect(
317
- eventManager.emit(eventDefinition, "testData", "test")
318
- ).rejects.toThrow("Handler error");
319
- });
320
-
321
- it("should continue calling other handlers if one fails", async () => {
322
- const handler1 = jest.fn().mockImplementation(() => {
323
- throw new Error("Handler error");
324
- });
325
- const handler2 = jest.fn();
326
-
327
- eventManager.addListener(eventDefinition, handler1);
328
- eventManager.addListener(eventDefinition, handler2);
329
-
330
- await expect(
331
- eventManager.emit(eventDefinition, "testData", "test")
332
- ).rejects.toThrow("Handler error");
333
-
334
- // The second handler should have been called despite the error in the first
335
- expect(handler2).toHaveBeenCalledTimes(1);
336
- });
337
-
338
- it("should not allow modification after lock", () => {
339
- const handler = jest.fn();
340
- eventManager.addListener(eventDefinition, handler);
341
- eventManager.lock();
342
-
343
- expect(() => {
344
- eventManager.addListener(eventDefinition, handler);
345
- }).toThrowError("Cannot modify the EventManager when it is locked.");
346
- });
347
-
348
- it("should not throw when emitting after lock", async () => {
349
- const handler = jest.fn();
350
- eventManager.addListener(eventDefinition, handler);
351
- eventManager.lock();
352
-
353
- await expect(
354
- eventManager.emit(eventDefinition, "testData", "test")
355
- ).resolves.toBeUndefined();
356
-
357
- expect(handler).toHaveBeenCalledTimes(1);
358
- });
359
-
360
- it("should correctly merge global and event listeners with same order", async () => {
361
- const results: string[] = [];
362
-
363
- eventManager.addListener(
364
- eventDefinition,
365
- () => {
366
- results.push("eventListener");
367
- },
368
- { order: 1 }
369
- );
370
-
371
- eventManager.addGlobalListener(
372
- () => {
373
- results.push("globalListener");
374
- },
375
- { order: 1 }
376
- );
377
-
378
- await eventManager.emit(eventDefinition, "testData", "test");
379
-
380
- // According to the merge logic, event listeners come before global listeners when orders are equal
381
- expect(results).toEqual(["eventListener", "globalListener"]);
382
- });
383
-
384
- it("should handle filters in global listeners", async () => {
385
- const handler = jest.fn();
386
- const filter = (event: IEventEmission<string>) => event.data === "allowed";
387
-
388
- eventManager.addGlobalListener(handler, { filter });
389
-
390
- await eventManager.emit(eventDefinition, "blocked", "test");
391
- expect(handler).not.toHaveBeenCalled();
392
-
393
- await eventManager.emit(eventDefinition, "allowed", "test");
394
- expect(handler).toHaveBeenCalledTimes(1);
395
- });
396
-
397
- it("should handle emitting with no listeners", async () => {
398
- await expect(
399
- eventManager.emit(eventDefinition, "testData", "test")
400
- ).resolves.toBeUndefined();
401
- });
402
-
403
- it("should handle listeners with no data", async () => {
404
- const handler = jest.fn();
405
-
406
- const voidEventDefinition: IEvent<void> = {
407
- id: "voidEvent",
408
- [symbolEvent]: true,
409
- [symbolFilePath]: "test.ts",
410
- };
411
-
412
- eventManager.addListener(voidEventDefinition, handler);
413
-
414
- await eventManager.emit(voidEventDefinition, undefined, "test");
415
-
416
- expect(handler).toHaveBeenCalledTimes(1);
417
- expect(handler).toHaveBeenCalledWith(
418
- expect.objectContaining({
419
- id: "voidEvent",
420
- data: undefined,
421
- timestamp: expect.any(Date),
422
- })
423
- );
424
- });
425
-
426
- describe("Performance Optimizations", () => {
427
- it("should cache merged listeners for repeated emits", async () => {
428
- const handler1 = jest.fn();
429
- const handler2 = jest.fn();
430
-
431
- eventManager.addListener(eventDefinition, handler1, { order: 1 });
432
- eventManager.addGlobalListener(handler2, { order: 2 });
433
-
434
- // First emit should build cache
435
- await eventManager.emit(eventDefinition, "test1", "source");
436
- // Second emit should use cache
437
- await eventManager.emit(eventDefinition, "test2", "source");
438
-
439
- expect(handler1).toHaveBeenCalledTimes(2);
440
- expect(handler2).toHaveBeenCalledTimes(2);
441
- });
442
-
443
- it("should invalidate cache when adding event listeners", async () => {
444
- const handler1 = jest.fn();
445
- const handler2 = jest.fn();
446
- const handler3 = jest.fn();
447
-
448
- eventManager.addListener(eventDefinition, handler1, { order: 2 });
449
- await eventManager.emit(eventDefinition, "test1", "source");
450
-
451
- // Add new listener - should invalidate cache for this event
452
- eventManager.addListener(eventDefinition, handler2, { order: 1 });
453
- eventManager.addGlobalListener(handler3, { order: 3 });
454
-
455
- await eventManager.emit(eventDefinition, "test2", "source");
456
-
457
- expect(handler1).toHaveBeenCalledTimes(2);
458
- expect(handler2).toHaveBeenCalledTimes(1);
459
- expect(handler3).toHaveBeenCalledTimes(1);
460
- });
461
-
462
- it("should invalidate all caches when adding global listeners", async () => {
463
- const event1: IEvent<string> = {
464
- id: "event1",
465
- [symbolEvent]: true,
466
- [symbolFilePath]: "test.ts",
467
- };
468
- const event2: IEvent<string> = {
469
- id: "event2",
470
- [symbolEvent]: true,
471
- [symbolFilePath]: "test.ts",
472
- };
473
-
474
- const handler1 = jest.fn();
475
- const handler2 = jest.fn();
476
- const globalHandler = jest.fn();
477
-
478
- eventManager.addListener(event1, handler1);
479
- eventManager.addListener(event2, handler2);
480
-
481
- // Emit to build caches
482
- await eventManager.emit(event1, "test1", "source");
483
- await eventManager.emit(event2, "test2", "source");
484
-
485
- // Add global listener - should invalidate all caches
486
- eventManager.addGlobalListener(globalHandler);
487
-
488
- // Emit again - global handler should be called
489
- await eventManager.emit(event1, "test3", "source");
490
- await eventManager.emit(event2, "test4", "source");
491
-
492
- expect(globalHandler).toHaveBeenCalledTimes(2);
493
- });
494
-
495
- it("should optimize for empty listener scenarios", async () => {
496
- const emptyEventDef: IEvent<string> = {
497
- id: "emptyEvent",
498
- [symbolEvent]: true,
499
- [symbolFilePath]: "test.ts",
500
- };
501
-
502
- // Should return immediately without creating event object
503
- await eventManager.emit(emptyEventDef, "test", "source");
504
-
505
- // No errors should occur
506
- expect(true).toBe(true);
507
- });
508
-
509
- it("should handle high-frequency emissions efficiently", async () => {
510
- const handler = jest.fn();
511
- eventManager.addListener(eventDefinition, handler);
512
- eventManager.addGlobalListener(jest.fn());
513
-
514
- const emitCount = 1000;
515
- const startTime = Date.now();
516
-
517
- for (let i = 0; i < emitCount; i++) {
518
- await eventManager.emit(eventDefinition, `test${i}`, "source");
519
- }
520
-
521
- const endTime = Date.now();
522
- const duration = endTime - startTime;
523
-
524
- expect(handler).toHaveBeenCalledTimes(emitCount);
525
- // Should complete reasonably fast (adjust threshold as needed)
526
- expect(duration).toBeLessThan(5000); // 5 seconds max for 1000 emissions
527
- });
528
-
529
- it("should efficiently handle mixed event and global listeners", async () => {
530
- const results: string[] = [];
531
-
532
- // Add many listeners with different orders
533
- for (let i = 0; i < 10; i++) {
534
- eventManager.addListener(
535
- eventDefinition,
536
- () => results.push(`event${i}`),
537
- { order: i * 2 }
538
- );
539
- eventManager.addGlobalListener(() => results.push(`global${i}`), {
540
- order: i * 2 + 1,
541
- });
542
- }
543
-
544
- await eventManager.emit(eventDefinition, "test", "source");
545
-
546
- // Should maintain correct order and call all listeners
547
- expect(results).toHaveLength(20);
548
- expect(results[0]).toBe("event0");
549
- expect(results[1]).toBe("global0");
550
- expect(results[18]).toBe("event9");
551
- expect(results[19]).toBe("global9");
552
- });
553
-
554
- it("should reuse cached results across different event types", async () => {
555
- const event1: IEvent<string> = {
556
- id: "event1",
557
- [symbolEvent]: true,
558
- [symbolFilePath]: "test.ts",
559
- };
560
- const event2: IEvent<string> = {
561
- id: "event2",
562
- [symbolEvent]: true,
563
- [symbolFilePath]: "test.ts",
564
- };
565
-
566
- const handler1 = jest.fn();
567
- const handler2 = jest.fn();
568
- const globalHandler = jest.fn();
569
-
570
- eventManager.addListener(event1, handler1);
571
- eventManager.addListener(event2, handler2);
572
- eventManager.addGlobalListener(globalHandler);
573
-
574
- // Multiple emits should use cached merged listeners
575
- await eventManager.emit(event1, "test1", "source");
576
- await eventManager.emit(event2, "test2", "source");
577
- await eventManager.emit(event1, "test3", "source");
578
- await eventManager.emit(event2, "test4", "source");
579
-
580
- expect(handler1).toHaveBeenCalledTimes(2);
581
- expect(handler2).toHaveBeenCalledTimes(2);
582
- expect(globalHandler).toHaveBeenCalledTimes(4);
583
- });
584
- });
585
- });