@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,139 +0,0 @@
1
- import {
2
- task,
3
- resource,
4
- override,
5
- run,
6
- createTestResource,
7
- globals,
8
- event,
9
- } from "..";
10
-
11
- describe("createTestResource", () => {
12
- it("runs tasks within the full ecosystem and returns results", async () => {
13
- const double = task({ id: "t.double", run: async (x: number) => x * 2 });
14
-
15
- const app = resource({
16
- id: "app.root",
17
- register: [double],
18
- });
19
-
20
- const harness = createTestResource(app);
21
- const { value: t, dispose } = await run(harness);
22
-
23
- const result = await t.runTask(double, 21);
24
- expect(result).toBe(42);
25
-
26
- await dispose();
27
- });
28
-
29
- it("supports overrides for integration tests", async () => {
30
- const db = resource({ id: "db", init: async () => ({ kind: "real" }) });
31
- const getDbKind = task({
32
- id: "t.db.kind",
33
- dependencies: { db },
34
- run: async (_, { db }) => db.kind,
35
- });
36
- const app = resource({ id: "app", register: [db, getDbKind] });
37
-
38
- const mockDb = override(db, { init: async () => ({ kind: "mock" }) });
39
-
40
- const harness = createTestResource(app, { overrides: [mockDb] });
41
- const { value: t, dispose } = await run(harness);
42
-
43
- const kind = await t.runTask(getDbKind, undefined);
44
- expect(kind).toBe("mock");
45
-
46
- await dispose();
47
- });
48
-
49
- it("allows accessing resource values and subscribing to events", async () => {
50
- const eventsSeen: Array<any> = [];
51
-
52
- const say = task({ id: "t.say", run: async (m: string) => m });
53
-
54
- const listener = task({
55
- id: "tests.log-listener",
56
- on: globals.events.tasks.beforeRun,
57
- run: async (e: any) => eventsSeen.push(e.data),
58
- });
59
-
60
- const app = resource({ id: "app2", register: [say, listener] });
61
-
62
- const harness = createTestResource(app);
63
- const { value: t, dispose } = await run(harness);
64
-
65
- // Subscribe via facade as well (no-op if using global path instead)
66
- // t.on(globals.events.log, (e) => eventsSeen.push(e.data));
67
-
68
- await t.runTask(say, "hello");
69
-
70
- // We can also query resource values (will often be undefined for pure tasks)
71
- expect(t.getResource("app2")).toBeUndefined();
72
-
73
- // At least one event was recorded via the listener
74
- expect(Array.isArray(eventsSeen)).toBe(true);
75
-
76
- await dispose();
77
- });
78
-
79
- it("supports multiple harness instances without id collisions", async () => {
80
- const add1 = task({ id: "t.add1", run: async (n: number) => n + 1 });
81
- const app = resource({ id: "app.multi", register: [add1] });
82
-
83
- const h1 = createTestResource(app);
84
- const h2 = createTestResource(app);
85
-
86
- const [r1, r2] = await Promise.all([run(h1), run(h2)]);
87
-
88
- const v1 = await r1.value.runTask(add1, 1);
89
- const v2 = await r2.value.runTask(add1, 2);
90
- expect(v1).toBe(2);
91
- expect(v2).toBe(3);
92
-
93
- await Promise.all([r1.dispose(), r2.dispose()]);
94
- });
95
-
96
- it("runTask is typesafe in tests", async () => {
97
- const sum = task<{ a: number; b: number }, Promise<number>>({
98
- id: "t.sum",
99
- run: async (i) => i.a + i.b,
100
- });
101
-
102
- const upper = task<{ v: string }, Promise<string>>({
103
- id: "t.upper",
104
- run: async (i) => i.v.toUpperCase(),
105
- });
106
-
107
- const usesUpper = task<
108
- { n: number },
109
- Promise<number>,
110
- { upper: typeof upper }
111
- >({
112
- id: "t.usesUpper",
113
- dependencies: { upper },
114
- run: async (i, d) => Number(await d.upper({ v: String(i.n) })),
115
- });
116
-
117
- const app = resource({
118
- id: "app.types",
119
- register: [sum, upper, usesUpper],
120
- });
121
- const { value: t, dispose } = await run(createTestResource(app));
122
-
123
- const ok1: number | undefined = await t.runTask(sum, { a: 1, b: 2 });
124
- // Type-only checks (do not execute)
125
- const typeOnly = () => {
126
- // @ts-expect-error bad input
127
- t.runTask(sum, { a: 1 });
128
- // @ts-expect-error missing input
129
- t.runTask(sum as any);
130
- };
131
- void typeOnly;
132
-
133
- const ok2: number | undefined = await t.runTask(usesUpper, {
134
- n: 3,
135
- } as const);
136
-
137
- await dispose();
138
- });
139
- });
@@ -1,341 +0,0 @@
1
- import {
2
- defineTask,
3
- defineResource,
4
- defineEvent,
5
- defineMiddleware,
6
- } from "../define";
7
- import { run } from "../run";
8
- import { Errors } from "..";
9
-
10
- const {
11
- RuntimeError,
12
- DuplicateRegistrationError,
13
- DependencyNotFoundError,
14
- UnknownItemTypeError,
15
- CircularDependenciesError,
16
- EventNotFoundError,
17
- MiddlewareAlreadyGlobalError,
18
- LockedError,
19
- StoreAlreadyInitializedError,
20
- ValidationError,
21
- } = Errors;
22
-
23
- describe("Errors", () => {
24
- it("should throw duplicateRegistration error", async () => {
25
- const task1 = defineTask({ id: "test.task", run: async () => {} });
26
- const task2 = defineTask({ id: "test.task", run: async () => {} });
27
-
28
- const app = defineResource({
29
- id: "app",
30
- register: [task1, task2],
31
- });
32
-
33
- await expect(run(app)).rejects.toThrow(
34
- new DuplicateRegistrationError("Task", "test.task").message
35
- );
36
- });
37
-
38
- it("should throw unknown item type error at task level", async () => {
39
- const task = defineTask({
40
- id: "test.task",
41
- dependencies: { nonExistentDep: {} as any },
42
- run: async () => {},
43
- });
44
-
45
- const app = defineResource({
46
- id: "app",
47
- register: [task],
48
- dependencies: { task },
49
- async init(_, { task }) {
50
- await task();
51
- },
52
- });
53
-
54
- await expect(run(app)).rejects.toThrow(
55
- new UnknownItemTypeError({}).message
56
- );
57
- });
58
-
59
- it("should throw unknown item type error at resource level", async () => {
60
- const app = defineResource({
61
- id: "app",
62
- register: [
63
- {
64
- id: "nonExistent",
65
- } as any,
66
- ],
67
- async init(_, {}) {},
68
- });
69
-
70
- await expect(run(app)).rejects.toThrow(
71
- new UnknownItemTypeError({}).message
72
- );
73
- });
74
-
75
- it("should throw circularDependencies error", async () => {
76
- const task1: any = defineTask({
77
- id: "task1",
78
- dependencies: (): any => ({ task2 }),
79
- run: async () => {},
80
- });
81
-
82
- const task2: any = defineTask({
83
- id: "task2",
84
- dependencies: { task1 },
85
- run: async () => {},
86
- });
87
-
88
- const app = defineResource({
89
- id: "app",
90
- register: [task1, task2],
91
- });
92
-
93
- await expect(run(app)).rejects.toThrow(/Circular dependencies detected/);
94
- });
95
-
96
- it("should throw eventNotFound error", async () => {
97
- const nonExistentEvent = { id: "non.existent.event" } as any;
98
-
99
- const task = defineTask({
100
- id: "test.task",
101
- on: nonExistentEvent,
102
- run: async () => {},
103
- });
104
-
105
- const app = defineResource({
106
- id: "app",
107
- register: [task],
108
- });
109
-
110
- await expect(run(app)).rejects.toThrow(
111
- new EventNotFoundError("non.existent.event").message
112
- );
113
- });
114
-
115
- it("should throw taskError", async () => {
116
- const errorTask = defineTask({
117
- id: "error.task",
118
- run: async () => {
119
- throw new Error("Task error");
120
- },
121
- });
122
-
123
- const app = defineResource({
124
- id: "app",
125
- register: [errorTask],
126
- dependencies: { errorTask },
127
- async init(_, { errorTask }) {
128
- await errorTask();
129
- },
130
- });
131
-
132
- await expect(run(app)).rejects.toThrow(/Task error/);
133
- });
134
-
135
- it("should throw resourceError", async () => {
136
- const errorResource = defineResource({
137
- id: "error.resource",
138
- init: async () => {
139
- if (true === true) {
140
- throw new Error("Resource error");
141
- }
142
- },
143
- });
144
-
145
- const app = defineResource({
146
- id: "app",
147
- register: [errorResource],
148
- });
149
-
150
- await expect(run(app)).rejects.toThrow(/Resource error/);
151
- });
152
-
153
- it("should throw an ambigous one", async () => {
154
- const res1 = defineResource({
155
- id: "res1",
156
- });
157
-
158
- const ev1 = defineEvent({
159
- id: "res1",
160
- });
161
-
162
- const app = defineResource({
163
- id: "app",
164
- register: [res1, ev1],
165
- });
166
-
167
- await expect(run(app)).rejects.toThrow(
168
- new DuplicateRegistrationError("Resource", "res1").message
169
- );
170
- });
171
-
172
- it("Should throw duplicate error for middlewares with the same id", async () => {
173
- const middleware1 = defineMiddleware({
174
- id: "middlewarex",
175
- run: async () => {},
176
- });
177
-
178
- const middleware2 = defineMiddleware({
179
- id: "middlewarex",
180
- run: async () => {},
181
- });
182
-
183
- const app = defineResource({
184
- id: "app",
185
- register: [middleware1, middleware2],
186
- });
187
-
188
- await expect(run(app)).rejects.toThrow(
189
- new DuplicateRegistrationError("Middleware", "middlewarex").message
190
- );
191
- });
192
-
193
- it("Should throw duplicate error for events with the same id", async () => {
194
- const ev1 = defineEvent({
195
- id: "ev1",
196
- });
197
- const ev2 = defineEvent({
198
- id: "ev1",
199
- });
200
-
201
- const app = defineResource({
202
- id: "app",
203
- register: [ev1, ev2],
204
- });
205
-
206
- await expect(run(app)).rejects.toThrow(
207
- new DuplicateRegistrationError("Event", "ev1").message
208
- );
209
- });
210
-
211
- it("should throw an error when a task depends on a non-registered task", async () => {
212
- const offTheGrid = defineTask({
213
- id: "test.off.the.grid",
214
- dependencies: { nonExistentTask: { id: "non" } as any },
215
- run: async () => {},
216
- });
217
-
218
- const task = defineTask({
219
- id: "test.task",
220
- dependencies: { offTheGrid },
221
- run: async (_, deps) => {
222
- throw "Should not even be here";
223
- },
224
- });
225
-
226
- const app = defineResource({
227
- id: "app",
228
- register: [task],
229
- dependencies: { task },
230
- async init(_, { task }) {
231
- await task();
232
- },
233
- });
234
-
235
- await expect(run(app)).rejects.toThrow(
236
- new DependencyNotFoundError("Task test.off.the.grid").message
237
- );
238
- });
239
-
240
- it("should throw when a task depends on a non-registered resource", async () => {
241
- const offTheGrid = defineResource({
242
- id: "test.off.the.grid",
243
- init: async () => {},
244
- });
245
-
246
- const task = defineTask({
247
- id: "test.task",
248
- dependencies: { offTheGrid },
249
- run: async () => {
250
- throw "Should not even be here";
251
- },
252
- });
253
-
254
- const app = defineResource({
255
- id: "app",
256
- register: [task],
257
- dependencies: { task },
258
- async init(_, { task }) {
259
- await task();
260
- },
261
- });
262
-
263
- await expect(run(app)).rejects.toThrow(
264
- new DependencyNotFoundError("Resource test.off.the.grid").message
265
- );
266
- });
267
-
268
- it("should throw error, when a double global() is used on a middleware", async () => {
269
- const first = defineMiddleware({
270
- id: "x",
271
- run: async () => {},
272
- }).everywhere();
273
- expect(() => first.everywhere()).toThrow(
274
- new MiddlewareAlreadyGlobalError("x").message
275
- );
276
- });
277
-
278
- describe("Error Classes", () => {
279
- it("should have correct error names and inheritance", () => {
280
- // Test base RuntimeError
281
- const baseError = new RuntimeError("test");
282
- expect(baseError.name).toBe("RuntimeError");
283
- expect(baseError).toBeInstanceOf(Error);
284
- expect(baseError).toBeInstanceOf(RuntimeError);
285
-
286
- // Test DuplicateRegistrationError
287
- const dupError = new DuplicateRegistrationError("Task", "test");
288
- expect(dupError.name).toBe("DuplicateRegistrationError");
289
- expect(dupError).toBeInstanceOf(Error);
290
- expect(dupError).toBeInstanceOf(RuntimeError);
291
- expect(dupError).toBeInstanceOf(DuplicateRegistrationError);
292
-
293
- // Test DependencyNotFoundError
294
- const depError = new DependencyNotFoundError("test");
295
- expect(depError.name).toBe("DependencyNotFoundError");
296
- expect(depError).toBeInstanceOf(RuntimeError);
297
-
298
- // Test UnknownItemTypeError
299
- const unknownError = new UnknownItemTypeError("test");
300
- expect(unknownError.name).toBe("UnknownItemTypeError");
301
- expect(unknownError).toBeInstanceOf(RuntimeError);
302
-
303
- // Test CircularDependenciesError
304
- const circularError = new CircularDependenciesError(["a", "b"]);
305
- expect(circularError.name).toBe("CircularDependenciesError");
306
- expect(circularError).toBeInstanceOf(RuntimeError);
307
-
308
- // Test EventNotFoundError
309
- const eventError = new EventNotFoundError("test");
310
- expect(eventError.name).toBe("EventNotFoundError");
311
- expect(eventError).toBeInstanceOf(RuntimeError);
312
-
313
- // Test MiddlewareAlreadyGlobalError
314
- const middlewareError = new MiddlewareAlreadyGlobalError("test");
315
- expect(middlewareError.name).toBe("MiddlewareAlreadyGlobalError");
316
- expect(middlewareError).toBeInstanceOf(RuntimeError);
317
-
318
- // Test LockedError
319
- const lockedError = new LockedError("test");
320
- expect(lockedError.name).toBe("LockedError");
321
- expect(lockedError).toBeInstanceOf(RuntimeError);
322
-
323
- // Test StoreAlreadyInitializedError
324
- const storeError = new StoreAlreadyInitializedError();
325
- expect(storeError.name).toBe("StoreAlreadyInitializedError");
326
- expect(storeError).toBeInstanceOf(RuntimeError);
327
-
328
- // Test ValidationError with Error object
329
- const validationErrorWithError = new ValidationError("Task input", "test-task", new Error("Required field missing"));
330
- expect(validationErrorWithError.name).toBe("ValidationError");
331
- expect(validationErrorWithError.message).toBe("Task input validation failed for test-task: Required field missing");
332
- expect(validationErrorWithError).toBeInstanceOf(RuntimeError);
333
-
334
- // Test ValidationError with string
335
- const validationErrorWithString = new ValidationError("Resource config", Symbol("test-resource"), "Invalid configuration");
336
- expect(validationErrorWithString.name).toBe("ValidationError");
337
- expect(validationErrorWithString.message).toBe("Resource config validation failed for Symbol(test-resource): Invalid configuration");
338
- expect(validationErrorWithString).toBeInstanceOf(RuntimeError);
339
- });
340
- });
341
- });