@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
package/src/define.ts DELETED
@@ -1,480 +0,0 @@
1
- /**
2
- * Factory functions for defining tasks, resources, events and middleware.
3
- *
4
- * These helpers create strongly-typed definitions while also wiring internal
5
- * metadata: anonymous IDs, file path tags (for better debugging), lifecycle
6
- * events, and global middleware flags. See README for high-level concepts.
7
- */
8
- import {
9
- ITask,
10
- ITaskDefinition,
11
- IResource,
12
- IResourceWithConfig,
13
- IResourceDefinition,
14
- IEventDefinition,
15
- IMiddlewareDefinition,
16
- DependencyMapType,
17
- DependencyValuesType,
18
- IMiddleware,
19
- IEvent,
20
- symbolEvent,
21
- RegisterableItems,
22
- symbolMiddlewareConfigured,
23
- symbolFilePath,
24
- symbolIndexResource,
25
- ITag,
26
- ITagDefinition,
27
- ITagWithConfig,
28
- TagType,
29
- ITaggable,
30
- symbolTask,
31
- symbolMiddlewareEverywhereTasks,
32
- symbolMiddlewareEverywhereResources,
33
- symbolResourceWithConfig,
34
- symbolResource,
35
- symbolMiddleware,
36
- ITaskMeta,
37
- IResourceMeta,
38
- } from "./defs";
39
- import { MiddlewareAlreadyGlobalError, ValidationError } from "./errors";
40
- import { generateCallerIdFromFile, getCallerFile } from "./tools/getCallerFile";
41
-
42
- // Helper function to get the caller file
43
-
44
- /**
45
- * Define a task.
46
- * Generates a strongly-typed task object with id, lifecycle events, dependencies,
47
- * middleware, and metadata.
48
- *
49
- * - If `id` is omitted, an anonymous, file-based id is generated.
50
- * - Wires lifecycle events: `beforeRun`, `afterRun`, `onError`.
51
- * - Carries through dependencies, middleware, input schema, and metadata.
52
- *
53
- * @typeParam Input - Input type accepted by the task's `run` function.
54
- * @typeParam Output - Promise type returned by the `run` function.
55
- * @typeParam Deps - Dependency map type this task requires.
56
- * @typeParam TOn - Event type or "*" this task listens to.
57
- * @typeParam TMeta - Arbitrary metadata type carried by the task.
58
- * @param taskConfig - The task definition config.
59
- * @returns A branded task definition usable by the runner.
60
- */
61
- export function defineTask<
62
- Input = undefined,
63
- Output extends Promise<any> = any,
64
- Deps extends DependencyMapType = any,
65
- TOn extends "*" | IEventDefinition | undefined = undefined,
66
- TMeta extends ITaskMeta = any
67
- >(
68
- taskConfig: ITaskDefinition<Input, Output, Deps, TOn, TMeta>
69
- ): ITask<Input, Output, Deps, TOn, TMeta> {
70
- const filePath = getCallerFile();
71
- const isAnonymous = !Boolean(taskConfig.id);
72
- const id = taskConfig.id || generateCallerIdFromFile(filePath, "task");
73
- return {
74
- [symbolTask]: true,
75
- [symbolFilePath]: filePath,
76
- id,
77
- dependencies: taskConfig.dependencies || ({} as Deps),
78
- middleware: taskConfig.middleware || [],
79
- run: taskConfig.run,
80
- on: taskConfig.on,
81
- listenerOrder: taskConfig.listenerOrder,
82
- inputSchema: taskConfig.inputSchema,
83
- events: {
84
- beforeRun: {
85
- ...defineEvent({
86
- id: isAnonymous
87
- ? Symbol(`anonymous-task.events.beforeRun`)
88
- : `${id as string}.events.beforeRun`,
89
- }),
90
- [symbolFilePath]: getCallerFile(),
91
- },
92
- afterRun: {
93
- ...defineEvent({
94
- id: isAnonymous
95
- ? Symbol(`anonymous-task.events.afterRun`)
96
- : `${id as string}.events.afterRun`,
97
- }),
98
- [symbolFilePath]: getCallerFile(),
99
- },
100
- onError: {
101
- ...defineEvent({
102
- id: isAnonymous
103
- ? Symbol(`anonymous-task.events.onError`)
104
- : `${id as string}.events.onError`,
105
- }),
106
- [symbolFilePath]: getCallerFile(),
107
- },
108
- },
109
- meta: taskConfig.meta || ({} as TMeta),
110
- // autorun,
111
- };
112
- }
113
-
114
- export function defineResource<
115
- TConfig = void,
116
- TValue extends Promise<any> = Promise<any>,
117
- TDeps extends DependencyMapType = {},
118
- TPrivate = any,
119
- TMeta extends IResourceMeta = any
120
- >(
121
- constConfig: IResourceDefinition<
122
- TConfig,
123
- TValue,
124
- TDeps,
125
- TPrivate,
126
- any,
127
- any,
128
- TMeta
129
- >
130
- ): IResource<TConfig, TValue, TDeps, TPrivate, TMeta> {
131
- /**
132
- * Define a resource.
133
- * Produces a strongly-typed resource with id, lifecycle events, registration hooks,
134
- * and optional config schema.
135
- *
136
- * - If `id` is omitted, an anonymous, file-based id is generated (resource or index flavored).
137
- * - Wires lifecycle events: `beforeInit`, `afterInit`, `onError`.
138
- * - Provides `.with(config)` for config-bound registration with optional runtime validation.
139
- *
140
- * @typeParam TConfig - Configuration type accepted by the resource.
141
- * @typeParam TValue - Promise type resolved by the resource `init`.
142
- * @typeParam TDeps - Dependency map type this resource requires.
143
- * @typeParam TPrivate - Private context type exposed to middleware during init.
144
- * @typeParam TMeta - Arbitrary metadata type carried by the resource.
145
- * @param constConfig - The resource definition config.
146
- * @returns A branded resource definition usable by the runner.
147
- */
148
- // The symbolFilePath might already come from defineIndex() for example
149
- const filePath: string = constConfig[symbolFilePath] || getCallerFile();
150
- const isIndexResource = constConfig[symbolIndexResource] || false;
151
- const isAnonymous = !Boolean(constConfig.id);
152
- const id =
153
- constConfig.id ||
154
- generateCallerIdFromFile(filePath, isIndexResource ? "index" : "resource");
155
-
156
- return {
157
- [symbolResource]: true,
158
- [symbolFilePath]: filePath,
159
- [symbolIndexResource]: isIndexResource,
160
- id,
161
- dependencies: constConfig.dependencies,
162
- dispose: constConfig.dispose,
163
- register: constConfig.register || [],
164
- overrides: constConfig.overrides || [],
165
- init: constConfig.init,
166
- context: constConfig.context,
167
- configSchema: constConfig.configSchema,
168
- with: function (config: TConfig) {
169
- // Validate config with schema if provided (fail fast)
170
- if (this.configSchema) {
171
- try {
172
- config = this.configSchema.parse(config);
173
- } catch (error) {
174
- throw new ValidationError(
175
- "Resource config",
176
- this.id,
177
- error instanceof Error ? error : new Error(String(error))
178
- );
179
- }
180
- }
181
-
182
- return {
183
- [symbolResourceWithConfig]: true,
184
- id: this.id,
185
- resource: this,
186
- config,
187
- };
188
- },
189
-
190
- events: {
191
- beforeInit: {
192
- ...defineEvent({
193
- id: isAnonymous
194
- ? Symbol(`anonymous-resource.events.beforeInit`)
195
- : `${id as string}.events.beforeInit`,
196
- }),
197
- [symbolFilePath]: filePath,
198
- },
199
- afterInit: {
200
- ...defineEvent({
201
- id: isAnonymous
202
- ? Symbol(`anonymous-resource.events.afterInit`)
203
- : `${id as string}.events.afterInit`,
204
- }),
205
- [symbolFilePath]: filePath,
206
- },
207
- onError: {
208
- ...defineEvent({
209
- id: isAnonymous
210
- ? Symbol(`anonymous-resource.events.onError`)
211
- : `${id as string}.events.onError`,
212
- }),
213
- [symbolFilePath]: filePath,
214
- },
215
- },
216
- meta: (constConfig.meta || {}) as TMeta,
217
- middleware: constConfig.middleware || [],
218
- };
219
- }
220
-
221
- /**
222
- * Creates an "index" resource which groups multiple registerable items under
223
- * a single dependency. The resulting resource registers every item, depends
224
- * on the same items, and returns the resolved dependency map so users can
225
- * access them naturally: `deps.services.myTask()` or `deps.services.myResource`.
226
- */
227
- export function defineIndex<
228
- T extends Record<string, RegisterableItems>,
229
- D extends {
230
- [K in keyof T]: T[K] extends IResourceWithConfig<any, any, any>
231
- ? T[K]["resource"]
232
- : T[K];
233
- } & DependencyMapType
234
- >(items: T): IResource<void, Promise<DependencyValuesType<D>>, D> {
235
- // Build dependency map from given items; unwrap `.with()` to the base resource
236
- const dependencies = {} as D;
237
- const register: RegisterableItems[] = [];
238
-
239
- for (const key of Object.keys(items) as (keyof T)[]) {
240
- const item = items[key];
241
- register.push(item);
242
-
243
- if (isResourceWithConfig(item)) {
244
- (dependencies as any)[key] = item.resource;
245
- } else {
246
- (dependencies as any)[key] = item as any;
247
- }
248
- }
249
- const callerFilePath = getCallerFile();
250
-
251
- return defineResource({
252
- register,
253
- dependencies,
254
- async init(_, deps) {
255
- return deps as any;
256
- },
257
- [symbolFilePath]: callerFilePath,
258
- [symbolIndexResource]: true,
259
- });
260
- }
261
-
262
- export function defineEvent<TPayload = void>(
263
- config?: IEventDefinition<TPayload>
264
- ): IEvent<TPayload> {
265
- /**
266
- * Define an event.
267
- * Generates a branded event definition with a stable id (anonymous if omitted)
268
- * and file path metadata for better debugging.
269
- *
270
- * @typeParam TPayload - Payload type carried by the event.
271
- * @param config - Optional event definition (id, etc.).
272
- * @returns A branded event definition.
273
- */
274
- const callerFilePath = getCallerFile();
275
- const eventConfig = config || {};
276
- return {
277
- ...eventConfig,
278
- id: eventConfig.id || generateCallerIdFromFile(callerFilePath, "event"),
279
- [symbolFilePath]: callerFilePath,
280
- [symbolEvent]: true, // This is a workaround
281
- };
282
- }
283
-
284
- export type MiddlewareEverywhereOptions = {
285
- /**
286
- * Enable this for tasks. Default is true.
287
- */
288
- tasks?: boolean;
289
- /**
290
- * Enable this for resources. Default is true.
291
- */
292
- resources?: boolean;
293
- };
294
-
295
- /**
296
- * Define a middleware.
297
- * Creates a middleware definition with anonymous id generation, `.with(config)`,
298
- * and `.everywhere()` helpers.
299
- *
300
- * - `.with(config)` merges config (optionally validated via `configSchema`).
301
- * - `.everywhere()` marks the middleware global (optionally scoping to tasks/resources).
302
- *
303
- * @typeParam TConfig - Configuration type accepted by the middleware.
304
- * @typeParam TDependencies - Dependency map type required by the middleware.
305
- * @param middlewareDef - The middleware definition config.
306
- * @returns A branded middleware definition usable by the runner.
307
- */
308
- export function defineMiddleware<
309
- TConfig extends Record<string, any>,
310
- TDependencies extends DependencyMapType
311
- >(
312
- middlewareDef: IMiddlewareDefinition<TConfig, TDependencies>
313
- ): IMiddleware<TConfig, TDependencies> {
314
- const filePath = getCallerFile();
315
- const object = {
316
- [symbolFilePath]: filePath,
317
- [symbolMiddleware]: true,
318
- config: {} as TConfig,
319
- id: middlewareDef.id || generateCallerIdFromFile(filePath, "middleware"),
320
- ...middlewareDef,
321
- dependencies: middlewareDef.dependencies || ({} as TDependencies),
322
- } as IMiddleware<TConfig, TDependencies>;
323
-
324
- return {
325
- ...object,
326
- with: (config: TConfig) => {
327
- // Validate config with schema if provided (fail fast)
328
- if (object.configSchema) {
329
- try {
330
- config = object.configSchema.parse(config);
331
- } catch (error) {
332
- throw new ValidationError(
333
- "Middleware config",
334
- object.id,
335
- error instanceof Error ? error : new Error(String(error))
336
- );
337
- }
338
- }
339
-
340
- return {
341
- ...object,
342
- [symbolMiddlewareConfigured]: true,
343
- config: {
344
- ...object.config,
345
- ...config,
346
- },
347
- };
348
- },
349
- everywhere(options: MiddlewareEverywhereOptions = {}) {
350
- const { tasks = true, resources = true } = options;
351
-
352
- return {
353
- ...object,
354
- [symbolMiddlewareEverywhereTasks]: tasks,
355
- [symbolMiddlewareEverywhereResources]: resources,
356
- everywhere() {
357
- throw new MiddlewareAlreadyGlobalError(object.id);
358
- },
359
- };
360
- },
361
- };
362
- }
363
-
364
- /**
365
- * Type guard: checks if a definition is a Task.
366
- * @param definition - Any value to test.
367
- * @returns True when `definition` is a branded Task.
368
- */
369
- export function isTask(definition: any): definition is ITask {
370
- return definition && definition[symbolTask];
371
- }
372
-
373
- /**
374
- * Type guard: checks if a definition is a Resource.
375
- * @param definition - Any value to test.
376
- * @returns True when `definition` is a branded Resource.
377
- */
378
- export function isResource(definition: any): definition is IResource {
379
- return definition && definition[symbolResource];
380
- }
381
-
382
- /**
383
- * Type guard: checks if a definition is a Resource that carries config via `.with()`.
384
- * @param definition - Any value to test.
385
- * @returns True when `definition` is a branded ResourceWithConfig.
386
- */
387
- export function isResourceWithConfig(
388
- definition: any
389
- ): definition is IResourceWithConfig {
390
- return definition && definition[symbolResourceWithConfig];
391
- }
392
-
393
- /**
394
- * Type guard: checks if a definition is an Event.
395
- * @param definition - Any value to test.
396
- * @returns True when `definition` is a branded Event.
397
- */
398
- export function isEvent(definition: any): definition is IEvent {
399
- return definition && definition[symbolEvent];
400
- }
401
-
402
- /**
403
- * Type guard: checks if a definition is a Middleware.
404
- * @param definition - Any value to test.
405
- * @returns True when `definition` is a branded Middleware.
406
- */
407
- export function isMiddleware(definition: any): definition is IMiddleware {
408
- return definition && definition[symbolMiddleware];
409
- }
410
-
411
- /**
412
- * Override helper that preserves the original `id` and returns the same type.
413
- * You can override any property except `id`. The override is shallow-merged over the base.
414
- *
415
- * @param base - The base definition to override.
416
- * @param patch - Properties to override (except `id`).
417
- * @returns A definition of the same kind with overrides applied.
418
- */
419
- export function defineOverride<T extends ITask<any, any, any, any>>(
420
- base: T,
421
- patch: Omit<Partial<T>, "id">
422
- ): T;
423
- export function defineOverride<T extends IResource<any, any, any, any>>(
424
- base: T,
425
- patch: Omit<Partial<T>, "id">
426
- ): T;
427
- export function defineOverride<T extends IMiddleware<any, any>>(
428
- base: T,
429
- patch: Omit<Partial<T>, "id">
430
- ): T;
431
- export function defineOverride(
432
- base: ITask | IResource | IMiddleware,
433
- patch: Record<string | symbol, unknown>
434
- ): ITask | IResource | IMiddleware {
435
- const { id: _ignored, ...rest } = (patch || {}) as any;
436
- // Ensure we never change the id, and merge overrides last
437
- return {
438
- ...(base as any),
439
- ...rest,
440
- id: (base as any).id,
441
- } as any;
442
- }
443
-
444
- /**
445
- * Create a tag definition.
446
- * - `.with(config)` to create configured instances
447
- * - `.extract(tags)` to extract this tag from a list of tags or a taggable's meta
448
- *
449
- * @typeParam TConfig - Configuration type carried by configured tags.
450
- * @typeParam TEnforceContract - Optional helper type to enforce a contract when tags are used.
451
- * @param definition - The tag definition (id).
452
- * @returns A tag object with helpers to configure and extract.
453
- */
454
- export function defineTag<TConfig = void, TEnforceContract = void>(
455
- definition: ITagDefinition<TConfig, TEnforceContract>
456
- ): ITag<TConfig, TEnforceContract> {
457
- const id = definition.id;
458
-
459
- return {
460
- id,
461
- with(tagConfig: TConfig) {
462
- return {
463
- id,
464
- tag: this,
465
- config: tagConfig as any,
466
- } as ITagWithConfig<TConfig>;
467
- },
468
- extract(target: TagType[] | ITaggable) {
469
- const tags = Array.isArray(target) ? target : target?.meta?.tags || [];
470
- for (const candidate of tags) {
471
- if (typeof candidate === "string") continue;
472
- // Configured instance
473
- if (candidate.id === id) {
474
- return candidate as ITagWithConfig<TConfig>;
475
- }
476
- }
477
- return null;
478
- },
479
- } as ITag<TConfig>;
480
- }
@@ -1,91 +0,0 @@
1
- // HasContracts<Meta> → true if contracts present, else false
2
-
3
- import { ITag, ITagWithConfig } from "./defs";
4
- import { IMeta } from "./defs";
5
-
6
- // Keep these param names aligned with your defs.ts: ITag<TConfig, TEnforceContract>
7
- type NonVoid<T> = [T] extends [void] ? never : T;
8
-
9
- type ExtractReturnFromTag<T> = T extends ITagWithConfig<any, infer R>
10
- ? NonVoid<R>
11
- : T extends ITag<any, infer R>
12
- ? NonVoid<R>
13
- : never;
14
-
15
- type IsTuple<T extends readonly unknown[]> = number extends T["length"]
16
- ? false
17
- : true;
18
-
19
- type FilterContracts<
20
- TTags extends readonly unknown[],
21
- Acc extends readonly unknown[] = []
22
- > = TTags extends readonly [infer H, ...infer R]
23
- ? ExtractReturnFromTag<H> extends never
24
- ? FilterContracts<R, Acc>
25
- : FilterContracts<R, [...Acc, ExtractReturnFromTag<H>]>
26
- : Acc;
27
-
28
- export type ExtractContractsFromTags<TTags extends readonly unknown[]> =
29
- IsTuple<TTags> extends true
30
- ? FilterContracts<TTags>
31
- : Array<ExtractReturnFromTag<TTags[number]>>;
32
-
33
- export type ExtractTagsWithNonVoidReturnTypeFromMeta<TMeta extends IMeta> =
34
- TMeta extends { tags?: infer TTags }
35
- ? TTags extends readonly unknown[]
36
- ? ExtractContractsFromTags<TTags>
37
- : []
38
- : [];
39
-
40
- type IsNeverTuple<T extends readonly unknown[]> = T extends [] ? true : false;
41
-
42
- export type HasContracts<T extends IMeta> =
43
- ExtractTagsWithNonVoidReturnTypeFromMeta<T> extends never[] ? false : true; // HasContracts and enforcement
44
-
45
- // Ensure a response type satisfies ALL contracts (intersection)
46
- type UnionToIntersection<U> = (
47
- U extends any ? (arg: U) => void : never
48
- ) extends (arg: infer I) => void
49
- ? I
50
- : never;
51
-
52
- type ContractsUnion<TMeta extends IMeta> =
53
- ExtractTagsWithNonVoidReturnTypeFromMeta<TMeta> extends readonly (infer U)[]
54
- ? U
55
- : never;
56
-
57
- type ContractsIntersection<TMeta extends IMeta> = UnionToIntersection<
58
- ContractsUnion<TMeta>
59
- >;
60
-
61
- /**
62
- * Pretty-print helper to expand intersections for better IDE display.
63
- */
64
- type Simplify<T> = { [K in keyof T]: T[K] } & {};
65
-
66
- /**
67
- * Verbose compile-time error surfaced when a value does not satisfy
68
- * the intersection of all tag-enforced contracts.
69
- *
70
- * Intersected with `never` in call sites when desired to ensure assignment
71
- * fails while still surfacing a readable shape in tooltips.
72
- */
73
- export type ContractViolationError<TMeta extends IMeta, TActual> = {
74
- message: "Value does not satisfy all tag contracts";
75
- expected: Simplify<ContractsIntersection<TMeta>>;
76
- received: TActual;
77
- };
78
-
79
- export type EnsureResponseSatisfiesContracts<TMeta extends IMeta, TResponse> = [
80
- ContractsUnion<TMeta>
81
- ] extends [never]
82
- ? TResponse // no contracts, allow as-is
83
- : TResponse extends Promise<infer U>
84
- ? Promise<
85
- U extends ContractsIntersection<TMeta>
86
- ? U
87
- : ContractViolationError<TMeta, U>
88
- >
89
- : TResponse extends ContractsIntersection<TMeta>
90
- ? TResponse
91
- : ContractViolationError<TMeta, TResponse>;