@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
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogPrinter = void 0;
4
+ const safeStringify_1 = require("./utils/safeStringify");
5
+ const COLORS = {
6
+ trace: "\x1b[90m",
7
+ debug: "\x1b[36m",
8
+ info: "\x1b[32m",
9
+ warn: "\x1b[33m",
10
+ error: "\x1b[31m",
11
+ critical: "\x1b[35m",
12
+ reset: "\x1b[0m",
13
+ bold: "\x1b[1m",
14
+ dim: "\x1b[2m",
15
+ blue: "\x1b[34m",
16
+ cyan: "\x1b[36m",
17
+ gray: "\x1b[90m",
18
+ };
19
+ const ICONS = {
20
+ trace: "○",
21
+ debug: "◆",
22
+ info: "●",
23
+ warn: "▲",
24
+ error: "✕",
25
+ critical: "█",
26
+ };
27
+ class LogPrinter {
28
+ strategy;
29
+ colors;
30
+ constructor(options) {
31
+ this.strategy = options.strategy;
32
+ // For 'plain', force no ANSI colors regardless of options
33
+ if (options.strategy === "plain") {
34
+ this.colors = LogPrinter.NO_COLORS;
35
+ }
36
+ else {
37
+ // If a custom colorTheme is provided, prefer starting from the colored theme
38
+ // so that overrides augment ANSI-enabled defaults even when useColors=false.
39
+ // This allows tests or consumers to opt-in per-key colors via colorTheme.
40
+ const base = options.useColors || options.colorTheme ? COLORS : LogPrinter.NO_COLORS;
41
+ this.colors = { ...base, ...(options.colorTheme || {}) };
42
+ }
43
+ }
44
+ print(log) {
45
+ if (this.strategy === "json") {
46
+ // Compact JSON line
47
+ LogPrinter.writers.log((0, safeStringify_1.safeStringify)(this.normalizeForJson(log)));
48
+ return;
49
+ }
50
+ if (this.strategy === "json_pretty") {
51
+ // Pretty JSON
52
+ LogPrinter.writers.log((0, safeStringify_1.safeStringify)(this.normalizeForJson(log), 2));
53
+ return;
54
+ }
55
+ // Default: pretty
56
+ const { level, source, message, timestamp, error, data, context } = log;
57
+ const mainLine = [
58
+ this.formatTime(timestamp),
59
+ this.formatLevel(level),
60
+ this.formatSource(source),
61
+ this.formatMessage(message),
62
+ ]
63
+ .filter(Boolean)
64
+ .join(" ");
65
+ const output = [mainLine];
66
+ const errorLines = this.formatError(error);
67
+ const dataLines = this.formatData(data);
68
+ const contextLines = this.formatContext(context);
69
+ if (errorLines.length || dataLines.length || contextLines.length) {
70
+ output.push(...errorLines, ...dataLines, ...contextLines);
71
+ output.push("");
72
+ }
73
+ const writer = this.pickWriter(level);
74
+ output.forEach((line) => writer(line));
75
+ }
76
+ pickWriter(level) {
77
+ const toError = level === "warn" || level === "error" || level === "critical";
78
+ if (toError && typeof LogPrinter.writers.error === "function") {
79
+ return (msg) => LogPrinter.writers.error(msg);
80
+ }
81
+ return (msg) => LogPrinter.writers.log(msg);
82
+ }
83
+ formatTime(timestamp) {
84
+ const time = timestamp.toISOString().slice(11, 19);
85
+ const ms = timestamp.getMilliseconds().toString().padStart(3, "0");
86
+ return `${this.colors.gray}${time}.${ms}${this.colors.reset}`;
87
+ }
88
+ formatLevel(level) {
89
+ const color = this.colors[level] || this.colors.info;
90
+ const icon = ICONS[level] || "●";
91
+ const label = level.toUpperCase().padEnd(7);
92
+ return `${color}${icon} ${this.colors.bold}${label}${this.colors.reset}`;
93
+ }
94
+ formatSource(source) {
95
+ if (!source)
96
+ return "";
97
+ return `${this.colors.blue}[${source}]${this.colors.reset} `;
98
+ }
99
+ formatMessage(message) {
100
+ if (typeof message === "object") {
101
+ const json = (0, safeStringify_1.safeStringify)(message, 2);
102
+ const padding = " ".repeat(37);
103
+ return json
104
+ .split("\n")
105
+ .map((line, i) => i === 0 ? line : `${padding}${line}`)
106
+ .join("\n");
107
+ }
108
+ return String(message);
109
+ }
110
+ formatError(error) {
111
+ if (!error)
112
+ return [];
113
+ const lines = [];
114
+ lines.push(` ${this.colors.gray}╰─${this.colors.reset} ${this.colors.error}${error.name}: ${error.message}${this.colors.reset}`);
115
+ if (error.stack) {
116
+ const frames = error.stack.split("\n");
117
+ frames.forEach((frame) => {
118
+ const cleaned = frame.trim().replace(/^at /, "");
119
+ lines.push(` ${this.colors.gray}↳${this.colors.reset} ${this.colors.dim}${cleaned}${this.colors.reset}`);
120
+ });
121
+ }
122
+ return lines;
123
+ }
124
+ formatData(data) {
125
+ if (!data || Object.keys(data).length === 0)
126
+ return [];
127
+ const lines = [];
128
+ const formatted = (0, safeStringify_1.safeStringify)(data, 2, { maxDepth: 3 }).split("\n");
129
+ lines.push(` ${this.colors.gray}╰─${this.colors.reset} ${this.colors.cyan}data:${this.colors.reset}`);
130
+ formatted.forEach((line) => {
131
+ lines.push(` ${this.colors.dim}${line}${this.colors.reset}`);
132
+ });
133
+ return lines;
134
+ }
135
+ formatContext(context) {
136
+ if (!context)
137
+ return [];
138
+ const filtered = { ...context };
139
+ delete filtered.source;
140
+ if (Object.keys(filtered).length === 0)
141
+ return [];
142
+ const lines = [];
143
+ const formatted = (0, safeStringify_1.safeStringify)(filtered, 2, { maxDepth: 3 }).split("\n");
144
+ lines.push(` ${this.colors.gray}╰─${this.colors.reset} ${this.colors.blue}context:${this.colors.reset}`);
145
+ formatted.forEach((line) => {
146
+ lines.push(` ${this.colors.dim}${line}${this.colors.reset}`);
147
+ });
148
+ return lines;
149
+ }
150
+ normalizeForJson(log) {
151
+ const normalized = { ...log };
152
+ if (typeof log.message === "object") {
153
+ const text = (0, safeStringify_1.safeStringify)(log.message);
154
+ try {
155
+ normalized.message = JSON.parse(text);
156
+ }
157
+ catch {
158
+ normalized.message = text;
159
+ }
160
+ }
161
+ return normalized;
162
+ }
163
+ // Intentionally no private stringify; reuse shared util for consistency
164
+ static NO_COLORS = {
165
+ trace: "",
166
+ debug: "",
167
+ info: "",
168
+ warn: "",
169
+ error: "",
170
+ critical: "",
171
+ reset: "",
172
+ bold: "",
173
+ dim: "",
174
+ blue: "",
175
+ cyan: "",
176
+ gray: "",
177
+ };
178
+ static writers = {
179
+ // eslint-disable-next-line no-console
180
+ log: (msg) => console.log(msg),
181
+ // eslint-disable-next-line no-console
182
+ error: (msg) => console.error?.(msg),
183
+ };
184
+ static setWriters(writers) {
185
+ LogPrinter.writers = { ...LogPrinter.writers, ...writers };
186
+ }
187
+ static resetWriters() {
188
+ // eslint-disable-next-line no-console
189
+ LogPrinter.writers = {
190
+ log: (msg) => console.log(msg),
191
+ error: (msg) => console.error?.(msg),
192
+ };
193
+ }
194
+ }
195
+ exports.LogPrinter = LogPrinter;
196
+ //# sourceMappingURL=LogPrinter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogPrinter.js","sourceRoot":"","sources":["../../src/models/LogPrinter.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- import { EventManager } from "./EventManager";
1
+ import { PrintStrategy as PrinterStrategy } from "./LogPrinter";
2
2
  export type LogLevels = "trace" | "debug" | "info" | "warn" | "error" | "critical";
