@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,43 +0,0 @@
1
- import { DependencyNotFoundError, DuplicateRegistrationError } from "../errors";
2
- import {
3
- TaskStoreElementType,
4
- MiddlewareStoreElementType,
5
- ResourceStoreElementType,
6
- EventStoreElementType,
7
- } from "./StoreTypes";
8
-
9
- export class StoreValidator {
10
- constructor(
11
- private tasks: Map<string | symbol, TaskStoreElementType>,
12
- private resources: Map<string | symbol, ResourceStoreElementType>,
13
- private events: Map<string | symbol, EventStoreElementType>,
14
- private middlewares: Map<string | symbol, MiddlewareStoreElementType>
15
- ) {}
16
-
17
- checkIfIDExists(id: string | symbol): void | never {
18
- if (this.tasks.has(id)) {
19
- throw new DuplicateRegistrationError("Task", id);
20
- }
21
- if (this.resources.has(id)) {
22
- throw new DuplicateRegistrationError("Resource", id);
23
- }
24
- if (this.events.has(id)) {
25
- throw new DuplicateRegistrationError("Event", id);
26
- }
27
- if (this.middlewares.has(id)) {
28
- throw new DuplicateRegistrationError("Middleware", id);
29
- }
30
- }
31
-
32
- runSanityChecks() {
33
- for (const task of this.tasks.values()) {
34
- task.task.middleware.forEach((middleware) => {
35
- if (!this.middlewares.has(middleware.id)) {
36
- throw new DependencyNotFoundError(
37
- `Middleware ${middleware.id.toString()} in Task ${task.task.id.toString()}`
38
- );
39
- }
40
- });
41
- }
42
- }
43
- }
@@ -1,203 +0,0 @@
1
- import { DependencyMapType, DependencyValuesType, ITask } from "../defs";
2
- import { EventManager } from "./EventManager";
3
- import { globalEvents } from "../globals/globalEvents";
4
- import { Store } from "./Store";
5
- import { MiddlewareStoreElementType } from "./StoreTypes";
6
- import { Logger } from "./Logger";
7
- import { ValidationError } from "../errors";
8
-
9
- export class TaskRunner {
10
- protected readonly runnerStore = new Map<
11
- string | symbol,
12
- (input: any) => Promise<any>
13
- >();
14
-
15
- constructor(
16
- protected readonly store: Store,
17
- protected readonly eventManager: EventManager,
18
- protected readonly logger: Logger
19
- ) {}
20
-
21
- /**
22
- * Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
23
- * This function can throw only if any of the event listeners or run function throws
24
- * @param task the task to be run
25
- * @param input the input to be passed to the task
26
- */
27
- public async run<
28
- TInput,
29
- TOutput extends Promise<any>,
30
- TDeps extends DependencyMapType
31
- >(
32
- task: ITask<TInput, TOutput, TDeps>,
33
- input: TInput
34
- ): Promise<TOutput | undefined> {
35
- let runner = this.runnerStore.get(task.id);
36
- if (!runner) {
37
- runner = this.createRunnerWithMiddleware<TInput, TOutput, TDeps>(task);
38
-
39
- this.runnerStore.set(task.id, runner);
40
- }
41
-
42
- const isGlobalEventListener = task.on === "*";
43
-
44
- if (!isGlobalEventListener) {
45
- await this.eventManager.emit(task.events.beforeRun, { input }, task.id);
46
- }
47
-
48
- if (
49
- !isGlobalEventListener &&
50
- task.on !== globalEvents.tasks.beforeRun &&
51
- task.on !== globalEvents.tasks.afterRun
52
- ) {
53
- await this.eventManager.emit(
54
- globalEvents.tasks.beforeRun,
55
- {
56
- task,
57
- input,
58
- },
59
- task.id
60
- );
61
- }
62
-
63
- let error;
64
- try {
65
- // craft the next function starting from the first next function
66
- const result = {
67
- output: await runner(input),
68
- };
69
- const setOutput = (newOutput: any) => {
70
- result.output = newOutput;
71
- };
72
-
73
- // If it's a global event listener, we stop emitting so we don't get into an infinite loop.
74
- if (!isGlobalEventListener) {
75
- await this.eventManager.emit(
76
- task.events.afterRun,
77
- {
78
- input,
79
- get output() {
80
- return result.output;
81
- },
82
- setOutput,
83
- },
84
- task.id
85
- );
86
- }
87
-
88
- if (
89
- !isGlobalEventListener &&
90
- task.on !== globalEvents.tasks.beforeRun &&
91
- task.on !== globalEvents.tasks.afterRun
92
- ) {
93
- // If it's a lifecycle listener we prevent from emitting further events.
94
- await this.eventManager.emit(
95
- globalEvents.tasks.afterRun,
96
- {
97
- task,
98
- input,
99
- get output() {
100
- return result.output;
101
- },
102
- setOutput,
103
- },
104
- task.id
105
- );
106
- }
107
-
108
- return result.output;
109
- } catch (e) {
110
- let isSuppressed = false;
111
- function suppress() {
112
- isSuppressed = true;
113
- }
114
-
115
- error = e;
116
-
117
- // If you want to rewthrow the error, this should be done inside the onError event.
118
- await this.eventManager.emit(
119
- task.events.onError,
120
- { error, suppress },
121
- task.id
122
- );
123
- await this.eventManager.emit(
124
- globalEvents.tasks.onError,
125
- {
126
- task,
127
- error,
128
- suppress,
129
- },
130
- task.id
131
- );
132
-
133
- if (!isSuppressed) throw e;
134
- }
135
- }
136
-
137
- /**
138
- * Creates the function with the chain of middleware.
139
- * @param task
140
- * @param input
141
- * @param taskDependencies
142
- * @returns
143
- */
144
- protected createRunnerWithMiddleware<
145
- TInput,
146
- TOutput extends Promise<any>,
147
- TDeps extends DependencyMapType
148
- >(task: ITask<TInput, TOutput, TDeps>) {
149
- const storeTask = this.store.tasks.get(task.id);
150
-
151
- // this is the final next()
152
- let next = async (input: any) => {
153
- // Validate input with schema if provided
154
- if (task.inputSchema) {
155
- try {
156
- input = task.inputSchema.parse(input);
157
- } catch (error) {
158
- throw new ValidationError("Task input", task.id, error instanceof Error ? error : new Error(String(error)));
159
- }
160
- }
161
-
162
- return task.run.call(null, input, storeTask?.computedDependencies as any);
163
- };
164
-
165
- const existingMiddlewares = task.middleware;
166
- const createdMiddlewares = [
167
- ...this.store.getEverywhereMiddlewareForTasks(
168
- existingMiddlewares.map((x) => x.id)
169
- ),
170
- ...existingMiddlewares,
171
- ];
172
-
173
- if (createdMiddlewares.length === 0) {
174
- return next;
175
- }
176
-
177
- // we need to run the middleware in reverse order
178
- // so we can chain the next function
179
- for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
180
- const middleware = createdMiddlewares[i];
181
- const storeMiddleware = this.store.middlewares.get(
182
- middleware.id
183
- ) as MiddlewareStoreElementType; // we know it exists because at this stage all sanity checks have been done.
184
-
185
- const nextFunction = next;
186
- next = async (input) => {
187
- return storeMiddleware.middleware.run(
188
- {
189
- task: {
190
- definition: task as any,
191
- input,
192
- },
193
- next: nextFunction,
194
- },
195
- storeMiddleware.computedDependencies,
196
- middleware.config
197
- );
198
- };
199
- }
200
-
201
- return next;
202
- }
203
- }
@@ -1,8 +0,0 @@
1
- export * from "./DependencyProcessor";
2
- export * from "./EventManager";
3
- export * from "./Logger";
4
- export * from "./Store";
5
- export * from "./TaskRunner";
6
- export * from "./ResourceInitializer";
7
- export * from "./Semaphore";
8
- export * from "./Queue";
package/src/run.ts DELETED
@@ -1,116 +0,0 @@
1
- import { TaskRunner } from "./models/TaskRunner";
2
- import {
3
- DependencyMapType,
4
- ITaskDefinition,
5
- IResourceDefinition,
6
- IEventDefinition,
7
- IMiddlewareDefinition,
8
- DependencyValuesType,
9
- IResource,
10
- } from "./defs";
11
- import { DependencyProcessor } from "./models/DependencyProcessor";
12
- import { EventManager } from "./models/EventManager";
13
- import { globalEvents } from "./globals/globalEvents";
14
- import { Store } from "./models/Store";
15
- import { findCircularDependencies } from "./tools/findCircularDependencies";
16
- import { CircularDependenciesError } from "./errors";
17
- import { globalResources } from "./globals/globalResources";
18
- import { Logger } from "./models/Logger";
19
-
20
- export type ResourcesStoreElementType<
21
- C = any,
22
- V extends Promise<any> = any,
23
- D extends DependencyMapType = {}
24
- > = {
25
- resource: IResourceDefinition<C, V, D>;
26
- computedDependencies?: DependencyValuesType<D>;
27
- config: C;
28
- value: V;
29
- };
30
-
31
- export type TasksStoreElementType<
32
- Input = any,
33
- Output extends Promise<any> = any,
34
- D extends DependencyMapType = {}
35
- > = {
36
- task: ITaskDefinition<Input, Output, D>;
37
- computedDependencies?: DependencyValuesType<D>;
38
- };
39
-
40
- export type MiddlewareStoreElementType = {
41
- middleware: IMiddlewareDefinition;
42
- };
43
-
44
- export type EventStoreElementType = {
45
- event: IEventDefinition;
46
- };
47
-
48
- export type RunnerState = {
49
- tasks: Record<string, TasksStoreElementType>;
50
- resources: Record<string, ResourcesStoreElementType>;
51
- events: Record<string, EventStoreElementType>;
52
- middleware: Record<string, MiddlewareStoreElementType>;
53
- };
54
-
55
- export async function run<C, V>(
56
- resource: IResource<C, V extends Promise<any> ? V : Promise<any>>,
57
- config?: C
58
- ): Promise<{
59
- value: V extends Promise<infer U> ? U : V;
60
- dispose: () => Promise<void>;
61
- }> {
62
- const eventManager = new EventManager();
63
-
64
- // ensure for logger, that it can be used only after: computeAllDependencies() has executed
65
- const logger = new Logger(eventManager);
66
-
67
- const store = new Store(eventManager, logger);
68
- const taskRunner = new TaskRunner(store, eventManager, logger);
69
- const processor = new DependencyProcessor(
70
- store,
71
- eventManager,
72
- taskRunner,
73
- logger
74
- );
75
-
76
- // In the registration phase we register deeply all the resources, tasks, middleware and events
77
- store.initializeStore(resource, config);
78
- store.storeGenericItem(globalResources.logger.with(logger));
79
- store.storeGenericItem(globalResources.taskRunner.with(taskRunner));
80
-
81
- // We verify that there isn't any circular dependencies before we begin computing the dependencies
82
- const dependentNodes = store.getDependentNodes();
83
- const circularDependencies = findCircularDependencies(dependentNodes);
84
- if (circularDependencies.cycles.length > 0) {
85
- throw new CircularDependenciesError(circularDependencies.cycles);
86
- }
87
-
88
- // the overrides that were registered now will override the other registered resources
89
- await store.processOverrides();
90
-
91
- // a form of hooking, we create the events for all tasks and store them so they can be referenced
92
- await store.storeEventsForAllTasks();
93
- await processor.attachListeners();
94
- await processor.computeAllDependencies();
95
-
96
- // After this stage, logger print policy could have been set.
97
- await logger.debug("All elements have been initalized..");
98
-
99
- // Now we can safely compute dependencies without being afraid of an infinite loop.
100
- // The hooking part is done here.
101
- await eventManager.emit(globalEvents.beforeInit, null, resource.id);
102
-
103
- // Now we can initialise the root resource
104
- await processor.initializeRoot();
105
-
106
- await eventManager.emit(globalEvents.afterInit, null, resource.id);
107
- await logger.debug("System initialized and operational.");
108
-
109
- // disallow manipulation or attaching more
110
- store.lock();
111
-
112
- return {
113
- value: store.root.value,
114
- dispose: () => store.dispose(),
115
- };
116
- }
package/src/testing.ts DELETED
@@ -1,66 +0,0 @@
1
- import { defineResource } from "./define";
2
- import { globalResources } from "./globals/globalResources";
3
- import {
4
- IResource,
5
- IResourceWithConfig,
6
- IMiddleware,
7
- ITask,
8
- RegisterableItems,
9
- IEvent,
10
- IEventEmission,
11
- DependencyMapType,
12
- DependencyValuesType,
13
- } from "./defs";
14
- import { EventManager, Logger, Store, TaskRunner } from "./models";
15
-
16
- let testResourceCounter = 0;
17
-
18
- /**
19
- * Helper to create a minimal test harness resource that wraps a root app (or any registerable)
20
- * and exposes convenient testing utilities while running the full ecosystem
21
- * (registration, overrides, middleware, events) without modifying the core API.
22
- */
23
- export function createTestResource(
24
- root: RegisterableItems,
25
- options?: {
26
- overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
27
- }
28
- ): IResource<void, Promise<ReturnType<typeof buildTestFacade>>> {
29
- return defineResource({
30
- id: `tests.createTestResource.${++testResourceCounter}`,
31
- register: [root],
32
- overrides: options?.overrides || [],
33
- dependencies: {
34
- taskRunner: globalResources.taskRunner,
35
- store: globalResources.store,
36
- logger: globalResources.logger,
37
- eventManager: globalResources.eventManager,
38
- },
39
- async init(_, deps) {
40
- return buildTestFacade(deps);
41
- },
42
- });
43
- }
44
-
45
- function buildTestFacade(deps: {
46
- taskRunner: TaskRunner;
47
- store: Store;
48
- logger: Logger;
49
- eventManager: EventManager;
50
- }) {
51
- return {
52
- // Run a task within the fully initialized ecosystem
53
- runTask: <I, O extends Promise<any>, D extends DependencyMapType>(
54
- task: ITask<I, O, D>,
55
- input: I
56
- ): Promise<Awaited<O> | undefined> =>
57
- deps.taskRunner.run(task, input) as any,
58
- // Access a resource value by id (string or symbol)
59
- getResource: (id: string | symbol) => deps.store.resources.get(id)?.value,
60
- // Expose internals when needed in tests (not recommended for app usage)
61
- taskRunner: deps.taskRunner,
62
- store: deps.store,
63
- logger: deps.logger,
64
- eventManager: deps.eventManager,
65
- };
66
- }
@@ -1,69 +0,0 @@
1
- /**
2
- * A node that has dependencies.
3
- */
4
- export interface IDependentNode {
5
- id: string;
6
- dependencies: Record<string, IDependentNode>;
7
- }
8
-
9
- interface FindCircularDependenciesResult {
10
- cycles: string[];
11
- missingDependencies: Array<{ nodeId: string; dependencyId: string }>;
12
- }
13
-
14
- export function findCircularDependencies(
15
- nodes: IDependentNode[]
16
- ): FindCircularDependenciesResult {
17
- const result: FindCircularDependenciesResult = {
18
- cycles: [],
19
- missingDependencies: [],
20
- };
21
- const visited: Set<string> = new Set();
22
- const stack: Set<string> = new Set();
23
- const path: string[] = [];
24
-
25
- function dfs(node: IDependentNode): void {
26
- if (stack.has(node.id)) {
27
- const cycleStartIndex = path.indexOf(node.id);
28
- const cycle = path.slice(cycleStartIndex).concat(node.id).join(" -> ");
29
- result.cycles.push(cycle);
30
- return;
31
- }
32
-
33
- if (visited.has(node.id)) return;
34
-
35
- visited.add(node.id);
36
- stack.add(node.id);
37
- path.push(node.id);
38
-
39
- if (node.dependencies && typeof node.dependencies === "object") {
40
- for (const [depKey, dependentNode] of Object.entries(node.dependencies)) {
41
- if (!dependentNode) {
42
- result.missingDependencies.push({
43
- nodeId: node.id,
44
- dependencyId: depKey,
45
- });
46
- continue;
47
- }
48
- dfs(dependentNode);
49
- }
50
- } else {
51
- result.missingDependencies.push({
52
- nodeId: node.id,
53
- dependencyId: "unknown",
54
- });
55
- }
56
-
57
- stack.delete(node.id);
58
- path.pop();
59
- }
60
-
61
- for (const node of nodes) {
62
- if (!visited.has(node.id)) {
63
- dfs(node);
64
- }
65
- }
66
-
67
- result.cycles = Array.from(new Set(result.cycles)); // Remove duplicate cycles
68
- return result;
69
- }
@@ -1,96 +0,0 @@
1
- export function getCallerFile(): string {
2
- const originalFunc = Error.prepareStackTrace;
3
-
4
- try {
5
- const err = new Error();
6
- let callerfile;
7
- let currentfile;
8
-
9
- // Safeguard prepareStackTrace
10
- Error.prepareStackTrace = (err, stack) => stack;
11
-
12
- const stack = err.stack as unknown as NodeJS.CallSite[];
13
-
14
- // Don't know how to test this.
15
- // if (stack.length < 3) {
16
- // // We need at least 3 frames: current function, its caller, and one above
17
- // return undefined;
18
- // }
19
-
20
- // Remove the first frame (getCallerFile itself)
21
- stack.shift();
22
-
23
- // Remove the second frame (the direct caller of getCallerFile)
24
- currentfile = stack.shift()?.getFileName();
25
-
26
- // The third frame (the caller above the immediate one)
27
- callerfile = stack.shift()?.getFileName();
28
-
29
- return callerfile as string; // Return the file name of the caller above
30
- } finally {
31
- Error.prepareStackTrace = originalFunc;
32
- }
33
- }
34
-
35
- /**
36
- * Gets a file path, looks at all the parts between current path and 'src' and generates a unique symbol based on that.
37
- * If there is no 'src' to be found, it will rely on using the last 4 parts of the path.
38
- * This is useful for generating unique IDs for tasks, resources, etc.
39
- * @param filePath
40
- * @returns
41
- */
42
- export function generateCallerIdFromFile(
43
- filePath: string,
44
- suffix: string = "",
45
- fallbackParts: number = 4
46
- ): symbol {
47
- // Normalize paths for consistency across platforms
48
- const normalizedPath = filePath.replace(/\\/g, "/");
49
- const cwdNormalized = process.cwd().replace(/\\/g, "/");
50
-
51
- const parts = normalizedPath.split("/");
52
- const nodeModulesIndex = parts.lastIndexOf("node_modules");
53
-
54
- let relevantParts: string[];
55
-
56
- if (nodeModulesIndex !== -1) {
57
- // If inside node_modules, generate id relative to the package path
58
- relevantParts = parts.slice(nodeModulesIndex + 1);
59
- } else if (
60
- normalizedPath === cwdNormalized ||
61
- normalizedPath.startsWith(cwdNormalized + "/")
62
- ) {
63
- // Prefer generating id relative to the workspace root (process.cwd())
64
- const relativeToCwd = normalizedPath
65
- .slice(cwdNormalized.length)
66
- .replace(/^\//, "");
67
- relevantParts = relativeToCwd.length > 0 ? relativeToCwd.split("/") : [""];
68
- } else {
69
- // Fallback: use the last N parts if path is outside cwd and not in node_modules
70
- relevantParts = parts.slice(-fallbackParts);
71
- }
72
-
73
- if (relevantParts.length > 0) {
74
- const lastPartIndex = relevantParts.length - 1;
75
- const lastPart = relevantParts[lastPartIndex];
76
- const dotIndex = lastPart.lastIndexOf(".");
77
- if (dotIndex !== -1 && dotIndex > 0) {
78
- const extension = lastPart.substring(dotIndex + 1);
79
- const knownExtensions = ["ts", "js", "tsx", "jsx", "json", "node"];
80
- if (knownExtensions.includes(extension)) {
81
- relevantParts[lastPartIndex] = lastPart.substring(0, dotIndex);
82
- }
83
- }
84
- }
85
-
86
- const id = relevantParts.join(".");
87
- const lastPart =
88
- relevantParts.length > 0 ? relevantParts[relevantParts.length - 1] : "";
89
-
90
- let finalId = id;
91
- if (suffix && !lastPart.includes(suffix)) {
92
- finalId += "." + suffix;
93
- }
94
-
95
- return Symbol(finalId);
96
- }