@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,542 +0,0 @@
1
- import { globalEvents } from "../globals/globalEvents";
2
- import {
3
- defineTask,
4
- defineResource,
5
- defineMiddleware,
6
- defineEvent,
7
- } from "../define";
8
- import { run } from "../run";
9
-
10
- describe("Global Events", () => {
11
- it("should emit global events during resource initialization and task execution", async () => {
12
- const globalBeforeInitHandler = jest.fn();
13
- const globalAfterInitHandler = jest.fn();
14
- const globalTaskBeforeRunHandler = jest.fn();
15
- const globalTaskAfterRunHandler = jest.fn();
16
- const globalResourceBeforeInitHandler = jest.fn();
17
- const globalResourceAfterInitHandler = jest.fn();
18
-
19
- const testResource = defineResource({
20
- id: "test.resource",
21
- init: async () => "Resource Value",
22
- });
23
-
24
- const testTask = defineTask({
25
- id: "test.task",
26
- run: async () => {
27
- return "Task Result";
28
- },
29
- });
30
-
31
- const taskBeforeInit = defineTask({
32
- id: "task.beforeInit",
33
- on: globalEvents.beforeInit,
34
- run: globalBeforeInitHandler,
35
- });
36
-
37
- const taskAfterInit = defineTask({
38
- id: "task.afterInit",
39
- on: globalEvents.afterInit,
40
- run: globalAfterInitHandler,
41
- });
42
-
43
- const taskBeforeRun = defineTask({
44
- id: "task.beforeRun",
45
- on: globalEvents.tasks.beforeRun,
46
- run: globalTaskBeforeRunHandler,
47
- });
48
-
49
- const taskAfterRun = defineTask({
50
- id: "task.afterRun",
51
- on: globalEvents.tasks.afterRun,
52
- run: globalTaskAfterRunHandler,
53
- });
54
-
55
- const resourceBeforeInit = defineTask({
56
- id: "resource.beforeInit",
57
- on: globalEvents.resources.beforeInit,
58
- run: globalResourceBeforeInitHandler,
59
- });
60
-
61
- const resourceAfterInit = defineTask({
62
- id: "resource.afterInit",
63
- on: globalEvents.resources.afterInit,
64
- run: globalResourceAfterInitHandler,
65
- });
66
-
67
- const app = defineResource({
68
- id: "app",
69
- register: [
70
- testResource,
71
- testTask,
72
- taskBeforeInit,
73
- taskAfterInit,
74
- taskBeforeRun,
75
- taskAfterRun,
76
- resourceBeforeInit,
77
- resourceAfterInit,
78
- ],
79
- dependencies: { testResource, testTask },
80
- async init(_, { testResource, testTask }) {
81
- expect(testResource).toBe("Resource Value");
82
- const response = await testTask();
83
- },
84
- });
85
-
86
- await run(app);
87
-
88
- expect(globalBeforeInitHandler).toHaveBeenCalled();
89
- expect(globalAfterInitHandler).toHaveBeenCalled();
90
- expect(globalResourceBeforeInitHandler).toHaveBeenCalled();
91
- expect(globalResourceAfterInitHandler).toHaveBeenCalled();
92
- expect(globalTaskBeforeRunHandler).toHaveBeenCalled();
93
- expect(globalTaskAfterRunHandler).toHaveBeenCalled();
94
- });
95
-
96
- it("should emit global error event when an task throws an error", async () => {
97
- const globalTaskOnErrorHandler = jest.fn();
98
-
99
- const errorTask = defineTask({
100
- id: "error.task",
101
- run: async () => {
102
- throw new Error("Test Error");
103
- },
104
- });
105
-
106
- const onErrorHandler = defineTask({
107
- id: "on.error.handler",
108
- on: globalEvents.tasks.onError,
109
- run: globalTaskOnErrorHandler,
110
- });
111
-
112
- const app = defineResource({
113
- id: "app",
114
- register: [errorTask, onErrorHandler],
115
- dependencies: { errorTask },
116
- async init(_, { errorTask }) {
117
- try {
118
- await errorTask();
119
- } catch (error) {
120
- // Error is expected
121
- }
122
- },
123
- });
124
-
125
- await run(app);
126
-
127
- expect(globalTaskOnErrorHandler).toHaveBeenCalled();
128
- });
129
-
130
- it("should ensure global event listeners get their middleware called", async () => {
131
- const middlewareExecutions: string[] = [];
132
- const eventHandlerExecutions: string[] = [];
133
-
134
- // Custom event to emit
135
- const customEvent = defineEvent<{ message: string }>({
136
- id: "test.customEvent",
137
- meta: {
138
- title: "Test Event",
139
- description: "Test event for middleware verification",
140
- tags: ["test"],
141
- },
142
- });
143
-
144
- // Middleware that logs execution
145
- const testMiddleware = defineMiddleware({
146
- id: "test.middleware",
147
- run: async ({ next, task }) => {
148
- const taskId = task?.definition?.id || "unknown";
149
- middlewareExecutions.push(`middleware-before:${String(taskId)}`);
150
- const result = await next(task?.input);
151
- middlewareExecutions.push(`middleware-after:${String(taskId)}`);
152
- return result;
153
- },
154
- });
155
-
156
- // Global event listener task with middleware
157
- const globalEventHandler = defineTask({
158
- id: "global.event.handler",
159
- on: "*", // Global listener
160
- middleware: [testMiddleware],
161
- run: async (event) => {
162
- if (event && event.id) {
163
- eventHandlerExecutions.push(`global-handler:${event.id.toString()}`);
164
- // Verify the event has meta included
165
- expect(event.meta).toBeDefined();
166
- if (event.id === customEvent.id) {
167
- expect(event.meta.title).toBe("Test Event");
168
- expect(event.meta.tags).toContain("test");
169
- expect(event.data.message).toBe("Hello from custom event");
170
- }
171
- }
172
- },
173
- });
174
-
175
- // Specific event listener task with middleware
176
- const specificEventHandler = defineTask({
177
- id: "specific.event.handler",
178
- on: customEvent,
179
- middleware: [testMiddleware],
180
- run: async (event) => {
181
- if (event && event.id) {
182
- eventHandlerExecutions.push(
183
- `specific-handler:${event.id.toString()}`
184
- );
185
- expect(event.meta.title).toBe("Test Event");
186
- expect(event.data.message).toBe("Hello from custom event");
187
- }
188
- },
189
- });
190
-
191
- // Task that emits the custom event
192
- const eventEmitter = defineTask({
193
- id: "event.emitter",
194
- dependencies: { customEvent },
195
- run: async (_, { customEvent }) => {
196
- await customEvent({ message: "Hello from custom event" });
197
- return "Event emitted";
198
- },
199
- });
200
-
201
- const app = defineResource({
202
- id: "app",
203
- register: [
204
- customEvent,
205
- testMiddleware,
206
- globalEventHandler,
207
- specificEventHandler,
208
- eventEmitter,
209
- ],
210
- dependencies: { eventEmitter },
211
- async init(_, { eventEmitter }) {
212
- await eventEmitter();
213
- },
214
- });
215
-
216
- await run(app);
217
-
218
- // Verify middleware was called for global event listener
219
- expect(middlewareExecutions).toContain(
220
- "middleware-before:global.event.handler"
221
- );
222
- expect(middlewareExecutions).toContain(
223
- "middleware-after:global.event.handler"
224
- );
225
-
226
- // Verify middleware was called for specific event listener
227
- expect(middlewareExecutions).toContain(
228
- "middleware-before:specific.event.handler"
229
- );
230
- expect(middlewareExecutions).toContain(
231
- "middleware-after:specific.event.handler"
232
- );
233
-
234
- // Verify event handlers were executed
235
- expect(eventHandlerExecutions).toContain("global-handler:test.customEvent");
236
- expect(eventHandlerExecutions).toContain(
237
- "specific-handler:test.customEvent"
238
- );
239
-
240
- // Verify global listeners also handle other events (like global events themselves)
241
- expect(
242
- eventHandlerExecutions.some(
243
- (exec) =>
244
- exec.includes("global-handler:") && exec.includes("beforeInit")
245
- )
246
- ).toBe(true);
247
- });
248
-
249
- it("should support stopPropagation in event listeners", async () => {
250
- const eventHandlerExecutions: string[] = [];
251
-
252
- const testEvent = defineEvent<{ value: number }>({
253
- id: "test.propagationEvent",
254
- meta: {
255
- title: "Propagation Test Event",
256
- tags: ["propagation", "test"],
257
- },
258
- });
259
-
260
- // High priority listener that stops propagation
261
- const highPriorityHandler = defineTask({
262
- id: "high.priority.handler",
263
- on: testEvent,
264
- listenerOrder: -100, // Higher priority (runs first)
265
- run: async (event) => {
266
- eventHandlerExecutions.push("high-priority-executed");
267
-
268
- if (event && event.data && event.data.value > 10) {
269
- expect(event.isPropagationStopped()).toBe(false);
270
- event.stopPropagation();
271
- expect(event.isPropagationStopped()).toBe(true);
272
- eventHandlerExecutions.push("propagation-stopped");
273
- }
274
- },
275
- });
276
-
277
- // Low priority listener that should be skipped when propagation is stopped
278
- const lowPriorityHandler = defineTask({
279
- id: "low.priority.handler",
280
- on: testEvent,
281
- listenerOrder: 100, // Lower priority (runs later)
282
- run: async () => {
283
- // This handler will only execute when propagation is NOT stopped
284
- eventHandlerExecutions.push("low-priority-executed");
285
- },
286
- });
287
-
288
- const eventEmitter = defineTask({
289
- id: "propagation.emitter",
290
- dependencies: { testEvent },
291
- run: async (value: number, { testEvent }) => {
292
- await testEvent({ value });
293
- },
294
- });
295
-
296
- const app = defineResource({
297
- id: "app",
298
- register: [
299
- testEvent,
300
- highPriorityHandler,
301
- lowPriorityHandler,
302
- eventEmitter,
303
- ],
304
- dependencies: { eventEmitter },
305
- async init(_, { eventEmitter }) {
306
- // Test with value <= 10 (no propagation stop)
307
- await eventEmitter(5);
308
-
309
- // Test with value > 10 (propagation stop)
310
- await eventEmitter(15);
311
- },
312
- });
313
-
314
- await run(app);
315
-
316
- // Verify both handlers executed for first event (value=5)
317
- expect(
318
- eventHandlerExecutions.filter((e) => e === "high-priority-executed")
319
- ).toHaveLength(2);
320
- expect(
321
- eventHandlerExecutions.filter((e) => e === "low-priority-executed")
322
- ).toHaveLength(1);
323
-
324
- // Verify propagation was stopped for second event (value=15)
325
- expect(
326
- eventHandlerExecutions.filter((e) => e === "propagation-stopped")
327
- ).toHaveLength(1);
328
-
329
- // The low priority handler should NOT have run for the second event due to stopped propagation
330
- // So it should only appear once (from the first event where propagation was not stopped)
331
- });
332
-
333
- it("should support global event listeners with both global and local middleware", async () => {
334
- const middlewareExecutions: string[] = [];
335
- const eventHandlerExecutions: string[] = [];
336
-
337
- // Custom event to emit
338
- const testEvent = defineEvent<{ message: string }>({
339
- id: "test.globalMiddlewareEvent",
340
- meta: {
341
- title: "Global Middleware Test Event",
342
- description: "Test event for global middleware verification",
343
- tags: ["test", "global"],
344
- },
345
- });
346
-
347
- // Global middleware that should be applied everywhere
348
- const globalMiddleware = defineMiddleware({
349
- id: "global.middleware",
350
- run: async ({ next, task }) => {
351
- const taskId = task?.definition?.id || "unknown";
352
- middlewareExecutions.push(`global-middleware-before:${String(taskId)}`);
353
- const result = await next(task?.input);
354
- middlewareExecutions.push(`global-middleware-after:${String(taskId)}`);
355
- return result;
356
- },
357
- }).everywhere(); // Make it global
358
-
359
- // Local middleware specific to certain tasks
360
- const localMiddleware = defineMiddleware({
361
- id: "local.middleware",
362
- run: async ({ next, task }) => {
363
- const taskId = task?.definition?.id || "unknown";
364
- middlewareExecutions.push(`local-middleware-before:${String(taskId)}`);
365
- const result = await next(task?.input);
366
- middlewareExecutions.push(`local-middleware-after:${String(taskId)}`);
367
- return result;
368
- },
369
- });
370
-
371
- // Global event listener task with local middleware
372
- const globalEventHandler = defineTask({
373
- id: "global.middleware.event.handler",
374
- on: "*", // Global listener
375
- middleware: [localMiddleware], // Local middleware
376
- run: async (event) => {
377
- if (event && event.id) {
378
- eventHandlerExecutions.push(`global-handler:${event.id.toString()}`);
379
- if (event.id === testEvent.id) {
380
- expect(event.meta.title).toBe("Global Middleware Test Event");
381
- expect(event.data.message).toBe("Hello from middleware test");
382
- }
383
- }
384
- },
385
- });
386
-
387
- // Specific event listener task with local middleware
388
- const specificEventHandler = defineTask({
389
- id: "specific.middleware.event.handler",
390
- on: testEvent,
391
- middleware: [localMiddleware], // Local middleware
392
- run: async (event) => {
393
- if (event && event.id) {
394
- eventHandlerExecutions.push(
395
- `specific-handler:${event.id.toString()}`
396
- );
397
- expect(event.meta.title).toBe("Global Middleware Test Event");
398
- expect(event.data.message).toBe("Hello from middleware test");
399
- }
400
- },
401
- });
402
-
403
- // Task that emits the test event
404
- const eventEmitter = defineTask({
405
- id: "middleware.event.emitter",
406
- dependencies: { testEvent },
407
- middleware: [localMiddleware], // This task also has local middleware
408
- run: async (_, { testEvent }) => {
409
- await testEvent({ message: "Hello from middleware test" });
410
- return "Event emitted";
411
- },
412
- });
413
-
414
- const app = defineResource({
415
- id: "app",
416
- register: [
417
- globalMiddleware, // Register global middleware
418
- localMiddleware,
419
- testEvent,
420
- globalEventHandler,
421
- specificEventHandler,
422
- eventEmitter,
423
- ],
424
- dependencies: { eventEmitter },
425
- async init(_, { eventEmitter }) {
426
- await eventEmitter();
427
- },
428
- });
429
-
430
- await run(app);
431
-
432
- // Verify global middleware was called for global event listener
433
- expect(middlewareExecutions).toContain(
434
- "global-middleware-before:global.middleware.event.handler"
435
- );
436
- expect(middlewareExecutions).toContain(
437
- "global-middleware-after:global.middleware.event.handler"
438
- );
439
-
440
- // Verify local middleware was called for global event listener
441
- expect(middlewareExecutions).toContain(
442
- "local-middleware-before:global.middleware.event.handler"
443
- );
444
- expect(middlewareExecutions).toContain(
445
- "local-middleware-after:global.middleware.event.handler"
446
- );
447
-
448
- // Verify global middleware was called for specific event listener
449
- expect(middlewareExecutions).toContain(
450
- "global-middleware-before:specific.middleware.event.handler"
451
- );
452
- expect(middlewareExecutions).toContain(
453
- "global-middleware-after:specific.middleware.event.handler"
454
- );
455
-
456
- // Verify local middleware was called for specific event listener
457
- expect(middlewareExecutions).toContain(
458
- "local-middleware-before:specific.middleware.event.handler"
459
- );
460
- expect(middlewareExecutions).toContain(
461
- "local-middleware-after:specific.middleware.event.handler"
462
- );
463
-
464
- // Verify global middleware was called for event emitter task
465
- expect(middlewareExecutions).toContain(
466
- "global-middleware-before:middleware.event.emitter"
467
- );
468
- expect(middlewareExecutions).toContain(
469
- "global-middleware-after:middleware.event.emitter"
470
- );
471
-
472
- // Verify local middleware was called for event emitter task
473
- expect(middlewareExecutions).toContain(
474
- "local-middleware-before:middleware.event.emitter"
475
- );
476
- expect(middlewareExecutions).toContain(
477
- "local-middleware-after:middleware.event.emitter"
478
- );
479
-
480
- // Verify event handlers were executed
481
- expect(eventHandlerExecutions).toContain(
482
- "global-handler:test.globalMiddlewareEvent"
483
- );
484
- expect(eventHandlerExecutions).toContain(
485
- "specific-handler:test.globalMiddlewareEvent"
486
- );
487
-
488
- // Verify global listeners also handle other events (like global events themselves)
489
- expect(
490
- eventHandlerExecutions.some(
491
- (exec) =>
492
- exec.includes("global-handler:") && exec.includes("beforeInit")
493
- )
494
- ).toBe(true);
495
- });
496
-
497
- it("should support defineEvent without any config", async () => {
498
- const eventHandlerExecutions: string[] = [];
499
-
500
- // Define event with minimal config (just id)
501
- const simpleEvent = defineEvent();
502
-
503
- // Event listener for the simple event
504
- const simpleEventHandler = defineTask({
505
- id: "simple.event.handler",
506
- on: simpleEvent,
507
- run: async (event) => {
508
- if (event && event.id) {
509
- eventHandlerExecutions.push(`simple-handler:${event.id.toString()}`);
510
- // Event should exist but meta might be minimal/undefined
511
- expect(event.id).toBe(simpleEvent.id);
512
- }
513
- },
514
- });
515
-
516
- // Task that emits the simple event
517
- const eventEmitter = defineTask({
518
- id: "simple.event.emitter",
519
- dependencies: { simpleEvent },
520
- run: async (_, { simpleEvent }) => {
521
- await simpleEvent();
522
- return "Simple event emitted";
523
- },
524
- });
525
-
526
- const app = defineResource({
527
- id: "app",
528
- register: [simpleEvent, simpleEventHandler, eventEmitter],
529
- dependencies: { eventEmitter },
530
- async init(_, { eventEmitter }) {
531
- await eventEmitter();
532
- },
533
- });
534
-
535
- await run(app);
536
-
537
- // Verify the simple event handler was executed
538
- expect(eventHandlerExecutions).toContain(
539
- "simple-handler:Symbol(src.__tests__.globalEvents.test.event)"
540
- );
541
- });
542
- });