@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,244 +0,0 @@
1
- import { defineTask, defineResource } from "../define";
2
- import { run } from "../run";
3
-
4
- describe("setOutput functionality", () => {
5
- it("should allow afterRun event listeners to modify task output", async () => {
6
- const originalTask = defineTask({
7
- id: "original.task",
8
- run: async (input: string) => `Hello, ${input}!`,
9
- });
10
-
11
- const transformListener = defineTask({
12
- id: "transform.listener",
13
- on: originalTask.events.afterRun,
14
- run: async (event) => {
15
- const transformedOutput = event.data.output.toUpperCase();
16
- event.data.setOutput(transformedOutput);
17
- },
18
- });
19
-
20
- const app = defineResource({
21
- id: "app",
22
- register: [originalTask, transformListener],
23
- dependencies: { originalTask },
24
- async init(_, { originalTask }) {
25
- const result = await originalTask("World");
26
- expect(result).toBe("HELLO, WORLD!");
27
- return result;
28
- },
29
- });
30
-
31
- await run(app);
32
- });
33
-
34
- it("should preserve original output if setOutput is not called", async () => {
35
- const originalTask = defineTask({
36
- id: "original.task",
37
- run: async (input: string) => `Hello, ${input}!`,
38
- });
39
-
40
- const observerListener = defineTask({
41
- id: "observer.listener",
42
- on: originalTask.events.afterRun,
43
- run: async (event) => {
44
- // Just observe, don't modify
45
- expect(event.data.output).toBe("Hello, World!");
46
- },
47
- });
48
-
49
- const app = defineResource({
50
- id: "app",
51
- register: [originalTask, observerListener],
52
- dependencies: { originalTask },
53
- async init(_, { originalTask }) {
54
- const result = await originalTask("World");
55
- expect(result).toBe("Hello, World!");
56
- return result;
57
- },
58
- });
59
-
60
- await run(app);
61
- });
62
-
63
- it("should handle multiple afterRun listeners with setOutput (last one wins)", async () => {
64
- const originalTask = defineTask({
65
- id: "original.task",
66
- run: async (input: number) => input * 2,
67
- });
68
-
69
- const firstTransform = defineTask({
70
- id: "first.transform",
71
- on: originalTask.events.afterRun,
72
- listenerOrder: 1,
73
- run: async (event) => {
74
- event.data.setOutput(event.data.output + 10);
75
- },
76
- });
77
-
78
- const secondTransform = defineTask({
79
- id: "second.transform",
80
- on: originalTask.events.afterRun,
81
- listenerOrder: 2,
82
- run: async (event) => {
83
- event.data.setOutput(event.data.output * 3);
84
- },
85
- });
86
-
87
- const app = defineResource({
88
- id: "app",
89
- register: [originalTask, firstTransform, secondTransform],
90
- dependencies: { originalTask },
91
- async init(_, { originalTask }) {
92
- const result = await originalTask(5);
93
- // Original: 5 * 2 = 10
94
- // First transform: 10 + 10 = 20
95
- // Second transform: 20 * 3 = 60
96
- expect(result).toBe(60);
97
- return result;
98
- },
99
- });
100
-
101
- await run(app);
102
- });
103
-
104
- it("should work with external library scenario", async () => {
105
- // Simulate an external library task
106
- const externalLibraryTask = defineTask({
107
- id: "external.library.task",
108
- run: async (data: { name: string; age: number }) => {
109
- return {
110
- id: Math.random(),
111
- name: data.name,
112
- age: data.age,
113
- timestamp: Date.now(),
114
- };
115
- },
116
- });
117
-
118
- // Create a transformer for the external task
119
- const resultTransformer = defineTask({
120
- id: "result.transformer",
121
- on: externalLibraryTask.events.afterRun,
122
- run: async (event) => {
123
- const result = event.data.output;
124
- // Add some computed fields
125
- const enrichedResult = {
126
- ...result,
127
- displayName: `${result.name} (${result.age} years old)`,
128
- isAdult: result.age >= 18,
129
- };
130
- event.data.setOutput(enrichedResult);
131
- },
132
- });
133
-
134
- const app = defineResource({
135
- id: "app",
136
- register: [externalLibraryTask, resultTransformer],
137
- dependencies: { externalLibraryTask },
138
- async init(_, { externalLibraryTask }) {
139
- const result = await externalLibraryTask({ name: "Alice", age: 25 });
140
-
141
- expect(result).toMatchObject({
142
- name: "Alice",
143
- age: 25,
144
- displayName: "Alice (25 years old)",
145
- isAdult: true,
146
- });
147
- expect(result.id).toBeDefined();
148
- expect(result.timestamp).toBeDefined();
149
-
150
- return result;
151
- },
152
- });
153
-
154
- await run(app);
155
- });
156
-
157
- it("should handle type safety with setOutput", async () => {
158
- interface TaskOutput {
159
- message: string;
160
- count: number;
161
- }
162
-
163
- const typedTask = defineTask({
164
- id: "typed.task",
165
- run: async (input: string): Promise<TaskOutput> => ({
166
- message: `Hello, ${input}!`,
167
- count: input.length,
168
- }),
169
- });
170
-
171
- const typedTransformer = defineTask({
172
- id: "typed.transformer",
173
- on: typedTask.events.afterRun,
174
- run: async (event) => {
175
- const result = event.data.output;
176
- const newResult: TaskOutput = {
177
- message: result.message.toUpperCase(),
178
- count: result.count * 2,
179
- };
180
- event.data.setOutput(newResult);
181
- },
182
- });
183
-
184
- const app = defineResource({
185
- id: "app",
186
- register: [typedTask, typedTransformer],
187
- dependencies: { typedTask },
188
- async init(_, { typedTask }) {
189
- const result = await typedTask("World");
190
- expect(result).toEqual({
191
- message: "HELLO, WORLD!",
192
- count: 10, // "World".length * 2
193
- });
194
- return result;
195
- },
196
- });
197
-
198
- await run(app);
199
- });
200
-
201
- it("should work with middleware and setOutput together", async () => {
202
- const { defineMiddleware } = await import("../define");
203
-
204
- const testMiddleware = defineMiddleware({
205
- id: "test.middleware",
206
- run: async ({ next, task }) => {
207
- const result = await next(task?.input);
208
- return `[middleware: ${result}]`;
209
- },
210
- });
211
-
212
- const originalTask = defineTask({
213
- id: "original.task",
214
- middleware: [testMiddleware],
215
- run: async (input: string) => `Hello, ${input}!`,
216
- });
217
-
218
- const outputTransformer = defineTask({
219
- id: "output.transformer",
220
- on: originalTask.events.afterRun,
221
- run: async (event) => {
222
- // The output here already includes middleware processing
223
- const transformed = event.data.output.replace(
224
- "middleware:",
225
- "processed:"
226
- );
227
- event.data.setOutput(transformed);
228
- },
229
- });
230
-
231
- const app = defineResource({
232
- id: "app",
233
- register: [testMiddleware, originalTask, outputTransformer],
234
- dependencies: { originalTask },
235
- async init(_, { originalTask }) {
236
- const result = await originalTask("World");
237
- expect(result).toBe("[processed: Hello, World!]");
238
- return result;
239
- },
240
- });
241
-
242
- await run(app);
243
- });
244
- });
@@ -1,396 +0,0 @@
1
- import {
2
- defineTag,
3
- defineTask,
4
- defineResource,
5
- defineEvent,
6
- defineMiddleware,
7
- } from "../define";
8
- import { run } from "../run";
9
-
10
- describe("Configurable Tags", () => {
11
- describe("Tag Definition", () => {
12
- it("should create a tag with string id", () => {
13
- const performanceTag = defineTag<{ alertAboveMs: number }>({
14
- id: "performance.track",
15
- });
16
-
17
- expect(performanceTag.id).toBe("performance.track");
18
- expect(typeof performanceTag.with).toBe("function");
19
- expect(typeof performanceTag.extract).toBe("function");
20
- });
21
-
22
- it("should create a tag with symbol id", () => {
23
- const symbolId = Symbol("test.tag");
24
- const testTag = defineTag<{ value: string }>({ id: symbolId });
25
-
26
- expect(testTag.id).toBe(symbolId);
27
- });
28
-
29
- it("should create a tag without configuration", () => {
30
- const simpleTag = defineTag({ id: "simple.tag" });
31
-
32
- expect(simpleTag.id).toBe("simple.tag");
33
- expect(typeof simpleTag.with).toBe("function");
34
- expect(typeof simpleTag.extract).toBe("function");
35
- });
36
- });
37
-
38
- describe("Tag Configuration with .with()", () => {
39
- it("should create a configured tag instance", () => {
40
- const performanceTag = defineTag<{ alertAboveMs: number }>({
41
- id: "performance.track",
42
- });
43
-
44
- const configuredTag = performanceTag.with({ alertAboveMs: 200 });
45
-
46
- expect(configuredTag.id).toBe("performance.track");
47
- expect(configuredTag.config).toEqual({ alertAboveMs: 200 });
48
- expect(configuredTag.tag).toBe(performanceTag);
49
- });
50
-
51
- it("should allow multiple configurations of the same tag", () => {
52
- const cacheTag = defineTag<{ ttl: number }>({ id: "cache.config" });
53
-
54
- const shortCache = cacheTag.with({ ttl: 300 });
55
- const longCache = cacheTag.with({ ttl: 3600 });
56
-
57
- expect(shortCache.config.ttl).toBe(300);
58
- expect(longCache.config.ttl).toBe(3600);
59
- expect(shortCache.tag).toBe(cacheTag);
60
- expect(longCache.tag).toBe(cacheTag);
61
- });
62
- });
63
-
64
- describe("Tag Extraction with .extract()", () => {
65
- it("should extract configured tag from tags array", () => {
66
- const performanceTag = defineTag<{ alertAboveMs: number }>({
67
- id: "performance.track",
68
- });
69
-
70
- const tags = [
71
- "simple-string-tag",
72
- performanceTag.with({ alertAboveMs: 200 }),
73
- "another-string",
74
- ];
75
-
76
- const extracted = performanceTag.extract(tags);
77
-
78
- expect(extracted).not.toBeNull();
79
- expect(extracted?.id).toBe("performance.track");
80
- expect(extracted?.config).toEqual({ alertAboveMs: 200 });
81
- });
82
-
83
- it("should extract unconfigured tag from tags array", () => {
84
- const simpleTag = defineTag({ id: "simple.tag" });
85
-
86
- const tags = ["string-tag", simpleTag, "another-string"];
87
-
88
- const extracted = simpleTag.extract(tags);
89
-
90
- expect(extracted).not.toBeNull();
91
- expect(extracted?.id).toBe("simple.tag");
92
- expect(extracted?.config).toBeUndefined();
93
- });
94
-
95
- it("should return null if tag not found", () => {
96
- const performanceTag = defineTag<{ alertAboveMs: number }>({
97
- id: "performance.track",
98
- });
99
-
100
- const tags = ["string-tag", "another-string"];
101
-
102
- const extracted = performanceTag.extract(tags);
103
-
104
- expect(extracted).toBeNull();
105
- });
106
-
107
- it("should ignore string tags during extraction", () => {
108
- const performanceTag = defineTag<{ alertAboveMs: number }>({
109
- id: "performance.track",
110
- });
111
-
112
- const tags = [
113
- "performance.track", // This is a string, not the tag
114
- performanceTag.with({ alertAboveMs: 100 }),
115
- ];
116
-
117
- const extracted = performanceTag.extract(tags);
118
-
119
- expect(extracted).not.toBeNull();
120
- expect(extracted?.config).toEqual({ alertAboveMs: 100 });
121
- });
122
-
123
- it("should handle symbol ids correctly", () => {
124
- const symbolId = Symbol("test.tag");
125
- const testTag = defineTag<{ data: string }>({ id: symbolId });
126
-
127
- const tags = [testTag.with({ data: "test" })];
128
-
129
- const extracted = testTag.extract(tags);
130
-
131
- expect(extracted).not.toBeNull();
132
- expect(extracted?.id).toBe(symbolId);
133
- expect(extracted?.config).toEqual({ data: "test" });
134
- });
135
-
136
- it("should extract configured tag from a taggable object (task.definition)", () => {
137
- const performanceTag = defineTag<{ alertAboveMs: number }>({
138
- id: "performance.track",
139
- });
140
-
141
- const task = defineTask({
142
- id: "task.with.tags",
143
- meta: {
144
- tags: [performanceTag.with({ alertAboveMs: 123 })],
145
- },
146
- run: async () => "ok",
147
- });
148
-
149
- const extracted = performanceTag.extract(task);
150
- expect(extracted).not.toBeNull();
151
- expect(extracted?.config).toEqual({ alertAboveMs: 123 });
152
- });
153
-
154
- it("should return null when taggable has no tags", () => {
155
- const t = defineTag({ id: "x" });
156
- const task = defineTask({ id: "no.tags", run: async () => "ok" });
157
- expect(t.extract(task)).toBeNull();
158
- });
159
-
160
- it("should work with a simple taggable carrying meta.tags directly", () => {
161
- const t = defineTag<{ p: number }>({ id: "pp" });
162
- const taggable = { meta: { tags: [t.with({ p: 9 })] } } as any;
163
- const extracted = t.extract(taggable);
164
- expect(extracted?.config).toEqual({ p: 9 });
165
- });
166
- });
167
-
168
- describe("Integration with Tasks", () => {
169
- it("should work with task metadata", () => {
170
- const performanceTag = defineTag<{ alertAboveMs: number }>({
171
- id: "performance.track",
172
- });
173
-
174
- const testTask = defineTask({
175
- id: "test.task",
176
- meta: {
177
- tags: [
178
- "api",
179
- performanceTag.with({ alertAboveMs: 200 }),
180
- "important",
181
- ],
182
- },
183
- run: async () => {
184
- return "success";
185
- },
186
- });
187
-
188
- expect(testTask.meta?.tags).toHaveLength(3);
189
- expect(testTask.meta?.tags?.[0]).toBe("api");
190
- expect(testTask.meta?.tags?.[2]).toBe("important");
191
-
192
- const extracted = performanceTag.extract(testTask.meta?.tags || []);
193
- expect(extracted).not.toBeNull();
194
- expect(extracted?.config).toEqual({ alertAboveMs: 200 });
195
- });
196
-
197
- it("should work with middleware checking tags", async () => {
198
- const performanceTag = defineTag<{ alertAboveMs: number }>({
199
- id: "performance.track",
200
- });
201
-
202
- const middlewareExecutions: Array<{ taskId: string; config: any }> = [];
203
-
204
- const performanceMiddleware = defineMiddleware({
205
- id: "performance.middleware",
206
- run: async ({ task, next }) => {
207
- if (task?.definition.meta?.tags) {
208
- const extracted = performanceTag.extract(task.definition.meta.tags);
209
- if (extracted) {
210
- middlewareExecutions.push({
211
- taskId: task.definition.id as string,
212
- config: extracted.config,
213
- });
214
- }
215
- }
216
- return next(task?.input);
217
- },
218
- });
219
-
220
- const fastTask = defineTask({
221
- id: "fast.task",
222
- meta: {
223
- tags: [performanceTag.with({ alertAboveMs: 100 })],
224
- },
225
- run: async () => "fast",
226
- });
227
-
228
- const slowTask = defineTask({
229
- id: "slow.task",
230
- meta: {
231
- tags: [performanceTag.with({ alertAboveMs: 500 })],
232
- },
233
- run: async () => "slow",
234
- });
235
-
236
- const normalTask = defineTask({
237
- id: "normal.task",
238
- meta: {
239
- tags: ["just-a-string"],
240
- },
241
- run: async () => "normal",
242
- });
243
-
244
- const app = defineResource({
245
- id: "test.app",
246
- register: [
247
- fastTask,
248
- slowTask,
249
- normalTask,
250
- performanceMiddleware.everywhere(),
251
- ],
252
- dependencies: { fastTask, slowTask, normalTask },
253
- init: async (_, { fastTask, slowTask, normalTask }) => {
254
- await fastTask();
255
- await slowTask();
256
- await normalTask();
257
- return "done";
258
- },
259
- });
260
-
261
- const { dispose } = await run(app);
262
- await dispose();
263
-
264
- expect(middlewareExecutions).toHaveLength(2);
265
- expect(middlewareExecutions).toEqual([
266
- { taskId: "fast.task", config: { alertAboveMs: 100 } },
267
- { taskId: "slow.task", config: { alertAboveMs: 500 } },
268
- ]);
269
- });
270
- });
271
-
272
- describe("Integration with Resources", () => {
273
- it("should work with resource metadata", () => {
274
- const dbTag = defineTag<{ connectionTimeout: number }>({
275
- id: "db.config",
276
- });
277
-
278
- const database = defineResource({
279
- id: "database",
280
- meta: {
281
- tags: ["database", dbTag.with({ connectionTimeout: 5000 })],
282
- },
283
- init: async () => ({ query: () => "result" }),
284
- });
285
-
286
- expect(database.meta?.tags).toHaveLength(2);
287
- const extracted = dbTag.extract(database.meta?.tags || []);
288
- expect(extracted?.config).toEqual({ connectionTimeout: 5000 });
289
- });
290
- });
291
-
292
- describe("Integration with Events", () => {
293
- it("should work with event metadata", () => {
294
- const auditTag = defineTag<{ sensitive: boolean }>({
295
- id: "audit.config",
296
- });
297
-
298
- const userEvent = defineEvent<{ userId: string }>({
299
- id: "user.created",
300
- meta: {
301
- tags: ["user-event", auditTag.with({ sensitive: true })],
302
- },
303
- });
304
-
305
- expect(userEvent.meta?.tags).toHaveLength(2);
306
- const extracted = auditTag.extract(userEvent.meta?.tags || []);
307
- expect(extracted?.config).toEqual({ sensitive: true });
308
- });
309
- });
310
-
311
- describe("Integration with Middleware", () => {
312
- it("should work with middleware metadata", () => {
313
- const rateLimitTag = defineTag<{ requestsPerMinute: number }>({
314
- id: "rate-limit",
315
- });
316
-
317
- const rateLimitMiddleware = defineMiddleware({
318
- id: "rate.limit.middleware",
319
- meta: {
320
- tags: ["security", rateLimitTag.with({ requestsPerMinute: 60 })],
321
- },
322
- run: async ({ next, task }) => {
323
- return next(task?.input);
324
- },
325
- });
326
-
327
- expect(rateLimitMiddleware.meta?.tags).toHaveLength(2);
328
- const extracted = rateLimitTag.extract(
329
- rateLimitMiddleware.meta?.tags || []
330
- );
331
- expect(extracted?.config).toEqual({ requestsPerMinute: 60 });
332
- });
333
- });
334
-
335
- describe("Backward Compatibility", () => {
336
- it("should work with existing string tags", () => {
337
- const task = defineTask({
338
- id: "legacy.task",
339
- meta: {
340
- tags: ["api", "legacy", "important"],
341
- },
342
- run: async () => "success",
343
- });
344
-
345
- // String tags should still work
346
- expect(task.meta?.tags).toEqual(["api", "legacy", "important"]);
347
-
348
- // New tags should not interfere with string tags
349
- const performanceTag = defineTag<{ alertAboveMs: number }>({
350
- id: "performance.track",
351
- });
352
-
353
- const extracted = performanceTag.extract(task.meta?.tags || []);
354
- expect(extracted).toBeNull(); // Should not find the tag
355
- });
356
-
357
- it("should allow mixing string tags and configurable tags", () => {
358
- const performanceTag = defineTag<{ alertAboveMs: number }>({
359
- id: "performance.track",
360
- });
361
-
362
- const task = defineTask({
363
- id: "mixed.task",
364
- meta: {
365
- tags: [
366
- "api", // string tag
367
- performanceTag.with({ alertAboveMs: 200 }), // configurable tag
368
- "important", // string tag
369
- ],
370
- },
371
- run: async () => "success",
372
- });
373
-
374
- expect(task.meta?.tags).toHaveLength(3);
375
- expect(task.meta?.tags?.[0]).toBe("api");
376
- expect(task.meta?.tags?.[2]).toBe("important");
377
-
378
- const extracted = performanceTag.extract(task.meta?.tags || []);
379
- expect(extracted?.config).toEqual({ alertAboveMs: 200 });
380
- });
381
- });
382
-
383
- describe("Edge Cases", () => {
384
- it("should handle null/undefined config", () => {
385
- const optionalTag = defineTag<{ value?: string }>({
386
- id: "optional.config",
387
- });
388
-
389
- const configuredTag = optionalTag.with({});
390
- expect(configuredTag.config).toEqual({});
391
-
392
- const extracted = optionalTag.extract([configuredTag]);
393
- expect(extracted?.config).toEqual({});
394
- });
395
- });
396
- });