@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,257 +0,0 @@
1
- import {
2
- DependencyMapType,
3
- DependencyValuesType,
4
- ITask,
5
- IResource,
6
- IEventDefinition,
7
- IEvent,
8
- IEventEmission,
9
- } from "../defs";
10
- import { Store } from "./Store";
11
- import { ResourceStoreElementType, TaskStoreElementType } from "./StoreTypes";
12
- import * as utils from "../define";
13
- import { EventManager } from "./EventManager";
14
- import { ResourceInitializer } from "./ResourceInitializer";
15
- import { TaskRunner } from "./TaskRunner";
16
- import {
17
- DependencyNotFoundError,
18
- EventNotFoundError,
19
- UnknownItemTypeError,
20
- } from "../errors";
21
- import { Logger } from "./Logger";
22
-
23
- /**
24
- * This class is responsible of setting up dependencies with their respective computedValues.
25
- * Note that all elements must have been previously registered otherwise errors will be thrown
26
- * when trying to depend on something not in the store.
27
- */
28
- export class DependencyProcessor {
29
- protected readonly resourceInitializer: ResourceInitializer;
30
-
31
- constructor(
32
- protected readonly store: Store,
33
- protected readonly eventManager: EventManager,
34
- protected readonly taskRunner: TaskRunner,
35
- protected readonly logger: Logger
36
- ) {
37
- this.resourceInitializer = new ResourceInitializer(
38
- store,
39
- eventManager,
40
- logger
41
- );
42
- }
43
-
44
- /**
45
- * This function is going to go through all the resources, tasks and middleware to compute their required dependencies.
46
- */
47
- async computeAllDependencies() {
48
- for (const middleware of this.store.middlewares.values()) {
49
- const deps = middleware.middleware.dependencies as DependencyMapType;
50
- middleware.computedDependencies = await this.extractDependencies(
51
- deps,
52
- middleware.middleware.id
53
- );
54
- }
55
-
56
- for (const task of this.store.tasks.values()) {
57
- await this.computeTaskDependencies(task);
58
- }
59
-
60
- for (const resource of this.store.resources.values()) {
61
- await this.processResourceDependencies(resource);
62
- }
63
-
64
- // leftovers that were registered but not depended upon, except root
65
- // they should still be initialized as they might extend other
66
- await this.initializeUninitializedResources();
67
- }
68
-
69
- private async computeTaskDependencies(
70
- task: TaskStoreElementType<any, any, any>
71
- ) {
72
- const deps = task.task.dependencies as DependencyMapType;
73
- task.computedDependencies = await this.extractDependencies(
74
- deps,
75
- task.task.id
76
- );
77
- }
78
-
79
- // Most likely these are resources that no-one has dependencies towards
80
- // We need to ensure they work too!
81
- public async initializeUninitializedResources() {
82
- for (const resource of this.store.resources.values()) {
83
- if (
84
- resource.isInitialized === false &&
85
- // The root is the last one to be initialized and is done in a separate process.
86
- resource.resource.id !== this.store.root.resource.id
87
- ) {
88
- await this.processResourceDependencies(resource);
89
- const { value, context } =
90
- await this.resourceInitializer.initializeResource(
91
- resource.resource,
92
- resource.config,
93
- resource.computedDependencies as DependencyValuesType<{}>
94
- );
95
- resource.context = context;
96
- resource.value = value;
97
- }
98
- }
99
- }
100
-
101
- /**
102
- * Processes dependencies and hooks
103
- * @param resource
104
- */
105
- protected async processResourceDependencies(
106
- resource: ResourceStoreElementType<any, any, {}>
107
- ) {
108
- const deps = resource.resource.dependencies as DependencyMapType;
109
- resource.computedDependencies = await this.extractDependencies(
110
- deps,
111
- resource.resource.id
112
- );
113
- }
114
-
115
- public async initializeRoot() {
116
- const storeResource = this.store.root;
117
-
118
- const { value, context } =
119
- await this.resourceInitializer.initializeResource(
120
- storeResource.resource,
121
- storeResource.config,
122
- // They are already computed
123
- storeResource.computedDependencies as DependencyValuesType<{}>
124
- );
125
-
126
- storeResource.context = context;
127
- storeResource.value = value;
128
- storeResource.isInitialized = true;
129
- }
130
-
131
- /**
132
- * Processes all hooks, should run before emission of any event.
133
- */
134
- public attachListeners() {
135
- for (const task of this.store.tasks.values()) {
136
- if (task.task.on) {
137
- let eventDefinition = task.task.on;
138
-
139
- const handler = async (receivedEvent: IEventEmission<any>) => {
140
- if (receivedEvent.source === task.task.id) {
141
- // we don't want to trigger the same task that emitted the event
142
- // process.exit(0);
143
- return;
144
- }
145
-
146
- return this.taskRunner.run(task.task, receivedEvent);
147
- };
148
-
149
- if (eventDefinition === "*") {
150
- this.eventManager.addGlobalListener(handler, {
151
- order: task.task.listenerOrder || 0,
152
- });
153
- } else {
154
- if (this.store.events.get(eventDefinition.id) === undefined) {
155
- throw new EventNotFoundError(eventDefinition.id);
156
- }
157
- this.eventManager.addListener(eventDefinition, handler, {
158
- order: task.task.listenerOrder || 0,
159
- });
160
- }
161
- }
162
- }
163
- }
164
-
165
- async extractDependencies<T extends DependencyMapType>(
166
- map: T,
167
- source: string | symbol
168
- ): Promise<DependencyValuesType<T>> {
169
- const object = {} as DependencyValuesType<T>;
170
-
171
- for (const key in map) {
172
- object[key] = await this.extractDependency(map[key], source);
173
- }
174
-
175
- return object;
176
- }
177
-
178
- async extractDependency(object: any, source: string | symbol) {
179
- if (utils.isResource(object)) {
180
- return this.extractResourceDependency(object);
181
- } else if (utils.isTask(object)) {
182
- return this.extractTaskDependency(object);
183
- } else if (utils.isEvent(object)) {
184
- return this.extractEventDependency(object, source);
185
- } else {
186
- throw new UnknownItemTypeError(object);
187
- }
188
- }
189
-
190
- /**
191
- * Converts the event into a running functions with real inputs
192
- * @param object
193
- * @returns
194
- */
195
- extractEventDependency(object: IEvent<any>, source: string | symbol) {
196
- return async (input: any) => {
197
- return this.eventManager.emit(object, input, source);
198
- };
199
- }
200
-
201
- async extractTaskDependency(object: ITask<any, any, {}>) {
202
- const storeTask = this.store.tasks.get(object.id);
203
- if (storeTask === undefined) {
204
- throw new DependencyNotFoundError(`Task ${object.id.toString()}`);
205
- }
206
-
207
- if (!storeTask.isInitialized) {
208
- storeTask.isInitialized = true;
209
-
210
- // it's sanitised
211
- const dependencies = object.dependencies as DependencyMapType;
212
-
213
- storeTask.computedDependencies = await this.extractDependencies(
214
- dependencies,
215
- storeTask.task.id
216
- );
217
- }
218
-
219
- return (input: any) => {
220
- return this.taskRunner.run(storeTask.task, input);
221
- };
222
- }
223
-
224
- async extractResourceDependency(object: IResource<any, any, any>) {
225
- // check if it exists in the store with the value
226
- const storeResource = this.store.resources.get(object.id);
227
- if (storeResource === undefined) {
228
- throw new DependencyNotFoundError(`Resource ${object.id.toString()}`);
229
- }
230
-
231
- const { resource, config } = storeResource;
232
- if (storeResource.isInitialized) {
233
- return storeResource.value;
234
- } else {
235
- // we need to initialize the resource
236
- storeResource.isInitialized = true;
237
-
238
- // check if it has an initialisation function that provides the value
239
- if (resource.init) {
240
- const { value, context } =
241
- await this.resourceInitializer.initializeResource(
242
- resource,
243
- config,
244
- await this.extractDependencies(
245
- resource.dependencies || {},
246
- resource.id
247
- )
248
- );
249
-
250
- storeResource.context = context;
251
- storeResource.value = value;
252
- }
253
- }
254
-
255
- return storeResource.value;
256
- }
257
- }
@@ -1,210 +0,0 @@
1
- import {
2
- EventHandlerType,
3
- IEvent,
4
- IEventDefinition,
5
- IEventEmission,
6
- } from "../defs";
7
- import { LockedError, ValidationError } from "../errors";
8
- import { Logger } from "./Logger";
9
-
10
- const HandlerOptionsDefaults = { order: 0 };
11
-
12
- interface IListenerStorage {
13
- order: number;
14
- filter?: (event: IEventEmission<any>) => boolean;
15
- handler: EventHandlerType;
16
- }
17
-
18
- export interface IEventHandlerOptions<T = any> {
19
- order?: number;
20
- filter?: (event: IEventEmission<T>) => boolean;
21
- /**
22
- * Represents the listener ID. Use this to avoid a listener calling himself.
23
- */
24
- id?: string;
25
- }
26
-
27
- export class EventManager {
28
- private listeners: Map<string | symbol, IListenerStorage[]> = new Map();
29
- private globalListeners: IListenerStorage[] = [];
30
- private cachedMergedListeners: Map<string | symbol, IListenerStorage[]> =
31
- new Map();
32
- private globalListenersCacheValid = true;
33
- #isLocked = false;
34
-
35
- get isLocked() {
36
- return this.#isLocked;
37
- }
38
-
39
- lock() {
40
- this.#isLocked = true;
41
- }
42
-
43
- checkLock() {
44
- if (this.#isLocked) {
45
- throw new LockedError("EventManager");
46
- }
47
- }
48
-
49
- private mergeSortedListeners(
50
- a: IListenerStorage[],
51
- b: IListenerStorage[]
52
- ): IListenerStorage[] {
53
- const result: IListenerStorage[] = [];
54
- let i = 0,
55
- j = 0;
56
- while (i < a.length && j < b.length) {
57
- if (a[i].order <= b[j].order) {
58
- result.push(a[i++]);
59
- } else {
60
- result.push(b[j++]);
61
- }
62
- }
63
- while (i < a.length) result.push(a[i++]);
64
- while (j < b.length) result.push(b[j++]);
65
- return result;
66
- }
67
-
68
- private getCachedMergedListeners(
69
- eventId: string | symbol
70
- ): IListenerStorage[] {
71
- if (!this.globalListenersCacheValid) {
72
- this.cachedMergedListeners.clear();
73
- this.globalListenersCacheValid = true;
74
- }
75
-
76
- let cached = this.cachedMergedListeners.get(eventId);
77
- if (!cached) {
78
- const eventListeners = this.listeners.get(eventId) || [];
79
- if (eventListeners.length === 0 && this.globalListeners.length === 0) {
80
- cached = [];
81
- } else if (eventListeners.length === 0) {
82
- cached = this.globalListeners;
83
- } else if (this.globalListeners.length === 0) {
84
- cached = eventListeners;
85
- } else {
86
- cached = this.mergeSortedListeners(
87
- eventListeners,
88
- this.globalListeners
89
- );
90
- }
91
- this.cachedMergedListeners.set(eventId, cached);
92
- }
93
- return cached;
94
- }
95
-
96
- private invalidateCache(eventId?: string | symbol): void {
97
- if (eventId) {
98
- this.cachedMergedListeners.delete(eventId);
99
- } else {
100
- this.globalListenersCacheValid = false;
101
- }
102
- }
103
-
104
- async emit<TInput>(
105
- eventDefinition: IEvent<TInput>,
106
- data: TInput,
107
- source: string | symbol
108
- ): Promise<void> {
109
- // Validate payload with schema if provided
110
- if (eventDefinition.payloadSchema) {
111
- try {
112
- data = eventDefinition.payloadSchema.parse(data);
113
- } catch (error) {
114
- throw new ValidationError("Event payload", eventDefinition.id, error instanceof Error ? error : new Error(String(error)));
115
- }
116
- }
117
-
118
- const allListeners = this.getCachedMergedListeners(eventDefinition.id);
119
-
120
- if (allListeners.length === 0) {
121
- return;
122
- }
123
-
124
- let propagationStopped = false;
125
-
126
- const event: IEventEmission = {
127
- id: eventDefinition.id,
128
- data,
129
- timestamp: new Date(),
130
- source,
131
- meta: eventDefinition.meta || {},
132
- stopPropagation: () => {
133
- propagationStopped = true;
134
- },
135
- isPropagationStopped: () => propagationStopped,
136
- };
137
-
138
- for (const listener of allListeners) {
139
- if (propagationStopped) {
140
- break;
141
- }
142
-
143
- if (!listener.filter || listener.filter(event)) {
144
- await listener.handler(event);
145
- }
146
- }
147
- }
148
-
149
- private insertListener(
150
- listeners: IListenerStorage[],
151
- newListener: IListenerStorage
152
- ): void {
153
- let low = 0;
154
- let high = listeners.length;
155
- while (low < high) {
156
- const mid = (low + high) >>> 1;
157
- if (listeners[mid].order < newListener.order) {
158
- low = mid + 1;
159
- } else {
160
- high = mid;
161
- }
162
- }
163
- listeners.splice(low, 0, newListener);
164
- }
165
-
166
- addListener<T>(
167
- event: IEvent<T> | Array<IEvent<T>>,
168
- handler: EventHandlerType<T>,
169
- options: IEventHandlerOptions<T> = HandlerOptionsDefaults
170
- ): void {
171
- this.checkLock();
172
- const newListener: IListenerStorage = {
173
- handler,
174
- order: options.order || 0,
175
- filter: options.filter,
176
- };
177
-
178
- if (Array.isArray(event)) {
179
- event.forEach((id) => this.addListener(id, handler, options));
180
- } else {
181
- const eventId = event.id;
182
- const listeners = this.listeners.get(eventId);
183
- if (listeners) {
184
- this.insertListener(listeners, newListener);
185
- } else {
186
- this.listeners.set(eventId, [newListener]);
187
- }
188
- this.invalidateCache(eventId);
189
- }
190
- }
191
-
192
- addGlobalListener(
193
- handler: EventHandlerType,
194
- options: IEventHandlerOptions = HandlerOptionsDefaults
195
- ): void {
196
- this.checkLock();
197
- const newListener: IListenerStorage = {
198
- handler,
199
- order: options.order || 0,
200
- filter: options.filter,
201
- };
202
- this.insertListener(this.globalListeners, newListener);
203
- this.invalidateCache();
204
- }
205
-
206
- hasListeners<T>(eventDefinition: IEvent<T>): boolean {
207
- const eventListeners = this.listeners.get(eventDefinition.id) || [];
208
- return eventListeners.length > 0 || this.globalListeners.length > 0;
209
- }
210
- }