@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,428 +0,0 @@
1
- import { defineTask, defineResource, defineEvent, defineMiddleware } from "../define";
2
- import { run } from "../run";
3
- import { IValidationSchema } from "../defs";
4
-
5
- // Simple mock validation schemas for testing the interface
6
- class MockValidationSchema<T> implements IValidationSchema<T> {
7
- constructor(
8
- private validator: (input: unknown) => T,
9
- private errorMessage?: string
10
- ) {}
11
-
12
- parse(input: unknown): T {
13
- try {
14
- return this.validator(input);
15
- } catch (error) {
16
- throw new Error(this.errorMessage || "Validation failed");
17
- }
18
- }
19
- }
20
-
21
- // Helper functions to create mock schemas similar to Zod
22
- const mockSchema = {
23
- object: <T extends Record<string, any>>(shape: Record<keyof T, string>): IValidationSchema<T> => {
24
- return new MockValidationSchema((input: unknown) => {
25
- if (typeof input !== "object" || input === null) {
26
- throw new Error("Expected object");
27
- }
28
- const obj = input as any;
29
- for (const [key, expectedType] of Object.entries(shape)) {
30
- if (expectedType === "string" && typeof obj[key] !== "string") {
31
- throw new Error(`${key} must be string`);
32
- }
33
- if (expectedType === "number" && typeof obj[key] !== "number") {
34
- throw new Error(`${key} must be number`);
35
- }
36
- if (expectedType === "boolean" && typeof obj[key] !== "boolean") {
37
- throw new Error(`${key} must be boolean`);
38
- }
39
- }
40
- return obj as T;
41
- });
42
- },
43
-
44
- string: (): IValidationSchema<string> => {
45
- return new MockValidationSchema((input: unknown) => {
46
- if (typeof input !== "string") {
47
- throw new Error("Expected string");
48
- }
49
- return input;
50
- });
51
- },
52
-
53
- number: (): IValidationSchema<number> => {
54
- return new MockValidationSchema((input: unknown) => {
55
- if (typeof input !== "number") {
56
- throw new Error("Expected number");
57
- }
58
- return input;
59
- });
60
- },
61
-
62
- boolean: (): IValidationSchema<boolean> => {
63
- return new MockValidationSchema((input: unknown) => {
64
- if (typeof input !== "boolean") {
65
- throw new Error("Expected boolean");
66
- }
67
- return input;
68
- });
69
- },
70
-
71
- transform: <T, U>(schema: IValidationSchema<T>, transformer: (value: T) => U): IValidationSchema<U> => {
72
- return new MockValidationSchema((input: unknown) => {
73
- const validated = schema.parse(input);
74
- return transformer(validated);
75
- });
76
- },
77
-
78
- withDefaults: <T>(defaultValue: T): IValidationSchema<T> => {
79
- return new MockValidationSchema((input: unknown) => {
80
- return input === undefined ? defaultValue : (input as T);
81
- });
82
- },
83
- };
84
-
85
- describe("Generic Validation Interface", () => {
86
- describe("Task Input Validation", () => {
87
- it("should validate task input successfully with valid data", async () => {
88
- const userSchema = mockSchema.object<{
89
- name: string;
90
- age: number;
91
- }>({
92
- name: "string",
93
- age: "number",
94
- });
95
-
96
- const createUserTask = defineTask({
97
- id: "task.createUser",
98
- inputSchema: userSchema,
99
- run: async (input) => {
100
- return `Created user ${(input as any).name}`;
101
- },
102
- });
103
-
104
- const app = defineResource({
105
- id: "app",
106
- register: [createUserTask],
107
- dependencies: { createUserTask },
108
- init: async (_, { createUserTask }) => {
109
- const result = await createUserTask({
110
- name: "John Doe",
111
- age: 30,
112
- });
113
- expect(result).toBe("Created user John Doe");
114
- return result;
115
- },
116
- });
117
-
118
- await run(app);
119
- });
120
-
121
- it("should throw validation error for invalid task input", async () => {
122
- const userSchema = new MockValidationSchema((input: unknown) => {
123
- if (typeof input !== "object" || input === null) {
124
- throw new Error("Expected object");
125
- }
126
- const obj = input as any;
127
- if (typeof obj.name !== "string") {
128
- throw new Error("name must be string");
129
- }
130
- if (typeof obj.age !== "number" || obj.age < 0) {
131
- throw new Error("age must be positive number");
132
- }
133
- return obj;
134
- });
135
-
136
- const createUserTask = defineTask({
137
- id: "task.createUser.invalid",
138
- inputSchema: userSchema,
139
- run: async (input) => {
140
- return `Created user ${(input as any).name}`;
141
- },
142
- });
143
-
144
- const app = defineResource({
145
- id: "app",
146
- register: [createUserTask],
147
- dependencies: { createUserTask },
148
- init: async (_, { createUserTask }) => {
149
- await createUserTask({
150
- name: "John Doe",
151
- age: -5, // Invalid: negative age
152
- });
153
- },
154
- });
155
-
156
- await expect(run(app)).rejects.toThrow(/Task input validation failed/);
157
- });
158
-
159
- it("should transform input data when schema supports it", async () => {
160
- const stringToNumberSchema = mockSchema.transform(
161
- mockSchema.string(),
162
- (val: string) => parseInt(val, 10)
163
- );
164
-
165
- const mathTask = defineTask({
166
- id: "task.math",
167
- inputSchema: stringToNumberSchema,
168
- run: async (input: number) => {
169
- expect(typeof input).toBe("number");
170
- return input * 2;
171
- },
172
- });
173
-
174
- const app = defineResource({
175
- id: "app",
176
- register: [mathTask],
177
- dependencies: { mathTask },
178
- init: async (_, { mathTask }) => {
179
- const result = await (mathTask as any)("42"); // String input should be transformed to number
180
- expect(result).toBe(84);
181
- return result;
182
- },
183
- });
184
-
185
- await run(app);
186
- });
187
- });
188
-
189
- describe("Resource Config Validation", () => {
190
- it("should validate resource config when .with() is called (fail fast)", async () => {
191
- const configSchema = new MockValidationSchema((input: unknown) => {
192
- if (typeof input !== "object" || input === null) {
193
- throw new Error("Expected object");
194
- }
195
- const obj = input as any;
196
- if (typeof obj.host !== "string") {
197
- throw new Error("host must be string");
198
- }
199
- if (typeof obj.port !== "number" || obj.port < 1 || obj.port > 65535) {
200
- throw new Error("port must be number between 1-65535");
201
- }
202
- return obj;
203
- });
204
-
205
- const databaseResource = defineResource({
206
- id: "resource.database",
207
- configSchema: configSchema,
208
- init: async (config) => {
209
- return {
210
- connect: () => `Connected to ${(config as any).host}:${(config as any).port}`,
211
- };
212
- },
213
- });
214
-
215
- // This should throw immediately when .with() is called, not during init
216
- expect(() => {
217
- databaseResource.with({
218
- host: "localhost",
219
- port: 99999, // Invalid: port too high
220
- });
221
- }).toThrow(/Resource config validation failed/);
222
- });
223
-
224
- it("should work with valid resource config", async () => {
225
- const configSchema = mockSchema.object<{
226
- host: string;
227
- port: number;
228
- }>({
229
- host: "string",
230
- port: "number",
231
- });
232
-
233
- const databaseResource = defineResource({
234
- id: "resource.database.valid",
235
- configSchema: configSchema,
236
- init: async (config) => {
237
- return {
238
- connect: () => `Connected to ${(config as any).host}:${(config as any).port}`,
239
- };
240
- },
241
- });
242
-
243
- const app = defineResource({
244
- id: "app",
245
- register: [
246
- databaseResource.with({
247
- host: "localhost",
248
- port: 5432,
249
- }),
250
- ],
251
- dependencies: { database: databaseResource },
252
- init: async (_, { database }) => {
253
- const result = database.connect();
254
- expect(result).toBe("Connected to localhost:5432");
255
- return result;
256
- },
257
- });
258
-
259
- await run(app);
260
- });
261
- });
262
-
263
- describe("Event Payload Validation", () => {
264
- it("should validate event payload when emitted", async () => {
265
- const payloadSchema = new MockValidationSchema((input: unknown) => {
266
- if (typeof input !== "object" || input === null) {
267
- throw new Error("Expected object");
268
- }
269
- const obj = input as any;
270
- if (typeof obj.message !== "string") {
271
- throw new Error("message must be string");
272
- }
273
- return obj;
274
- });
275
-
276
- const testEvent = defineEvent({
277
- id: "event.test",
278
- payloadSchema: payloadSchema,
279
- });
280
-
281
- let receivedMessage = "";
282
- const listenerTask = defineTask({
283
- id: "task.listener",
284
- on: testEvent,
285
- run: async (event) => {
286
- receivedMessage = (event.data as any).message;
287
- },
288
- });
289
-
290
- const app = defineResource({
291
- id: "app",
292
- register: [testEvent, listenerTask],
293
- dependencies: { testEvent },
294
- init: async (_, { testEvent }) => {
295
- // This should work with valid payload
296
- await testEvent({ message: "Hello World" });
297
- expect(receivedMessage).toBe("Hello World");
298
-
299
- // This should throw with invalid payload
300
- await expect(testEvent({ invalidField: 123 } as any)).rejects.toThrow(/Event payload validation failed/);
301
- },
302
- });
303
-
304
- await run(app);
305
- });
306
- });
307
-
308
- describe("Middleware Config Validation", () => {
309
- it("should validate middleware config when .with() is called (fail fast)", async () => {
310
- const configSchema = new MockValidationSchema((input: unknown) => {
311
- if (typeof input !== "object" || input === null) {
312
- throw new Error("Expected object");
313
- }
314
- const obj = input as any;
315
- if (typeof obj.timeout !== "number" || obj.timeout <= 0) {
316
- throw new Error("timeout must be positive number");
317
- }
318
- return obj;
319
- });
320
-
321
- const timingMiddleware = defineMiddleware({
322
- id: "middleware.timing",
323
- configSchema: configSchema,
324
- run: async ({ next }, _, config) => {
325
- return next();
326
- },
327
- });
328
-
329
- // This should throw immediately when .with() is called
330
- expect(() => {
331
- timingMiddleware.with({
332
- timeout: -5, // Invalid: negative timeout
333
- });
334
- }).toThrow(/Middleware config validation failed/);
335
- });
336
-
337
- it("should work with valid middleware config", async () => {
338
- const configSchema = mockSchema.object<{
339
- timeout: number;
340
- }>({
341
- timeout: "number",
342
- });
343
-
344
- const timingMiddleware = defineMiddleware({
345
- id: "middleware.timing.valid",
346
- configSchema: configSchema,
347
- run: async ({ next }, _, config) => {
348
- const start = Date.now();
349
- const result = await next();
350
- const duration = Date.now() - start;
351
- expect(typeof (config as any).timeout).toBe("number");
352
- return result;
353
- },
354
- });
355
-
356
- const testTask = defineTask({
357
- id: "task.test",
358
- middleware: [timingMiddleware.with({ timeout: 5000 })],
359
- run: async () => {
360
- return "success";
361
- },
362
- });
363
-
364
- const app = defineResource({
365
- id: "app",
366
- register: [timingMiddleware, testTask],
367
- dependencies: { testTask },
368
- init: async (_, { testTask }) => {
369
- const result = await testTask();
370
- expect(result).toBe("success");
371
- return result;
372
- },
373
- });
374
-
375
- await run(app);
376
- });
377
- });
378
-
379
- describe("No Validation (Backward Compatibility)", () => {
380
- it("should work without any validation schemas", async () => {
381
- const task = defineTask({
382
- id: "task.noValidation",
383
- run: async (input: any) => {
384
- return `Received: ${JSON.stringify(input)}`;
385
- },
386
- });
387
-
388
- const resource = defineResource({
389
- id: "resource.noValidation",
390
- init: async (config: any) => {
391
- return { config };
392
- },
393
- });
394
-
395
- const event = defineEvent<any>({
396
- id: "event.noValidation",
397
- });
398
-
399
- const middleware = defineMiddleware({
400
- id: "middleware.noValidation",
401
- run: async ({ next }) => next(),
402
- });
403
-
404
- const app = defineResource({
405
- id: "app",
406
- register: [
407
- task,
408
- resource.with({ anything: "goes" }),
409
- event,
410
- middleware,
411
- ],
412
- dependencies: { task, resource, event },
413
- init: async (_, { task, resource, event }) => {
414
- const taskResult = await task({ any: "data" });
415
- expect(taskResult).toBe('Received: {"any":"data"}');
416
-
417
- expect(resource.config.anything).toBe("goes");
418
-
419
- await event({ any: "payload" }); // Should work without validation
420
-
421
- return "success";
422
- },
423
- });
424
-
425
- await run(app);
426
- });
427
- });
428
- });
package/src/context.ts DELETED
@@ -1,86 +0,0 @@
1
- import { AsyncLocalStorage } from "async_hooks";
2
- import { defineMiddleware } from "./define";
3
- import { IMiddleware, IMiddlewareConfigured } from "./defs";
4
- import { requireContextMiddleware } from "./globals/middleware/requireContext.middleware";
5
-
6
- /**
7
- * Error thrown whenever a requested context is not available.
8
- */
9
- export class ContextError extends Error {
10
- constructor(message: string) {
11
- super(message);
12
- this.name = "ContextError";
13
- }
14
- }
15
-
16
- /**
17
- * The generic Context object returned by `createContext`.
18
- */
19
- export interface Context<T> {
20
- /** unique symbol used as key in the AsyncLocalStorage map */
21
- readonly id: symbol;
22
- /** Retrieve the current context value or throw */
23
- use(): T;
24
- /**
25
- * Provide a value for this context during the lifetime of `fn()`
26
- */
27
- provide<R>(value: T, fn: () => Promise<R> | R): Promise<R> | R;
28
- /**
29
- * Generates a middleware that guarantees the context exists (and optionally
30
- * enforces that certain keys are present on the context object).
31
- */
32
- require<K extends keyof T = never>(
33
- keys?: K[]
34
- ): IMiddlewareConfigured<{ context: Context<T> }>;
35
- }
36
-
37
- // The internal storage maps Context identifiers (symbols) to their values
38
- export const storage = new AsyncLocalStorage<Map<symbol, unknown>>();
39
-
40
- /** Returns the currently active store or undefined. */
41
- function getCurrentStore(): Map<symbol, unknown> | undefined {
42
- return storage.getStore();
43
- }
44
-
45
- /**
46
- * Create a new typed Context. The result contains helpers similar to React’s
47
- * Context API but adapted for async usage in Runner.
48
- */
49
- export function createContext<T>(name: string = "runner.context"): Context<T> {
50
- const ctxId = Symbol(name);
51
-
52
- function use(): T {
53
- const store = getCurrentStore();
54
- if (!store || !store.has(ctxId)) {
55
- throw new ContextError(
56
- `Context not available for symbol ${ctxId.toString()}`
57
- );
58
- }
59
- return store.get(ctxId) as T;
60
- }
61
-
62
- function provide<R>(value: T, fn: () => Promise<R> | R): Promise<R> | R {
63
- const currentStore = getCurrentStore();
64
- const map = currentStore
65
- ? new Map(currentStore)
66
- : new Map<symbol, unknown>();
67
- map.set(ctxId, value);
68
-
69
- return storage.run(map, fn as any);
70
- }
71
-
72
- /**
73
- * Generates a middleware that guarantees the context exists (and optionally
74
- * enforces that certain keys are present on the context object).
75
- */
76
- function require(): IMiddlewareConfigured {
77
- return requireContextMiddleware.with({ context: this as Context<T> });
78
- }
79
-
80
- return {
81
- id: ctxId,
82
- use,
83
- provide,
84
- require,
85
- };
86
- }