3
- export interface LogInfo {
4
- source?: string | symbol;
5
- error?: Error;
3
+ export interface ILogInfo {
4
+ source?: string;
5
+ error?: unknown | Error;
6
6
  data?: Record<string, any>;
7
+ context?: Record<string, any>;
7
8
  [key: string]: any;
8
9
  }
9
10
  export interface ILog {
10
- level: string;
11
+ level: LogLevels;
11
12
  source?: string;
12
13
  message: any;
13
14
  timestamp: Date;
@@ -19,10 +20,18 @@ export interface ILog {
19
20
  data?: Record<string, any>;
20
21
  context?: Record<string, any>;
21
22
  }
23
+ export type PrintStrategy = PrinterStrategy;
22
24
  export declare class Logger {
23
- protected eventManager: EventManager;
24
- printThreshold: LogLevels | null;
25
+ private printThreshold;
26
+ private printStrategy;
27
+ private bufferLogs;
28
+ private buffer;
25
29
  private boundContext;
30
+ private localListeners;
31
+ private isLocked;
32
+ private useColors;
33
+ private printer;
34
+ private source?;
26
35
  static Severity: {
27
36
  trace: number;
28
37
  debug: number;
@@ -31,34 +40,45 @@ export declare class Logger {
31
40
  error: number;
32
41
  critical: number;
33
42
  };
34
- constructor(eventManager: EventManager, boundContext?: Record<string, any>);
43
+ constructor(options: {
44
+ printThreshold: null | LogLevels;
45
+ printStrategy: PrintStrategy;
46
+ bufferLogs: boolean;
47
+ useColors?: boolean;
48
+ }, boundContext?: Record<string, any>, source?: string);
49
+ private detectColorSupport;
35
50
  /**
36
- * Determines the default print threshold based on environment variables
51
+ * Creates a new logger instance with additional bound context
37
52
  */
38
- private getDefaultPrintThreshold;
53
+ with({ source, context, }: {
54
+ source?: string;
55
+ context?: Record<string, any>;
56
+ }): Logger;
39
57
  /**
40
- * Validates if a string is a valid log level
58
+ * Core logging method with structured LogInfo
41
59
  */
42
- private isValidLogLevel;
60
+ log(level: LogLevels, message: any, logInfo?: ILogInfo): Promise<void>;
61
+ private extractErrorInfo;
62
+ info(message: any, logInfo?: ILogInfo): Promise<void>;
63
+ error(message: any, logInfo?: ILogInfo): Promise<void>;
64
+ warn(message: any, logInfo?: ILogInfo): Promise<void>;
65
+ debug(message: any, logInfo?: ILogInfo): Promise<void>;
66
+ trace(message: any, logInfo?: ILogInfo): Promise<void>;
67
+ critical(message: any, logInfo?: ILogInfo): Promise<void>;
43
68
  /**
44
- * Creates a new logger instance with additional bound context
69
+ * Direct print for tests and advanced scenarios. Delegates to LogPrinter.
45
70
  */
46
- with(context: Record<string, any>): Logger;
47
- private extractErrorInfo;
71
+ print(log: ILog): void;
48
72
  /**
49
- * Core logging method with structured LogInfo
73
+ * @param listener - A listener that will be triggered for every log.
50
74
  */
51
- log(level: LogLevels, message: any, logInfo?: LogInfo): void;
75
+ onLog(listener: (log: ILog) => any): void;
52
76
  /**
53
- * Will print logs after that, use `null` to disable autoprinting.
54
- * @param level
77
+ * Marks the logger as ready.
78
+ * This is used to trigger the local listeners and print the buffered logs (if they exists)
79
+ * @returns A promise that resolves when the logger is ready.
55
80
  */
56
- setPrintThreshold(level: LogLevels | null): void;
57
- print(log: ILog): void;
58
- info(message: any, logInfo?: LogInfo): void;
59
- error(message: any, logInfo?: LogInfo): void;
60
- warn(message: any, logInfo?: LogInfo): void;
61
- debug(message: any, logInfo?: LogInfo): void;
62
- trace(message: any, logInfo?: LogInfo): void;
63
- critical(message: any, logInfo?: LogInfo): void;
81
+ lock(): Promise<void>;
82
+ private canPrint;
83
+ private triggerLocalListeners;
64
84
  }
@@ -1,11 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Logger = void 0;
4
- const globalEvents_1 = require("../globals/globalEvents");
4
+ const LogPrinter_1 = require("./LogPrinter");
5
5
  class Logger {
6
- eventManager;
7
- printThreshold = null;
6
+ printThreshold = "info";
7
+ printStrategy = "pretty";
8
+ bufferLogs = false;
9
+ buffer = [];
8
10
  boundContext = {};
11
+ localListeners = [];
12
+ isLocked = false;
13
+ useColors = true;
14
+ printer;
15
+ source;
9
16
  static Severity = {
10
17
  trace: 0,
11
18
  debug: 1,
@@ -14,188 +21,159 @@ class Logger {
14
21
  error: 4,
15
22
  critical: 5,
16
23
  };
17
- constructor(eventManager, boundContext = {}) {
18
- this.eventManager = eventManager;
24
+ constructor(options, boundContext = {}, source) {
19
25
  this.boundContext = { ...boundContext };
20
- this.printThreshold = this.getDefaultPrintThreshold();
26
+ this.printThreshold = options.printThreshold;
27
+ this.printStrategy = options.printStrategy;
28
+ this.bufferLogs = options.bufferLogs;
29
+ this.useColors =
30
+ typeof options.useColors === "boolean"
31
+ ? options.useColors
32
+ : this.detectColorSupport();
33
+ this.printer = new LogPrinter_1.LogPrinter({
34
+ strategy: this.printStrategy,
35
+ useColors: this.useColors,
36
+ });
37
+ this.source = source;
21
38
  }
22
- /**
23
- * Determines the default print threshold based on environment variables
24
- */
25
- getDefaultPrintThreshold() {
26
- // Check if logging is explicitly disabled
27
- const disableLogs = process.env.RUNNER_DISABLE_LOGS;
28
- if (disableLogs === "true" || disableLogs === "1") {
29
- return null;
30
- }
31
- // Check for specific log level override
32
- const logLevel = process.env.RUNNER_LOG_LEVEL;
33
- if (logLevel && this.isValidLogLevel(logLevel)) {
34
- return logLevel;
35
- }
36
- // Default to 'info' level for better developer experience
37
- return "info";
38
- }
39
- /**
40
- * Validates if a string is a valid log level
41
- */
42
- isValidLogLevel(level) {
43
- return Object.keys(Logger.Severity).includes(level);
39
+ detectColorSupport() {
40
+ // Respect NO_COLOR convention
41
+ // eslint-disable-next-line no-undef
42
+ const noColor = typeof process !== "undefined" && !!process.env.NO_COLOR;
43
+ if (noColor)
44
+ return false;
45
+ // eslint-disable-next-line no-undef
46
+ const isTty = typeof process !== "undefined" &&
47
+ !!process.stdout &&
48
+ !!process.stdout.isTTY;
49
+ return isTty;
44
50
  }
45
51
  /**
46
52
  * Creates a new logger instance with additional bound context
47
53
  */
48
- with(context) {
49
- return new Logger(this.eventManager, {
50
- ...this.boundContext,
51
- ...context,
52
- });
53
- }
54
- extractErrorInfo(error) {
55
- return {
56
- name: error.name,
57
- message: error.message,
58
- stack: error.stack,
59
- };
54
+ with({ source, context, }) {
55
+ return new Logger({
56
+ printThreshold: this.printThreshold,
57
+ printStrategy: this.printStrategy,
58
+ bufferLogs: this.bufferLogs,
59
+ useColors: this.useColors,
60
+ }, { ...this.boundContext, ...context }, source);
60
61
  }
61
62
  /**
62
63
  * Core logging method with structured LogInfo
63
64
  */
64
- log(level, message, logInfo = {}) {
65
+ async log(level, message, logInfo = {}) {
65
66
  const { source, error, data, ...context } = logInfo;
66
67
  const log = {
67
68
  level,
68
69
  message,
69
- source: source || this.boundContext.source,
70
+ source: source || this.source,
70
71
  timestamp: new Date(),
71
72
  error: error ? this.extractErrorInfo(error) : undefined,
72
73
  data: data || undefined,
73
74
  context: { ...this.boundContext, ...context },
74
75
  };
75
- if (this.printThreshold &&
76
- Logger.Severity[level] >= Logger.Severity[this.printThreshold]) {
77
- this.print(log);
76
+ if (this.bufferLogs) {
77
+ this.buffer.push(log);
78
+ return;
78
79
  }
79
- if (this.eventManager.hasListeners(globalEvents_1.globalEvents.log)) {
80
- setImmediate(() => {
81
- this.eventManager
82
- .emit(globalEvents_1.globalEvents.log, log, source || this.boundContext.source || "unknown")
83
- .catch((err) => {
84
- console.error("Logger event emission failed:", err);
85
- });
86
- });
80
+ await this.triggerLocalListeners(log);
81
+ if (this.canPrint(level)) {
82
+ this.printer.print(log);
83
+ }
84
+ }
85
+ extractErrorInfo(error) {
86
+ if (error instanceof Error) {
87
+ return {
88
+ name: error.name,
89
+ message: error.message,
90
+ stack: error.stack,
91
+ };
87
92
  }
93
+ return {
94
+ name: "UnknownError",
95
+ message: String(error),
96
+ };
97
+ }
98
+ async info(message, logInfo) {
99
+ await this.log("info", message, logInfo);
100
+ }
101
+ async error(message, logInfo) {
102
+ await this.log("error", message, logInfo);
103
+ }
104
+ async warn(message, logInfo) {
105
+ await this.log("warn", message, logInfo);
106
+ }
107
+ async debug(message, logInfo) {
108
+ await this.log("debug", message, logInfo);
109
+ }
110
+ async trace(message, logInfo) {
111
+ await this.log("trace", message, logInfo);
112
+ }
113
+ async critical(message, logInfo) {
114
+ await this.log("critical", message, logInfo);
88
115
  }
89
116
  /**
90
- * Will print logs after that, use `null` to disable autoprinting.
91
- * @param level
117
+ * Direct print for tests and advanced scenarios. Delegates to LogPrinter.
92
118
  */
93
- setPrintThreshold(level) {
94
- this.printThreshold = level;
95
- }
96
119
  print(log) {
97
- const { level, source, message, timestamp, error, data, context } = log;
98
- // Color codes for different log levels
99
- const colors = {
100
- trace: "\x1b[90m", // bright black/gray
101
- debug: "\x1b[36m", // cyan
102
- info: "\x1b[32m", // green
103
- warn: "\x1b[33m", // yellow
104
- error: "\x1b[31m", // red
105
- critical: "\x1b[35m", // magenta
106
- reset: "\x1b[0m", // reset
107
- bold: "\x1b[1m", // bold
108
- dim: "\x1b[2m", // dim
109
- blue: "\x1b[34m", // blue
110
- red: "\x1b[31m", // red
111
- cyan: "\x1b[36m", // cyan
112
- };
113
- const levelColor = colors[level] || colors.info;
114
- // Format timestamp
115
- const time = timestamp.toLocaleTimeString("en-US", {
116
- hour12: false,
117
- hour: "2-digit",
118
- minute: "2-digit",
119
- second: "2-digit",
120
- });
121
- const ms = timestamp.getMilliseconds().toString().padStart(3, "0");
122
- const formattedTime = `${colors.dim}${time}.${ms}${colors.reset}`;
123
- // Format level with color and padding
124
- const levelStr = `${levelColor}${colors.bold}${level
125
- .toUpperCase()
126
- .padEnd(8)}${colors.reset}`;
127
- // Format source
128
- const sourceStr = source ? `${colors.blue}[${source}]${colors.reset} ` : "";
129
- // Format the main message
130
- let messageStr;
131
- if (typeof message === "object") {
132
- messageStr = JSON.stringify(message, null, 2);
133
- }
134
- else {
135
- messageStr = String(message);
120
+ this.printer.print(log);
121
+ }
122
+ /**
123
+ * @param listener - A listener that will be triggered for every log.
124
+ */
125
+ onLog(listener) {
126
+ this.localListeners.push(listener);
127
+ }
128
+ /**
129
+ * Marks the logger as ready.
130
+ * This is used to trigger the local listeners and print the buffered logs (if they exists)
131
+ * @returns A promise that resolves when the logger is ready.
132
+ */
133
+ async lock() {
134
+ if (this.isLocked) {
135
+ return;
136
136
  }
137
- // Build the main log line
138
- const mainLine = `${formattedTime} ${levelStr} ${sourceStr}${messageStr}`;
139
- // Start building output lines
140
- const lines = [mainLine];
141
- // Add error information if present
142
- if (error) {
143
- lines.push(`${colors.dim}├─ ${colors.red}Error: ${error.name}${colors.reset}`);
144
- lines.push(`${colors.dim}├─ ${colors.red}${error.message}${colors.reset}`);
145
- if (error.stack) {
146
- const stackLines = error.stack.split("\n").slice(1, 4); // Show first 3 stack frames
147
- stackLines.forEach((line, index) => {
148
- const prefix = index === stackLines.length - 1 ? "└─" : "├─";
149
- lines.push(`${colors.dim}${prefix} ${colors.red}${line.trim()}${colors.reset}`);
150
- });
137
+ if (this.bufferLogs) {
138
+ for (const log of this.buffer) {
139
+ await this.triggerLocalListeners(log);
140
+ }
141
+ for (const log of this.buffer) {
142
+ if (this.canPrint(log.level)) {
143
+ this.printer.print(log);
144
+ }
151
145
  }
152
146
  }
153
- // Add structured data if present
154
- if (data && Object.keys(data).length > 0) {
155
- lines.push(`${colors.dim}├─ ${colors.cyan}Data:${colors.reset}`);
156
- const dataStr = JSON.stringify(data, null, 2);
157
- const dataLines = dataStr.split("\n");
158
- dataLines.forEach((line, index) => {
159
- const prefix = index === dataLines.length - 1 ? "└─" : "├─";
160
- lines.push(`${colors.dim}${prefix} ${colors.cyan}${line}${colors.reset}`);
161
- });
162
- }
163
- // Add context if present (excluding common context we already show)
164
- const filteredContext = context ? { ...context } : {};
165
- delete filteredContext.source; // Already shown in source
166
- if (filteredContext && Object.keys(filteredContext).length > 0) {
167
- lines.push(`${colors.dim}└─ ${colors.blue}Context:${colors.reset}`);
168
- const contextStr = JSON.stringify(filteredContext, null, 2);
169
- const contextLines = contextStr.split("\n");
170
- contextLines.forEach((line, index) => {
171
- const prefix = index === contextLines.length - 1 ? " " : " ";
172
- lines.push(`${colors.dim}${prefix} ${colors.blue}${line}${colors.reset}`);
173
- });
174
- }
175
- // Output all lines
176
- lines.forEach((line) => console.log(line));
177
- // Add a subtle separator for multi-line logs
178
- if (lines.length > 1) {
179
- console.log(`${colors.dim}${colors.reset}`);
180
- }
181
- }
182
- info(message, logInfo = {}) {
183
- this.log("info", message, logInfo);
184
- }
185
- error(message, logInfo = {}) {
186
- this.log("error", message, logInfo);
187
- }
188
- warn(message, logInfo = {}) {
189
- this.log("warn", message, logInfo);
147
+ this.bufferLogs = false;
148
+ this.buffer = [];
149
+ this.isLocked = true;
190
150
  }
191
- debug(message, logInfo = {}) {
192
- this.log("debug", message, logInfo);
193
- }
194
- trace(message, logInfo = {}) {
195
- this.log("trace", message, logInfo);
151
+ canPrint(level) {
152
+ if (this.printThreshold === null) {
153
+ return false;
154
+ }
155
+ return (this.printThreshold &&
156
+ Logger.Severity[level] >= Logger.Severity[this.printThreshold]);
196
157
  }
197
- critical(message, logInfo = {}) {
198
- this.log("critical", message, logInfo);
158
+ async triggerLocalListeners(log) {
159
+ for (const listener of this.localListeners) {
160
+ try {
161
+ await listener(log);
162
+ }
163
+ catch (error) {
164
+ this.print({
165
+ level: "error",
166
+ message: "Error in log listener",
167
+ timestamp: new Date(),
168
+ error: {
169
+ name: "ListenerError",
170
+ message: error instanceof Error ? error.message : String(error),
171
+ },
172
+ });
173
+ // We're not breaking the app due to logListener errors.
174
+ continue;
175
+ }
176
+ }
199
177
  }
200
178
  }
201
179
  exports.Logger = Logger;