@mks2508/better-logger 5.0.1 → 5.0.2

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 (310) hide show
  1. package/dist/Logger.d.ts +976 -0
  2. package/dist/Logger.d.ts.map +1 -0
  3. package/dist/ScopedLogger.d.ts +74 -0
  4. package/dist/ScopedLogger.d.ts.map +1 -0
  5. package/dist/chunks/Logger-CKqzXDh3.js +2 -0
  6. package/dist/chunks/Logger-CKqzXDh3.js.map +1 -0
  7. package/dist/chunks/Logger-D_vuKP4l.js +4511 -0
  8. package/dist/chunks/Logger-D_vuKP4l.js.map +1 -0
  9. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
  10. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
  11. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
  12. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
  13. package/dist/chunks/cli-module-B-njrTWb.js +2 -0
  14. package/dist/chunks/cli-module-B-njrTWb.js.map +1 -0
  15. package/dist/chunks/cli-module-Cx7qotPY.js +390 -0
  16. package/dist/chunks/cli-module-Cx7qotPY.js.map +1 -0
  17. package/dist/chunks/color-converter-CCSQRztd.js +2 -0
  18. package/dist/chunks/color-converter-CCSQRztd.js.map +1 -0
  19. package/dist/chunks/color-converter-_Xdmsy7E.js +462 -0
  20. package/dist/chunks/color-converter-_Xdmsy7E.js.map +1 -0
  21. package/dist/chunks/environment-C1xxvc8l.js +1127 -0
  22. package/dist/chunks/environment-C1xxvc8l.js.map +1 -0
  23. package/dist/chunks/environment-Cprkw3g9.js +4 -0
  24. package/dist/chunks/environment-Cprkw3g9.js.map +1 -0
  25. package/dist/chunks/formatting-DMJxYq9o.js +380 -0
  26. package/dist/chunks/formatting-DMJxYq9o.js.map +1 -0
  27. package/dist/chunks/formatting-DpKxCsXq.js +2 -0
  28. package/dist/chunks/formatting-DpKxCsXq.js.map +1 -0
  29. package/dist/cli/CommandProcessor.d.ts +100 -0
  30. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  31. package/dist/cli/commands/ConfigCommand.d.ts +14 -0
  32. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  33. package/dist/cli/commands/ExportCommand.d.ts +48 -0
  34. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  35. package/dist/cli/commands/HistoryCommand.d.ts +47 -0
  36. package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
  37. package/dist/cli/commands/StatusCommand.d.ts +30 -0
  38. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  39. package/dist/cli/commands/ThemeCommand.d.ts +30 -0
  40. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  41. package/dist/cli/help.d.ts +12 -0
  42. package/dist/cli/help.d.ts.map +1 -0
  43. package/dist/cli/index.d.ts +15 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/{src/cli-module.ts → dist/cli-module.d.ts} +2 -8
  46. package/dist/cli-module.d.ts.map +1 -0
  47. package/dist/cli-primitives/box.d.ts +11 -0
  48. package/dist/cli-primitives/box.d.ts.map +1 -0
  49. package/dist/cli-primitives/cli-table.d.ts +11 -0
  50. package/dist/cli-primitives/cli-table.d.ts.map +1 -0
  51. package/dist/cli-primitives/divider.d.ts +11 -0
  52. package/dist/cli-primitives/divider.d.ts.map +1 -0
  53. package/dist/cli-primitives/header.d.ts +12 -0
  54. package/dist/cli-primitives/header.d.ts.map +1 -0
  55. package/{src/cli-primitives/index.ts → dist/cli-primitives/index.d.ts} +1 -1
  56. package/dist/cli-primitives/index.d.ts.map +1 -0
  57. package/dist/cli-primitives/server-fallback.d.ts +25 -0
  58. package/dist/cli-primitives/server-fallback.d.ts.map +1 -0
  59. package/dist/cli-primitives/spinner.d.ts +47 -0
  60. package/dist/cli-primitives/spinner.d.ts.map +1 -0
  61. package/dist/cli-primitives/step.d.ts +11 -0
  62. package/dist/cli-primitives/step.d.ts.map +1 -0
  63. package/dist/cli.cjs +2 -0
  64. package/dist/cli.cjs.map +1 -0
  65. package/dist/cli.js +12 -0
  66. package/dist/cli.js.map +1 -0
  67. package/dist/constants.d.ts +235 -0
  68. package/dist/constants.d.ts.map +1 -0
  69. package/dist/core.cjs +2 -0
  70. package/dist/core.cjs.map +1 -0
  71. package/dist/core.d.ts +127 -0
  72. package/dist/core.d.ts.map +1 -0
  73. package/dist/core.js +291 -0
  74. package/dist/core.js.map +1 -0
  75. package/dist/example.d.ts +18 -0
  76. package/dist/example.d.ts.map +1 -0
  77. package/dist/exports-module.d.ts +196 -0
  78. package/dist/exports-module.d.ts.map +1 -0
  79. package/dist/exports.cjs +2 -0
  80. package/dist/exports.cjs.map +1 -0
  81. package/dist/exports.js +238 -0
  82. package/dist/exports.js.map +1 -0
  83. package/dist/handlers/AnalyticsLogHandler.d.ts +8 -0
  84. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  85. package/dist/handlers/ExportLogHandler.d.ts +100 -0
  86. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  87. package/dist/handlers/FileLogHandler.d.ts +33 -0
  88. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  89. package/dist/handlers/RemoteLogHandler.d.ts +11 -0
  90. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  91. package/{src/handlers/index.ts → dist/handlers/index.d.ts} +2 -2
  92. package/dist/handlers/index.d.ts.map +1 -0
  93. package/dist/hooks/HookManager.d.ts +21 -0
  94. package/dist/hooks/HookManager.d.ts.map +1 -0
  95. package/{src/hooks/index.ts → dist/hooks/index.d.ts} +1 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/index.cjs +2 -0
  98. package/dist/index.cjs.map +1 -0
  99. package/dist/index.d.ts +161 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +627 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/main.d.ts +2 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/serializers/SerializerRegistry.d.ts +16 -0
  106. package/dist/serializers/SerializerRegistry.d.ts.map +1 -0
  107. package/{src/serializers/index.ts → dist/serializers/index.d.ts} +1 -0
  108. package/dist/serializers/index.d.ts.map +1 -0
  109. package/dist/styling/LogStyleBuilder.d.ts +146 -0
  110. package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
  111. package/dist/styling/SemanticStyles.d.ts +178 -0
  112. package/dist/styling/SemanticStyles.d.ts.map +1 -0
  113. package/dist/styling/SmartPresets.d.ts +22 -0
  114. package/dist/styling/SmartPresets.d.ts.map +1 -0
  115. package/dist/styling/StyleBuilder.d.ts +140 -0
  116. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  117. package/dist/styling/StyleCache.d.ts +42 -0
  118. package/dist/styling/StyleCache.d.ts.map +1 -0
  119. package/dist/styling/banners.d.ts +42 -0
  120. package/dist/styling/banners.d.ts.map +1 -0
  121. package/dist/styling/index.d.ts +10 -0
  122. package/dist/styling/index.d.ts.map +1 -0
  123. package/dist/styling/themes.d.ts +7 -0
  124. package/dist/styling/themes.d.ts.map +1 -0
  125. package/dist/styling-module.d.ts +178 -0
  126. package/dist/styling-module.d.ts.map +1 -0
  127. package/dist/styling.cjs +2 -0
  128. package/dist/styling.cjs.map +1 -0
  129. package/dist/styling.js +146 -0
  130. package/dist/styling.js.map +1 -0
  131. package/dist/terminal/color-converter.d.ts +73 -0
  132. package/dist/terminal/color-converter.d.ts.map +1 -0
  133. package/dist/terminal/formatter.d.ts +20 -0
  134. package/dist/terminal/formatter.d.ts.map +1 -0
  135. package/dist/terminal/terminal-renderer.d.ts +77 -0
  136. package/dist/terminal/terminal-renderer.d.ts.map +1 -0
  137. package/dist/transports/ConsoleTransport.d.ts +9 -0
  138. package/dist/transports/ConsoleTransport.d.ts.map +1 -0
  139. package/dist/transports/FileTransport.d.ts +15 -0
  140. package/dist/transports/FileTransport.d.ts.map +1 -0
  141. package/dist/transports/HttpTransport.d.ts +16 -0
  142. package/dist/transports/HttpTransport.d.ts.map +1 -0
  143. package/dist/transports/TransportManager.d.ts +14 -0
  144. package/dist/transports/TransportManager.d.ts.map +1 -0
  145. package/{src/transports/index.ts → dist/transports/index.d.ts} +1 -0
  146. package/dist/transports/index.d.ts.map +1 -0
  147. package/{src/types/core.ts → dist/types/core.d.ts} +25 -62
  148. package/dist/types/core.d.ts.map +1 -0
  149. package/{src/types/handlers.ts → dist/types/handlers.d.ts} +5 -15
  150. package/dist/types/handlers.d.ts.map +1 -0
  151. package/{src/types/hooks.ts → dist/types/hooks.d.ts} +3 -12
  152. package/dist/types/hooks.d.ts.map +1 -0
  153. package/dist/types/index.d.ts +11 -0
  154. package/dist/types/index.d.ts.map +1 -0
  155. package/{src/types/serializers.ts → dist/types/serializers.d.ts} +1 -6
  156. package/dist/types/serializers.d.ts.map +1 -0
  157. package/{src/types/transports.ts → dist/types/transports.d.ts} +2 -7
  158. package/dist/types/transports.d.ts.map +1 -0
  159. package/dist/utils/adapter.d.ts +48 -0
  160. package/dist/utils/adapter.d.ts.map +1 -0
  161. package/dist/utils/ansi-colors.d.ts +156 -0
  162. package/dist/utils/ansi-colors.d.ts.map +1 -0
  163. package/dist/utils/environment-detector.d.ts +45 -0
  164. package/dist/utils/environment-detector.d.ts.map +1 -0
  165. package/dist/utils/environment.d.ts +47 -0
  166. package/dist/utils/environment.d.ts.map +1 -0
  167. package/dist/utils/formatting.d.ts +58 -0
  168. package/dist/utils/formatting.d.ts.map +1 -0
  169. package/dist/utils/index.d.ts +8 -0
  170. package/dist/utils/index.d.ts.map +1 -0
  171. package/dist/utils/opentui-detection.d.ts +34 -0
  172. package/dist/utils/opentui-detection.d.ts.map +1 -0
  173. package/dist/utils/output.d.ts +46 -0
  174. package/dist/utils/output.d.ts.map +1 -0
  175. package/dist/utils/stackTrace.d.ts +6 -0
  176. package/dist/utils/stackTrace.d.ts.map +1 -0
  177. package/dist/utils/timestamps.d.ts +20 -0
  178. package/dist/utils/timestamps.d.ts.map +1 -0
  179. package/{src/writers/BufferWriter.ts → dist/writers/BufferWriter.d.ts} +16 -77
  180. package/dist/writers/BufferWriter.d.ts.map +1 -0
  181. package/{src/writers/index.ts → dist/writers/index.d.ts} +1 -1
  182. package/dist/writers/index.d.ts.map +1 -0
  183. package/package.json +5 -1
  184. package/.claude/settings.local.json +0 -48
  185. package/.github/workflows/ci-quality.yml +0 -357
  186. package/.github/workflows/docs-demo.yml +0 -119
  187. package/.github/workflows/releases-core.yml +0 -512
  188. package/.github/workflows/releases-full.yml +0 -582
  189. package/.github/workflows-backup/ci.yml +0 -221
  190. package/.github/workflows-backup/nightly.yml +0 -196
  191. package/.github/workflows-backup/release-optimized.yml +0 -373
  192. package/.github/workflows-backup/release.yml +0 -269
  193. package/.release-notes-0.2.0.md +0 -129
  194. package/.yamllint +0 -28
  195. package/CHANGELOG.json +0 -1120
  196. package/CHANGELOG.md +0 -209
  197. package/CLAUDE.md +0 -217
  198. package/demo.html +0 -847
  199. package/docs/API.md +0 -918
  200. package/docs/CORE.md +0 -264
  201. package/docs/DEVELOPMENT.md +0 -731
  202. package/docs/EXPORTS.md +0 -467
  203. package/docs/PACKAGES.md +0 -244
  204. package/docs/STYLING.md +0 -405
  205. package/docs/_config.yml +0 -36
  206. package/docs/index.md +0 -179
  207. package/examples/README.md +0 -208
  208. package/examples/basic-logging.js +0 -75
  209. package/examples/data-export.js +0 -234
  210. package/examples/package.json +0 -16
  211. package/examples/performance-timing.js +0 -170
  212. package/examples/simplified-api.js +0 -124
  213. package/examples/styling-themes.js +0 -207
  214. package/index.html +0 -358
  215. package/packages/core/package.json +0 -57
  216. package/packages/exports/package.json +0 -41
  217. package/packages/nodejs-opentui/README.md +0 -232
  218. package/packages/nodejs-opentui/package.json +0 -72
  219. package/packages/nodejs-opentui/src/LogRenderer.ts +0 -171
  220. package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +0 -178
  221. package/packages/nodejs-opentui/src/components/LogBadge.tsx +0 -131
  222. package/packages/nodejs-opentui/src/index.ts +0 -133
  223. package/packages/nodejs-opentui/src/types.ts +0 -158
  224. package/packages/nodejs-opentui/tsconfig.json +0 -20
  225. package/packages/styling/package.json +0 -41
  226. package/playground/demo-all.ts +0 -95
  227. package/playground/demo-box.ts +0 -85
  228. package/playground/demo-levels.ts +0 -56
  229. package/playground/demo-real-world.ts +0 -98
  230. package/playground/demo-spinner.ts +0 -77
  231. package/playground/demo-steps.ts +0 -72
  232. package/playground/demo-table.ts +0 -83
  233. package/project-utils/README.md +0 -172
  234. package/project-utils/auto-release-gemini.ts +0 -1193
  235. package/project-utils/auto-release-ui.ts +0 -1329
  236. package/project-utils/commit-generator.ts +0 -1385
  237. package/project-utils/commit-ui.ts +0 -264
  238. package/project-utils/git-utils.ts +0 -199
  239. package/project-utils/github-release-manager.ts +0 -466
  240. package/project-utils/project-config.ts +0 -260
  241. package/project-utils/prompt-templates.js +0 -345
  242. package/project-utils/prompt-templates.ts +0 -422
  243. package/project-utils/version-manager.ts +0 -1078
  244. package/src/Logger.ts +0 -1858
  245. package/src/ScopedLogger.ts +0 -256
  246. package/src/cli/CommandProcessor.ts +0 -248
  247. package/src/cli/commands/ConfigCommand.ts +0 -93
  248. package/src/cli/commands/ExportCommand.ts +0 -276
  249. package/src/cli/commands/HistoryCommand.ts +0 -117
  250. package/src/cli/commands/StatusCommand.ts +0 -112
  251. package/src/cli/commands/ThemeCommand.ts +0 -88
  252. package/src/cli/help.ts +0 -127
  253. package/src/cli/index.ts +0 -71
  254. package/src/cli-primitives/box.ts +0 -86
  255. package/src/cli-primitives/cli-table.ts +0 -62
  256. package/src/cli-primitives/divider.ts +0 -17
  257. package/src/cli-primitives/header.ts +0 -18
  258. package/src/cli-primitives/server-fallback.ts +0 -54
  259. package/src/cli-primitives/spinner.ts +0 -133
  260. package/src/cli-primitives/step.ts +0 -22
  261. package/src/constants.ts +0 -313
  262. package/src/core.ts +0 -397
  263. package/src/example.ts +0 -210
  264. package/src/exports-module.ts +0 -311
  265. package/src/handlers/AnalyticsLogHandler.ts +0 -22
  266. package/src/handlers/ExportLogHandler.ts +0 -610
  267. package/src/handlers/FileLogHandler.ts +0 -169
  268. package/src/handlers/RemoteLogHandler.ts +0 -42
  269. package/src/hooks/HookManager.ts +0 -177
  270. package/src/index.ts +0 -395
  271. package/src/main.ts +0 -196
  272. package/src/serializers/SerializerRegistry.ts +0 -173
  273. package/src/style.css +0 -96
  274. package/src/styling/LogStyleBuilder.ts +0 -355
  275. package/src/styling/SemanticStyles.ts +0 -380
  276. package/src/styling/SmartPresets.ts +0 -288
  277. package/src/styling/StyleBuilder.ts +0 -319
  278. package/src/styling/StyleCache.ts +0 -131
  279. package/src/styling/banners.ts +0 -168
  280. package/src/styling/index.ts +0 -27
  281. package/src/styling/themes.ts +0 -235
  282. package/src/styling-module.ts +0 -244
  283. package/src/terminal/color-converter.ts +0 -315
  284. package/src/terminal/formatter.ts +0 -242
  285. package/src/terminal/terminal-renderer.ts +0 -342
  286. package/src/transports/ConsoleTransport.ts +0 -28
  287. package/src/transports/FileTransport.ts +0 -53
  288. package/src/transports/HttpTransport.ts +0 -56
  289. package/src/transports/TransportManager.ts +0 -130
  290. package/src/types/index.ts +0 -83
  291. package/src/typescript.svg +0 -1
  292. package/src/utils/adapter.ts +0 -291
  293. package/src/utils/ansi-colors.ts +0 -333
  294. package/src/utils/environment-detector.ts +0 -170
  295. package/src/utils/environment.ts +0 -94
  296. package/src/utils/formatting.ts +0 -332
  297. package/src/utils/index.ts +0 -33
  298. package/src/utils/opentui-detection.ts +0 -138
  299. package/src/utils/output.ts +0 -227
  300. package/src/utils/stackTrace.ts +0 -144
  301. package/src/utils/timestamps.ts +0 -80
  302. package/src/vite-env.d.ts +0 -1
  303. package/test-core-browser.html +0 -237
  304. package/test-core-node.js +0 -63
  305. package/tests/test-conflict-resolution.ts +0 -391
  306. package/tests/validate-workflows.sh +0 -131
  307. package/tests/yaml-autofix.sh +0 -146
  308. package/tsconfig.json +0 -50
  309. package/vite.config.ts +0 -256
  310. /package/{public → dist}/vite.svg +0 -0
@@ -0,0 +1,33 @@
1
+ class RemoteLogHandler {
2
+ endpoint;
3
+ apiKey;
4
+ constructor(endpoint, apiKey) {
5
+ this.endpoint = endpoint;
6
+ this.apiKey = apiKey;
7
+ }
8
+ async handle(level, message, args, metadata) {
9
+ try {
10
+ const payload = {
11
+ timestamp: metadata.timestamp,
12
+ level,
13
+ message,
14
+ prefix: metadata.prefix,
15
+ location: metadata.stackInfo,
16
+ additional: args.slice(1)
17
+ };
18
+ await fetch(this.endpoint, {
19
+ method: "POST",
20
+ headers: {
21
+ "Content-Type": "application/json",
22
+ ...this.apiKey && { "Authorization": `Bearer ${this.apiKey}` }
23
+ },
24
+ body: JSON.stringify(payload)
25
+ });
26
+ } catch (error) {
27
+ }
28
+ }
29
+ }
30
+ export {
31
+ RemoteLogHandler as R
32
+ };
33
+ //# sourceMappingURL=RemoteLogHandler-CjWpWZGl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteLogHandler-CjWpWZGl.js","sources":["../../src/handlers/RemoteLogHandler.ts"],"sourcesContent":["/**\n * @fileoverview Remote log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\n\n/**\n * Remote log handler for sending logs to external services\n */\nexport class RemoteLogHandler implements ILogHandler {\n private endpoint: string;\n private apiKey?: string;\n\n constructor(endpoint: string, apiKey?: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n async handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): Promise<void> {\n try {\n const payload = {\n timestamp: metadata.timestamp,\n level,\n message,\n prefix: metadata.prefix,\n location: metadata.stackInfo,\n additional: args.slice(1),\n };\n\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { 'Authorization': `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify(payload),\n });\n } catch (error) {\n // Silently fail to avoid infinite logging loops\n }\n }\n}"],"names":[],"mappings":"AASO,MAAM,iBAAwC;AAAA,EACzC;AAAA,EACA;AAAA,EAER,YAAY,UAAkB,QAAiB;AAC3C,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,OAAiB,SAAiB,MAAa,UAAsC;AAC9F,QAAI;AACA,YAAM,UAAU;AAAA,QACZ,WAAW,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,YAAY,KAAK,MAAM,CAAC;AAAA,MAAA;AAG5B,YAAM,MAAM,KAAK,UAAU;AAAA,QACvB,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,GAAI,KAAK,UAAU,EAAE,iBAAiB,UAAU,KAAK,MAAM,GAAA;AAAA,QAAG;AAAA,QAElE,MAAM,KAAK,UAAU,OAAO;AAAA,MAAA,CAC/B;AAAA,IACL,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";exports.RemoteLogHandler=class{endpoint;apiKey;constructor(t,e){this.endpoint=t,this.apiKey=e}async handle(t,e,i,a){try{const s={timestamp:a.timestamp,level:t,message:e,prefix:a.prefix,location:a.stackInfo,additional:i.slice(1)};await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json",...this.apiKey&&{Authorization:`Bearer ${this.apiKey}`}},body:JSON.stringify(s)})}catch(s){}}};
2
+ //# sourceMappingURL=RemoteLogHandler-ymkQ97xl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteLogHandler-ymkQ97xl.js","sources":["../../src/handlers/RemoteLogHandler.ts"],"sourcesContent":["/**\n * @fileoverview Remote log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\n\n/**\n * Remote log handler for sending logs to external services\n */\nexport class RemoteLogHandler implements ILogHandler {\n private endpoint: string;\n private apiKey?: string;\n\n constructor(endpoint: string, apiKey?: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n async handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): Promise<void> {\n try {\n const payload = {\n timestamp: metadata.timestamp,\n level,\n message,\n prefix: metadata.prefix,\n location: metadata.stackInfo,\n additional: args.slice(1),\n };\n\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { 'Authorization': `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify(payload),\n });\n } catch (error) {\n // Silently fail to avoid infinite logging loops\n }\n }\n}"],"names":["endpoint","apiKey","constructor","this","handle","level","message","args","metadata","payload","timestamp","prefix","location","stackInfo","additional","slice","fetch","method","headers","Authorization","body","JSON","stringify","error"],"mappings":"sCASO,MACKA,SACAC,OAER,WAAAC,CAAYF,EAAkBC,GAC1BE,KAAKH,SAAWA,EAChBG,KAAKF,OAASA,CAClB,CAEA,YAAMG,CAAOC,EAAiBC,EAAiBC,EAAaC,GACxD,IACI,MAAMC,EAAU,CACZC,UAAWF,EAASE,UACpBL,QACAC,UACAK,OAAQH,EAASG,OACjBC,SAAUJ,EAASK,UACnBC,WAAYP,EAAKQ,MAAM,UAGrBC,MAAMb,KAAKH,SAAU,CACvBiB,OAAQ,OACRC,QAAS,CACL,eAAgB,sBACZf,KAAKF,QAAU,CAAEkB,cAAiB,UAAUhB,KAAKF,WAEzDmB,KAAMC,KAAKC,UAAUb,IAE7B,OAASc,GAET,CACJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("./color-converter-CCSQRztd.js");function stripAnsi(e){return e.replace(/\x1b\[[0-9;]*m/g,"")}function getVisibleLength(e){return stripAnsi(e).length}function padToWidth(e,t,r="left"){const n=getVisibleLength(e);if(n>=t)return e;const o=t-n;switch(r){case"right":return" ".repeat(o)+e;case"center":const t=Math.floor(o/2),r=o-t;return" ".repeat(t)+e+" ".repeat(r);default:return e+" ".repeat(o)}}function formatWithRightAlign(t,r,n){const o=(n??e.getTerminalWidth())-getVisibleLength(t)-getVisibleLength(r);return o<=1?`${t} ${r}`:`${t}${" ".repeat(o)}${r}`}let t=null;function formatRelativeTime(e){null===t&&(t=Date.now());const r=e.getTime()-t;return r<1e3?`+${r}ms`:r<6e4?`+${(r/1e3).toFixed(1)}s`:`+${Math.floor(r/6e4)}m${Math.floor(r%6e4/1e3)}s`}function formatElapsedTime(e){null===t&&(t=Date.now());const r=e.getTime()-t,n=Math.floor(r/36e5),o=Math.floor(r%36e5/6e4),i=Math.floor(r%6e4/1e3);return`${String(n).padStart(2,"0")}:${String(o).padStart(2,"0")}:${String(i).padStart(2,"0")}`}const r={single:{tl:"┌",tr:"┐",bl:"└",br:"┘",h:"─",v:"│"},rounded:{tl:"╭",tr:"╮",bl:"╰",br:"╯",h:"─",v:"│"},double:{tl:"╔",tr:"╗",bl:"╚",br:"╝",h:"═",v:"║"},bold:{tl:"┏",tr:"┓",bl:"┗",br:"┛",h:"━",v:"┃"}},n=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];exports.NoopSpinner=class{message;_logger;constructor(e,t){this.message=e,this._logger=t}start(){this._logger.info(this.message)}stop(){}succeed(e){this._logger.success(e??this.message)}fail(e){this._logger.error(e??this.message)}text(e){this.message=e}},exports.ServerFallback=class{logger;constructor(e){this.logger=e}step(e,t,r){this.logger.info(`[${e}/${t}] ${r}`)}header(e,t){const r=t?`${e} ${t}`:e;this.logger.info(r)}divider(){}blank(){}box(e,t){this.logger.info(e)}cliTable(e,t){for(const r of e)this.logger.info(JSON.stringify(r))}},exports.SpinnerManager=class{message;frameIndex=0;interval=null;_logger;constructor(e,t,r){this.message=e,this._logger=r}start(){this.interval||(this._logger.updateConfig({outputMode:"silent"}),this.frameIndex=0,this.render(),this.interval=setInterval(()=>{this.frameIndex=(this.frameIndex+1)%n.length,this.render()},80))}stop(){this.clearInterval(),this.clearLine(),this._logger.updateConfig({outputMode:"console"})}succeed(t){this.clearInterval(),this.clearLine();const r=t??this.message;process.stderr.write(` ${e.ANSI.fg.green}✓${e.ANSI.reset} ${r}\n`),this._logger.updateConfig({outputMode:"console"})}fail(t){this.clearInterval(),this.clearLine();const r=t??this.message;process.stderr.write(` ${e.ANSI.fg.red}✗${e.ANSI.reset} ${r}\n`),this._logger.updateConfig({outputMode:"console"})}text(e){this.message=e}render(){const t=n[this.frameIndex]??n[0],r=` ${e.ANSI.fg.cyan}${t}${e.ANSI.reset} ${this.message}`;process.stderr.write(`\r${r}`)}clearLine(){process.stderr.write("\r")}clearInterval(){this.interval&&(clearInterval(this.interval),this.interval=null)}},exports.applyLogOptions=function(e,t,r="full"){let n=e;return t.rightAlign&&(n=formatWithRightAlign(e,t.rightAlign)),n},exports.formatBadge=function(t,r="brackets",n="full",o){const i="none"!==n?e.ANSI.reset:"",s=t.toUpperCase();switch(r){case"rounded":const t=o&&"none"!==n?e.getANSIForeground(o,n):"";return`${"none"!==n?e.ANSI.bg.black:""}${t}⟨${s}⟩${i}`;case"plain":return`${o&&"none"!==n?e.getANSIForeground(o,n):""}${s}${i}`;case"unicode":const r=o&&"none"!==n?e.getANSIForeground(o,n):"";return`${"none"!==n?e.ANSI.bg.black:""}${r}╭${s}╮${i}`;case"pill":return`${o&&"none"!==n?e.getANSIBackground(o,n):""}${"none"!==n?e.getANSIForeground("#000000",n):""}[${s}]${i}`;default:const a=o&&"none"!==n?e.getANSIForeground(o,n):"";return`${"none"!==n?e.ANSI.bg.black:""}${a}[${s}]${i}`}},exports.formatColumns=function(t,r,n="full"){const o=r??e.getTerminalWidth();return t.length,t.map((e,r)=>{if(e.width)return{...e,calculatedWidth:e.width};const n=o-t.filter((e,t)=>t!==r&&e.width).reduce((e,t)=>e+(t.width??0),0),i=t.filter(e=>!e.width).length,s=Math.floor(n/i);return{...e,calculatedWidth:s}}).map(t=>{let r=t.content;return t.color&&"none"!==n&&(r=`${e.getANSIForeground(t.color,n)}${r}${e.ANSI.reset}`),padToWidth(r,t.calculatedWidth,t.align)}).join("")},exports.formatElapsedTime=formatElapsedTime,exports.formatKeyValue=function(t,r="full",n={}){const{separator:o=" ",keyColor:i="#888888",valueColor:s="#00ffff"}=n,a=Object.entries(t);if(0===a.length)return"";const l="none"!==r?e.getANSIForeground(i,r):"",g="none"!==r?e.getANSIForeground(s,r):"",c="none"!==r?e.ANSI.reset:"";return a.map(([e,t])=>{const r="object"==typeof t?JSON.stringify(t):String(t);return`${l}${e}:${c} ${g}${r}${c}`}).join(o)},exports.formatRelativeTime=formatRelativeTime,exports.formatTimestamp=function(e=/* @__PURE__ */new Date,t="time"){switch(t){case"iso":return e.toISOString();case"date":return e.toISOString().split("T")[0]??"";case"time":return e.toTimeString().slice(0,8);case"timeMs":return e.toTimeString().slice(0,8)+"."+String(e.getMilliseconds()).padStart(3,"0");case"relative":return formatRelativeTime(e);case"elapsed":return formatElapsedTime(e);default:return e.toLocaleTimeString()}},exports.formatWithRightAlign=formatWithRightAlign,exports.getVisibleLength=getVisibleLength,exports.isKeyValueObject=function(e){if("object"!=typeof e||null===e)return!1;if(Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return(t===Object.prototype||null===t)&&Object.values(e).every(e=>"string"==typeof e||"number"==typeof e||"boolean"==typeof e||null===e)},exports.padToWidth=padToWidth,exports.renderBox=function(t,n={},o="full"){const{title:i,borderColor:s,borderStyle:a="rounded",padding:l=0}=n,g=r[a]??r.rounded,c=t.split("\n"),u=Math.min(e.getTerminalWidth()-4,80),h=c.map(e=>getVisibleLength(e)),d=i?stripAnsi(i).length+2:0,p=Math.max(...h,d),f=Math.min(p+2,u),$=s&&"none"!==o?e.getANSIForeground(s,o):"",m=$?e.ANSI.reset:"",wrap=e=>`${$}${e}${m}`;let S;if(i){const e=` ${i} `,t=f-stripAnsi(e).length;S=` ${wrap(g.tl)}${wrap(g.h)}${wrap(e)}${wrap(g.h.repeat(Math.max(0,t-1)))}${wrap(g.tr)}`}else S=` ${wrap(g.tl)}${wrap(g.h.repeat(f))}${wrap(g.tr)}`;const b=` ${wrap(g.bl)}${wrap(g.h.repeat(f))}${wrap(g.br)}`,A=` ${wrap(g.v)}${" ".repeat(f)}${wrap(g.v)}`,I=l>0?Array(l).fill(A):[],N=c.map(e=>{const t=getVisibleLength(e),r=f-t-1;return` ${wrap(g.v)} ${e}${" ".repeat(Math.max(0,r))}${wrap(g.v)}`});return[S,...I,...N,...I,b].join("\n")},exports.renderDivider=function(t){const r=t??Math.min(e.getTerminalWidth()-4,60);return e.ANSI.dim+" "+"─".repeat(r)+e.ANSI.reset},exports.renderHeader=function(t,r){return` ${e.ANSI.bold+t+e.ANSI.reset}${r?e.ANSI.dim+` ${r}`+e.ANSI.reset:""}`},exports.renderStep=function(t,r,n,o){const i=`[${t}/${r}]`;return` ${"none"!==o?e.getANSIForeground("#00bcd4",o)+e.ANSI.bold+i+e.ANSI.reset:i} ${n}`},exports.renderTable=function(t,r={},n="full"){if(0===t.length)return"";const o=r.columns??Object.keys(t[0]),i=r.head??o,s=o.map((e,r)=>{const n=getVisibleLength(i[r]??e),o=t.reduce((t,r)=>{const n=String(r[e]??"");return Math.max(t,getVisibleLength(n))},0);return Math.max(n,o)+2}),a="none"!==n?e.getANSIForeground("#00bcd4",n):"",l="none"!==n?e.ANSI.dim:"",g="none"!==n?e.ANSI.reset:"";return[" "+o.map((t,r)=>{const n=i[r]??t;return a+e.ANSI.bold+padToWidth(` ${n}`,s[r])+g}).join("")," "+l+s.map(e=>"─".repeat(e)).join("─")+g,...t.map(e=>" "+o.map((t,r)=>padToWidth(` ${String(e[t]??"")}`,s[r])).join(""))].join("\n")},exports.resetStartTime=function(){t=Date.now()},exports.stripAnsi=stripAnsi;
2
+ //# sourceMappingURL=cli-module-B-njrTWb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module-B-njrTWb.js","sources":["../../src/terminal/formatter.ts","../../src/cli-primitives/box.ts","../../src/cli-primitives/spinner.ts","../../src/cli-primitives/server-fallback.ts","../../src/cli-primitives/divider.ts","../../src/cli-primitives/header.ts","../../src/cli-primitives/step.ts","../../src/cli-primitives/cli-table.ts"],"sourcesContent":["/**\n * Terminal Formatter - Alignment, key-value, and advanced terminal formatting\n */\n\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { getANSIForeground, getANSIBackground, ANSI, type ColorCapability } from './color-converter.js';\nimport type { ColumnConfig, ColumnAlign, BadgeStyle, TimestampFormat, LogOptions } from '../types/index.js';\n\nexport function stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nexport function getVisibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nexport function padToWidth(str: string, width: number, align: ColumnAlign = 'left'): string {\n const visibleLen = getVisibleLength(str);\n if (visibleLen >= width) return str;\n\n const padding = width - visibleLen;\n\n switch (align) {\n case 'right':\n return ' '.repeat(padding) + str;\n case 'center':\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n case 'left':\n default:\n return str + ' '.repeat(padding);\n }\n}\n\nexport function formatWithRightAlign(\n leftContent: string,\n rightContent: string,\n maxWidth?: number\n): string {\n const width = maxWidth ?? getTerminalWidth();\n const leftLen = getVisibleLength(leftContent);\n const rightLen = getVisibleLength(rightContent);\n\n const gap = width - leftLen - rightLen;\n if (gap <= 1) {\n return `${leftContent} ${rightContent}`;\n }\n\n return `${leftContent}${' '.repeat(gap)}${rightContent}`;\n}\n\nexport function formatColumns(\n columns: ColumnConfig[],\n maxWidth?: number,\n colorCapability: ColorCapability = 'full'\n): string {\n const width = maxWidth ?? getTerminalWidth();\n const totalColumns = columns.length;\n\n const columnsWithWidths = columns.map((col, idx) => {\n if (col.width) return { ...col, calculatedWidth: col.width };\n\n const remainingWidth = width - columns\n .filter((c, i) => i !== idx && c.width)\n .reduce((sum, c) => sum + (c.width ?? 0), 0);\n\n const autoColumns = columns.filter(c => !c.width).length;\n const calculatedWidth = Math.floor(remainingWidth / autoColumns);\n\n return { ...col, calculatedWidth };\n });\n\n return columnsWithWidths.map(col => {\n let content = col.content;\n\n if (col.color && colorCapability !== 'none') {\n const colorCode = getANSIForeground(col.color, colorCapability);\n content = `${colorCode}${content}${ANSI.reset}`;\n }\n\n return padToWidth(content, col.calculatedWidth, col.align);\n }).join('');\n}\n\nexport function formatKeyValue(\n obj: Record<string, unknown>,\n colorCapability: ColorCapability = 'full',\n options: { separator?: string; keyColor?: string; valueColor?: string } = {}\n): string {\n const {\n separator = ' ',\n keyColor = '#888888',\n valueColor = '#00ffff'\n } = options;\n\n const entries = Object.entries(obj);\n if (entries.length === 0) return '';\n\n const keyColorCode = colorCapability !== 'none'\n ? getANSIForeground(keyColor, colorCapability)\n : '';\n const valueColorCode = colorCapability !== 'none'\n ? getANSIForeground(valueColor, colorCapability)\n : '';\n const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n return entries\n .map(([key, value]) => {\n const valueStr = typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n return `${keyColorCode}${key}:${reset} ${valueColorCode}${valueStr}${reset}`;\n })\n .join(separator);\n}\n\nexport function isKeyValueObject(obj: unknown): obj is Record<string, unknown> {\n if (typeof obj !== 'object' || obj === null) return false;\n if (Array.isArray(obj)) return false;\n\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) return false;\n\n const values = Object.values(obj);\n return values.every(v =>\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n v === null\n );\n}\n\nexport function formatBadge(\n badge: string,\n style: BadgeStyle = 'brackets',\n colorCapability: ColorCapability = 'full',\n color?: string\n): string {\n const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n const text = badge.toUpperCase();\n\n switch (style) {\n case 'rounded':\n const colorCode1 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack1 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack1}${colorCode1}⟨${text}⟩${reset}`;\n case 'plain':\n const colorCode2 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n return `${colorCode2}${text}${reset}`;\n case 'unicode':\n const colorCode3 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack3 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack3}${colorCode3}╭${text}╮${reset}`;\n case 'pill':\n // Badge con background de color y texto blanco/negro\n const bgColor = color && colorCapability !== 'none' ? getANSIBackground(color, colorCapability) : '';\n const fgColor = colorCapability !== 'none' ? getANSIForeground('#000000', colorCapability) : '';\n return `${bgColor}${fgColor}[${text}]${reset}`;\n case 'brackets':\n default:\n const colorCode5 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack5 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack5}${colorCode5}[${text}]${reset}`;\n }\n}\n\nexport function formatTimestamp(\n date: Date = new Date(),\n format: TimestampFormat = 'time'\n): string {\n switch (format) {\n case 'iso':\n return date.toISOString();\n case 'date':\n return date.toISOString().split('T')[0] ?? '';\n case 'time':\n return date.toTimeString().slice(0, 8);\n case 'timeMs':\n return date.toTimeString().slice(0, 8) + '.' +\n String(date.getMilliseconds()).padStart(3, '0');\n case 'relative':\n return formatRelativeTime(date);\n case 'elapsed':\n return formatElapsedTime(date);\n case 'custom':\n default:\n return date.toLocaleTimeString();\n }\n}\n\nlet startTime: number | null = null;\n\nexport function formatRelativeTime(date: Date): string {\n if (startTime === null) {\n startTime = Date.now();\n }\n\n const diff = date.getTime() - startTime;\n\n if (diff < 1000) {\n return `+${diff}ms`;\n } else if (diff < 60000) {\n return `+${(diff / 1000).toFixed(1)}s`;\n } else {\n const mins = Math.floor(diff / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n return `+${mins}m${secs}s`;\n }\n}\n\nexport function formatElapsedTime(date: Date): string {\n if (startTime === null) {\n startTime = Date.now();\n }\n\n const diff = date.getTime() - startTime;\n const hours = Math.floor(diff / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n}\n\nexport function resetStartTime(): void {\n startTime = Date.now();\n}\n\nexport function applyLogOptions(\n message: string,\n options: LogOptions,\n colorCapability: ColorCapability = 'full'\n): string {\n let result = message;\n\n if (options.rightAlign) {\n result = formatWithRightAlign(message, options.rightAlign);\n }\n\n return result;\n}\n","/**\n * @fileoverview Box renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport type { IBoxOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { stripAnsi, getVisibleLength } from '../terminal/formatter.js';\n\n/**\n * Border character sets for different styles\n */\nconst BORDER_CHARS = {\n single: { tl: '\\u250c', tr: '\\u2510', bl: '\\u2514', br: '\\u2518', h: '\\u2500', v: '\\u2502' },\n rounded: { tl: '\\u256d', tr: '\\u256e', bl: '\\u2570', br: '\\u256f', h: '\\u2500', v: '\\u2502' },\n double: { tl: '\\u2554', tr: '\\u2557', bl: '\\u255a', br: '\\u255d', h: '\\u2550', v: '\\u2551' },\n bold: { tl: '\\u250f', tr: '\\u2513', bl: '\\u2517', br: '\\u251b', h: '\\u2501', v: '\\u2503' },\n} as const;\n\n/**\n * Renders content inside a bordered box\n * @param content - Content string (may contain newlines)\n * @param options - Box rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted box string with border\n */\nexport function renderBox(content: string, options: IBoxOptions = {}, colorCap: ColorCapability = 'full'): string {\n const {\n title,\n borderColor,\n borderStyle = 'rounded',\n padding = 0,\n } = options;\n\n const chars = BORDER_CHARS[borderStyle] ?? BORDER_CHARS.rounded;\n const lines = content.split('\\n');\n const maxTermWidth = Math.min(getTerminalWidth() - 4, 80);\n\n // Calculate content width from visible text\n const contentWidths = lines.map(l => getVisibleLength(l));\n const titleWidth = title ? stripAnsi(title).length + 2 : 0; // +2 for spaces around title\n const maxContentWidth = Math.max(...contentWidths, titleWidth);\n const innerWidth = Math.min(maxContentWidth + 2, maxTermWidth); // +2 for horizontal padding\n\n // Color wrapper for border chars\n const bc = borderColor && colorCap !== 'none'\n ? getANSIForeground(borderColor, colorCap)\n : '';\n const reset = bc ? ANSI.reset : '';\n\n const wrap = (char: string) => `${bc}${char}${reset}`;\n\n // Build top border (with optional title)\n let topBorder: string;\n if (title) {\n const titleStr = ` ${title} `;\n const afterTitle = innerWidth - stripAnsi(titleStr).length;\n topBorder = ` ${wrap(chars.tl)}${wrap(chars.h)}${wrap(titleStr)}${wrap(chars.h.repeat(Math.max(0, afterTitle - 1)))}${wrap(chars.tr)}`;\n } else {\n topBorder = ` ${wrap(chars.tl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.tr)}`;\n }\n\n // Build bottom border\n const bottomBorder = ` ${wrap(chars.bl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.br)}`;\n\n // Build padding lines\n const emptyLine = ` ${wrap(chars.v)}${' '.repeat(innerWidth)}${wrap(chars.v)}`;\n const paddingLines = padding > 0 ? Array(padding).fill(emptyLine) : [];\n\n // Build content lines\n const contentLines = lines.map(line => {\n const visible = getVisibleLength(line);\n const pad = innerWidth - visible - 1; // -1 for left space\n return ` ${wrap(chars.v)} ${line}${' '.repeat(Math.max(0, pad))}${wrap(chars.v)}`;\n });\n\n return [\n topBorder,\n ...paddingLines,\n ...contentLines,\n ...paddingLines,\n bottomBorder,\n ].join('\\n');\n}\n","/**\n * @fileoverview Built-in spinner implementation for CLI primitives\n * @since 5.0.0\n */\n\nimport type { ISpinnerHandle, LoggerConfig } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\nimport { ANSI } from '../terminal/color-converter.js';\n\n/** Braille-based spinner animation frames */\nconst SPINNER_FRAMES = ['\\u280b', '\\u2819', '\\u2839', '\\u2838', '\\u283c', '\\u2834', '\\u2826', '\\u2827', '\\u2807', '\\u280f'];\n\n/** Spinner frame interval in milliseconds */\nconst FRAME_INTERVAL = 80;\n\n/**\n * Interactive terminal spinner with in-place line updates.\n * Writes to stderr to avoid polluting piped stdout.\n *\n * @implements {ISpinnerHandle}\n * @since 5.0.0\n */\nexport class SpinnerManager implements ISpinnerHandle {\n private message: string;\n private frameIndex = 0;\n private interval: ReturnType<typeof setInterval> | null = null;\n private _logger: Logger;\n\n constructor(message: string, _config: LoggerConfig, logger: Logger) {\n this.message = message;\n this._logger = logger;\n }\n\n /** Start the spinner animation */\n start(): void {\n if (this.interval) return; // Already running\n\n // Switch logger to buffer mode to prevent garbled output\n this._logger.updateConfig({ outputMode: 'silent' });\n\n this.frameIndex = 0;\n this.render();\n this.interval = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;\n this.render();\n }, FRAME_INTERVAL);\n }\n\n /** Stop the spinner without a status message */\n stop(): void {\n this.clearInterval();\n this.clearLine();\n // Restore logger output\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Stop with a success indicator */\n succeed(msg?: string): void {\n this.clearInterval();\n this.clearLine();\n const text = msg ?? this.message;\n process.stderr.write(` ${ANSI.fg.green}\\u2713${ANSI.reset} ${text}\\n`);\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Stop with a failure indicator */\n fail(msg?: string): void {\n this.clearInterval();\n this.clearLine();\n const text = msg ?? this.message;\n process.stderr.write(` ${ANSI.fg.red}\\u2717${ANSI.reset} ${text}\\n`);\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Update the spinner text while running */\n text(msg: string): void {\n this.message = msg;\n }\n\n private render(): void {\n const frame = SPINNER_FRAMES[this.frameIndex] ?? SPINNER_FRAMES[0];\n const line = ` ${ANSI.fg.cyan}${frame}${ANSI.reset} ${this.message}`;\n process.stderr.write(`\\r\\x1b[K${line}`);\n }\n\n private clearLine(): void {\n process.stderr.write('\\r\\x1b[K');\n }\n\n private clearInterval(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n}\n\n/**\n * No-op spinner for non-TTY environments or silent mode.\n * Logs start/succeed/fail as plain log messages.\n *\n * @implements {ISpinnerHandle}\n * @since 5.0.0\n */\nexport class NoopSpinner implements ISpinnerHandle {\n private message: string;\n private _logger: Logger;\n\n constructor(message: string, logger: Logger) {\n this.message = message;\n this._logger = logger;\n }\n\n start(): void {\n this._logger.info(this.message);\n }\n\n stop(): void {\n // No-op\n }\n\n succeed(msg?: string): void {\n this._logger.success(msg ?? this.message);\n }\n\n fail(msg?: string): void {\n this._logger.error(msg ?? this.message);\n }\n\n text(msg: string): void {\n this.message = msg;\n }\n}\n","/**\n * @fileoverview Server/JSON fallback for CLI primitives in non-TTY environments\n * @since 5.0.0\n */\n\nimport type { IBoxOptions, ITableOptions } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\n\n/**\n * Server-mode fallback: outputs CLI primitives as plain logger calls\n * when not running in an interactive terminal.\n *\n * @since 5.0.0\n */\nexport class ServerFallback {\n private logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /** Render step as plain info log */\n step(current: number, total: number, msg: string): void {\n this.logger.info(`[${current}/${total}] ${msg}`);\n }\n\n /** Render header as plain info log */\n header(title: string, subtitle?: string): void {\n const text = subtitle ? `${title} ${subtitle}` : title;\n this.logger.info(text);\n }\n\n /** Divider is a no-op in server mode */\n divider(): void {\n // No-op in server/JSON mode\n }\n\n /** Blank line is a no-op in server mode */\n blank(): void {\n // No-op in server/JSON mode\n }\n\n /** Render box content as plain info log */\n box(content: string, _options?: IBoxOptions): void {\n this.logger.info(content);\n }\n\n /** Render table rows as plain info logs */\n cliTable(rows: Record<string, unknown>[], _options?: ITableOptions): void {\n for (const row of rows) {\n this.logger.info(JSON.stringify(row));\n }\n }\n}\n","/**\n * @fileoverview Divider renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\n\n/**\n * Renders a horizontal divider line\n * @param width - Optional explicit width (defaults to terminal width capped at 60)\n * @returns Formatted divider string\n */\nexport function renderDivider(width?: number): string {\n const w = width ?? Math.min(getTerminalWidth() - 4, 60);\n return ANSI.dim + ' ' + '\\u2500'.repeat(w) + ANSI.reset;\n}\n","/**\n * @fileoverview Header renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\n\n/**\n * Renders a styled header with optional subtitle\n * @param title - Main title text\n * @param subtitle - Optional subtitle (rendered dimmed)\n * @returns Formatted header string\n */\nexport function renderHeader(title: string, subtitle?: string): string {\n const t = ANSI.bold + title + ANSI.reset;\n const s = subtitle ? ANSI.dim + ` ${subtitle}` + ANSI.reset : '';\n return ` ${t}${s}`;\n}\n","/**\n * @fileoverview Step progress renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { getANSIForeground, ANSI, type ColorCapability } from '../terminal/color-converter.js';\n\n/**\n * Renders a step progress indicator like ` [2/5] Analyzing repository...`\n * @param current - Current step number\n * @param total - Total number of steps\n * @param msg - Step description message\n * @param colorCap - Terminal color capability\n * @returns Formatted step string\n */\nexport function renderStep(current: number, total: number, msg: string, colorCap: ColorCapability): string {\n const label = `[${current}/${total}]`;\n const colored = colorCap !== 'none'\n ? getANSIForeground('#00bcd4', colorCap) + ANSI.bold + label + ANSI.reset\n : label;\n return ` ${colored} ${msg}`;\n}\n","/**\n * @fileoverview CLI table renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport type { ITableOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getVisibleLength, padToWidth } from '../terminal/formatter.js';\n\n/**\n * Renders an array of objects as a formatted ASCII table\n * @param rows - Array of row objects\n * @param options - Table rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted table string\n */\nexport function renderTable(\n rows: Record<string, unknown>[],\n options: ITableOptions = {},\n colorCap: ColorCapability = 'full'\n): string {\n if (rows.length === 0) return '';\n\n // Determine columns from options or first row's keys\n const columns = options.columns ?? Object.keys(rows[0]!);\n const headers = options.head ?? columns;\n\n // Calculate column widths (max of header and all values)\n const colWidths = columns.map((col, i) => {\n const headerLen = getVisibleLength(headers[i] ?? col);\n const maxValueLen = rows.reduce((max, row) => {\n const val = String(row[col] ?? '');\n return Math.max(max, getVisibleLength(val));\n }, 0);\n return Math.max(headerLen, maxValueLen) + 2; // +2 for padding\n });\n\n // Color helpers\n const cyan = colorCap !== 'none' ? getANSIForeground('#00bcd4', colorCap) : '';\n const dim = colorCap !== 'none' ? ANSI.dim : '';\n const reset = colorCap !== 'none' ? ANSI.reset : '';\n\n // Build header row\n const headerRow = ' ' + columns.map((col, i) => {\n const label = headers[i] ?? col;\n return cyan + ANSI.bold + padToWidth(` ${label}`, colWidths[i]!) + reset;\n }).join('');\n\n // Build separator\n const separator = ' ' + dim + colWidths.map(w => '\\u2500'.repeat(w)).join('\\u2500') + reset;\n\n // Build data rows\n const dataRows = rows.map(row => {\n return ' ' + columns.map((col, i) => {\n const val = String(row[col] ?? '');\n return padToWidth(` ${val}`, colWidths[i]!);\n }).join('');\n });\n\n return [headerRow, separator, ...dataRows].join('\\n');\n}\n"],"names":["stripAnsi","str","replace","getVisibleLength","length","padToWidth","width","align","visibleLen","padding","repeat","leftPad","Math","floor","rightPad","formatWithRightAlign","leftContent","rightContent","maxWidth","gap","getTerminalWidth","startTime","formatRelativeTime","date","Date","now","diff","getTime","toFixed","formatElapsedTime","hours","mins","secs","String","padStart","BORDER_CHARS","single","tl","tr","bl","br","h","v","rounded","double","bold","SPINNER_FRAMES","message","_logger","constructor","logger","this","start","info","stop","succeed","msg","success","fail","error","text","step","current","total","header","title","subtitle","divider","blank","box","content","_options","cliTable","rows","row","JSON","stringify","frameIndex","interval","_config","updateConfig","outputMode","render","setInterval","clearInterval","clearLine","process","stderr","write","ANSI","fg","green","reset","red","frame","line","cyan","options","colorCapability","result","rightAlign","badge","style","color","toUpperCase","colorCode1","getANSIForeground","bg","black","colorCode3","getANSIBackground","colorCode5","columns","map","col","idx","calculatedWidth","remainingWidth","filter","c","i","reduce","sum","autoColumns","join","obj","separator","keyColor","valueColor","entries","Object","keyColorCode","valueColorCode","key","value","valueStr","format","toISOString","split","toTimeString","slice","getMilliseconds","toLocaleTimeString","Array","isArray","proto","getPrototypeOf","prototype","values","every","colorCap","borderColor","borderStyle","chars","lines","maxTermWidth","min","contentWidths","l","titleWidth","maxContentWidth","max","innerWidth","bc","wrap","char","topBorder","titleStr","afterTitle","bottomBorder","emptyLine","paddingLines","fill","contentLines","visible","pad","w","dim","label","keys","headers","head","colWidths","headerLen","maxValueLen","val"],"mappings":"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"}
@@ -0,0 +1,390 @@
1
+ import { g as getANSIForeground, A as ANSI, b as getANSIBackground, l as getTerminalWidth } from "./color-converter-_Xdmsy7E.js";
2
+ function stripAnsi(str) {
3
+ return str.replace(/\x1b\[[0-9;]*m/g, "");
4
+ }
5
+ function getVisibleLength(str) {
6
+ return stripAnsi(str).length;
7
+ }
8
+ function padToWidth(str, width, align = "left") {
9
+ const visibleLen = getVisibleLength(str);
10
+ if (visibleLen >= width) return str;
11
+ const padding = width - visibleLen;
12
+ switch (align) {
13
+ case "right":
14
+ return " ".repeat(padding) + str;
15
+ case "center":
16
+ const leftPad = Math.floor(padding / 2);
17
+ const rightPad = padding - leftPad;
18
+ return " ".repeat(leftPad) + str + " ".repeat(rightPad);
19
+ case "left":
20
+ default:
21
+ return str + " ".repeat(padding);
22
+ }
23
+ }
24
+ function formatWithRightAlign(leftContent, rightContent, maxWidth) {
25
+ const width = maxWidth ?? getTerminalWidth();
26
+ const leftLen = getVisibleLength(leftContent);
27
+ const rightLen = getVisibleLength(rightContent);
28
+ const gap = width - leftLen - rightLen;
29
+ if (gap <= 1) {
30
+ return `${leftContent} ${rightContent}`;
31
+ }
32
+ return `${leftContent}${" ".repeat(gap)}${rightContent}`;
33
+ }
34
+ function formatColumns(columns, maxWidth, colorCapability = "full") {
35
+ const width = maxWidth ?? getTerminalWidth();
36
+ columns.length;
37
+ const columnsWithWidths = columns.map((col, idx) => {
38
+ if (col.width) return { ...col, calculatedWidth: col.width };
39
+ const remainingWidth = width - columns.filter((c, i) => i !== idx && c.width).reduce((sum, c) => sum + (c.width ?? 0), 0);
40
+ const autoColumns = columns.filter((c) => !c.width).length;
41
+ const calculatedWidth = Math.floor(remainingWidth / autoColumns);
42
+ return { ...col, calculatedWidth };
43
+ });
44
+ return columnsWithWidths.map((col) => {
45
+ let content = col.content;
46
+ if (col.color && colorCapability !== "none") {
47
+ const colorCode = getANSIForeground(col.color, colorCapability);
48
+ content = `${colorCode}${content}${ANSI.reset}`;
49
+ }
50
+ return padToWidth(content, col.calculatedWidth, col.align);
51
+ }).join("");
52
+ }
53
+ function formatKeyValue(obj, colorCapability = "full", options = {}) {
54
+ const {
55
+ separator = " ",
56
+ keyColor = "#888888",
57
+ valueColor = "#00ffff"
58
+ } = options;
59
+ const entries = Object.entries(obj);
60
+ if (entries.length === 0) return "";
61
+ const keyColorCode = colorCapability !== "none" ? getANSIForeground(keyColor, colorCapability) : "";
62
+ const valueColorCode = colorCapability !== "none" ? getANSIForeground(valueColor, colorCapability) : "";
63
+ const reset = colorCapability !== "none" ? ANSI.reset : "";
64
+ return entries.map(([key, value]) => {
65
+ const valueStr = typeof value === "object" ? JSON.stringify(value) : String(value);
66
+ return `${keyColorCode}${key}:${reset} ${valueColorCode}${valueStr}${reset}`;
67
+ }).join(separator);
68
+ }
69
+ function isKeyValueObject(obj) {
70
+ if (typeof obj !== "object" || obj === null) return false;
71
+ if (Array.isArray(obj)) return false;
72
+ const proto = Object.getPrototypeOf(obj);
73
+ if (proto !== Object.prototype && proto !== null) return false;
74
+ const values = Object.values(obj);
75
+ return values.every(
76
+ (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean" || v === null
77
+ );
78
+ }
79
+ function formatBadge(badge, style = "brackets", colorCapability = "full", color) {
80
+ const reset = colorCapability !== "none" ? ANSI.reset : "";
81
+ const text = badge.toUpperCase();
82
+ switch (style) {
83
+ case "rounded":
84
+ const colorCode1 = color && colorCapability !== "none" ? getANSIForeground(color, colorCapability) : "";
85
+ const bgBlack1 = colorCapability !== "none" ? ANSI.bg.black : "";
86
+ return `${bgBlack1}${colorCode1}⟨${text}⟩${reset}`;
87
+ case "plain":
88
+ const colorCode2 = color && colorCapability !== "none" ? getANSIForeground(color, colorCapability) : "";
89
+ return `${colorCode2}${text}${reset}`;
90
+ case "unicode":
91
+ const colorCode3 = color && colorCapability !== "none" ? getANSIForeground(color, colorCapability) : "";
92
+ const bgBlack3 = colorCapability !== "none" ? ANSI.bg.black : "";
93
+ return `${bgBlack3}${colorCode3}╭${text}╮${reset}`;
94
+ case "pill":
95
+ const bgColor = color && colorCapability !== "none" ? getANSIBackground(color, colorCapability) : "";
96
+ const fgColor = colorCapability !== "none" ? getANSIForeground("#000000", colorCapability) : "";
97
+ return `${bgColor}${fgColor}[${text}]${reset}`;
98
+ case "brackets":
99
+ default:
100
+ const colorCode5 = color && colorCapability !== "none" ? getANSIForeground(color, colorCapability) : "";
101
+ const bgBlack5 = colorCapability !== "none" ? ANSI.bg.black : "";
102
+ return `${bgBlack5}${colorCode5}[${text}]${reset}`;
103
+ }
104
+ }
105
+ function formatTimestamp(date = /* @__PURE__ */ new Date(), format = "time") {
106
+ switch (format) {
107
+ case "iso":
108
+ return date.toISOString();
109
+ case "date":
110
+ return date.toISOString().split("T")[0] ?? "";
111
+ case "time":
112
+ return date.toTimeString().slice(0, 8);
113
+ case "timeMs":
114
+ return date.toTimeString().slice(0, 8) + "." + String(date.getMilliseconds()).padStart(3, "0");
115
+ case "relative":
116
+ return formatRelativeTime(date);
117
+ case "elapsed":
118
+ return formatElapsedTime(date);
119
+ case "custom":
120
+ default:
121
+ return date.toLocaleTimeString();
122
+ }
123
+ }
124
+ let startTime = null;
125
+ function formatRelativeTime(date) {
126
+ if (startTime === null) {
127
+ startTime = Date.now();
128
+ }
129
+ const diff = date.getTime() - startTime;
130
+ if (diff < 1e3) {
131
+ return `+${diff}ms`;
132
+ } else if (diff < 6e4) {
133
+ return `+${(diff / 1e3).toFixed(1)}s`;
134
+ } else {
135
+ const mins = Math.floor(diff / 6e4);
136
+ const secs = Math.floor(diff % 6e4 / 1e3);
137
+ return `+${mins}m${secs}s`;
138
+ }
139
+ }
140
+ function formatElapsedTime(date) {
141
+ if (startTime === null) {
142
+ startTime = Date.now();
143
+ }
144
+ const diff = date.getTime() - startTime;
145
+ const hours = Math.floor(diff / 36e5);
146
+ const mins = Math.floor(diff % 36e5 / 6e4);
147
+ const secs = Math.floor(diff % 6e4 / 1e3);
148
+ return `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
149
+ }
150
+ function resetStartTime() {
151
+ startTime = Date.now();
152
+ }
153
+ function applyLogOptions(message, options, colorCapability = "full") {
154
+ let result = message;
155
+ if (options.rightAlign) {
156
+ result = formatWithRightAlign(message, options.rightAlign);
157
+ }
158
+ return result;
159
+ }
160
+ function renderStep(current, total, msg, colorCap) {
161
+ const label = `[${current}/${total}]`;
162
+ const colored = colorCap !== "none" ? getANSIForeground("#00bcd4", colorCap) + ANSI.bold + label + ANSI.reset : label;
163
+ return ` ${colored} ${msg}`;
164
+ }
165
+ function renderHeader(title, subtitle) {
166
+ const t = ANSI.bold + title + ANSI.reset;
167
+ const s = subtitle ? ANSI.dim + ` ${subtitle}` + ANSI.reset : "";
168
+ return ` ${t}${s}`;
169
+ }
170
+ function renderDivider(width) {
171
+ const w = width ?? Math.min(getTerminalWidth() - 4, 60);
172
+ return ANSI.dim + " " + "─".repeat(w) + ANSI.reset;
173
+ }
174
+ const BORDER_CHARS = {
175
+ single: { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" },
176
+ rounded: { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" },
177
+ double: { tl: "╔", tr: "╗", bl: "╚", br: "╝", h: "═", v: "║" },
178
+ bold: { tl: "┏", tr: "┓", bl: "┗", br: "┛", h: "━", v: "┃" }
179
+ };
180
+ function renderBox(content, options = {}, colorCap = "full") {
181
+ const {
182
+ title,
183
+ borderColor,
184
+ borderStyle = "rounded",
185
+ padding = 0
186
+ } = options;
187
+ const chars = BORDER_CHARS[borderStyle] ?? BORDER_CHARS.rounded;
188
+ const lines = content.split("\n");
189
+ const maxTermWidth = Math.min(getTerminalWidth() - 4, 80);
190
+ const contentWidths = lines.map((l) => getVisibleLength(l));
191
+ const titleWidth = title ? stripAnsi(title).length + 2 : 0;
192
+ const maxContentWidth = Math.max(...contentWidths, titleWidth);
193
+ const innerWidth = Math.min(maxContentWidth + 2, maxTermWidth);
194
+ const bc = borderColor && colorCap !== "none" ? getANSIForeground(borderColor, colorCap) : "";
195
+ const reset = bc ? ANSI.reset : "";
196
+ const wrap = (char) => `${bc}${char}${reset}`;
197
+ let topBorder;
198
+ if (title) {
199
+ const titleStr = ` ${title} `;
200
+ const afterTitle = innerWidth - stripAnsi(titleStr).length;
201
+ topBorder = ` ${wrap(chars.tl)}${wrap(chars.h)}${wrap(titleStr)}${wrap(chars.h.repeat(Math.max(0, afterTitle - 1)))}${wrap(chars.tr)}`;
202
+ } else {
203
+ topBorder = ` ${wrap(chars.tl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.tr)}`;
204
+ }
205
+ const bottomBorder = ` ${wrap(chars.bl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.br)}`;
206
+ const emptyLine = ` ${wrap(chars.v)}${" ".repeat(innerWidth)}${wrap(chars.v)}`;
207
+ const paddingLines = padding > 0 ? Array(padding).fill(emptyLine) : [];
208
+ const contentLines = lines.map((line) => {
209
+ const visible = getVisibleLength(line);
210
+ const pad = innerWidth - visible - 1;
211
+ return ` ${wrap(chars.v)} ${line}${" ".repeat(Math.max(0, pad))}${wrap(chars.v)}`;
212
+ });
213
+ return [
214
+ topBorder,
215
+ ...paddingLines,
216
+ ...contentLines,
217
+ ...paddingLines,
218
+ bottomBorder
219
+ ].join("\n");
220
+ }
221
+ function renderTable(rows, options = {}, colorCap = "full") {
222
+ if (rows.length === 0) return "";
223
+ const columns = options.columns ?? Object.keys(rows[0]);
224
+ const headers = options.head ?? columns;
225
+ const colWidths = columns.map((col, i) => {
226
+ const headerLen = getVisibleLength(headers[i] ?? col);
227
+ const maxValueLen = rows.reduce((max, row) => {
228
+ const val = String(row[col] ?? "");
229
+ return Math.max(max, getVisibleLength(val));
230
+ }, 0);
231
+ return Math.max(headerLen, maxValueLen) + 2;
232
+ });
233
+ const cyan = colorCap !== "none" ? getANSIForeground("#00bcd4", colorCap) : "";
234
+ const dim = colorCap !== "none" ? ANSI.dim : "";
235
+ const reset = colorCap !== "none" ? ANSI.reset : "";
236
+ const headerRow = " " + columns.map((col, i) => {
237
+ const label = headers[i] ?? col;
238
+ return cyan + ANSI.bold + padToWidth(` ${label}`, colWidths[i]) + reset;
239
+ }).join("");
240
+ const separator = " " + dim + colWidths.map((w) => "─".repeat(w)).join("─") + reset;
241
+ const dataRows = rows.map((row) => {
242
+ return " " + columns.map((col, i) => {
243
+ const val = String(row[col] ?? "");
244
+ return padToWidth(` ${val}`, colWidths[i]);
245
+ }).join("");
246
+ });
247
+ return [headerRow, separator, ...dataRows].join("\n");
248
+ }
249
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
250
+ const FRAME_INTERVAL = 80;
251
+ class SpinnerManager {
252
+ message;
253
+ frameIndex = 0;
254
+ interval = null;
255
+ _logger;
256
+ constructor(message, _config, logger) {
257
+ this.message = message;
258
+ this._logger = logger;
259
+ }
260
+ /** Start the spinner animation */
261
+ start() {
262
+ if (this.interval) return;
263
+ this._logger.updateConfig({ outputMode: "silent" });
264
+ this.frameIndex = 0;
265
+ this.render();
266
+ this.interval = setInterval(() => {
267
+ this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;
268
+ this.render();
269
+ }, FRAME_INTERVAL);
270
+ }
271
+ /** Stop the spinner without a status message */
272
+ stop() {
273
+ this.clearInterval();
274
+ this.clearLine();
275
+ this._logger.updateConfig({ outputMode: "console" });
276
+ }
277
+ /** Stop with a success indicator */
278
+ succeed(msg) {
279
+ this.clearInterval();
280
+ this.clearLine();
281
+ const text = msg ?? this.message;
282
+ process.stderr.write(` ${ANSI.fg.green}✓${ANSI.reset} ${text}
283
+ `);
284
+ this._logger.updateConfig({ outputMode: "console" });
285
+ }
286
+ /** Stop with a failure indicator */
287
+ fail(msg) {
288
+ this.clearInterval();
289
+ this.clearLine();
290
+ const text = msg ?? this.message;
291
+ process.stderr.write(` ${ANSI.fg.red}✗${ANSI.reset} ${text}
292
+ `);
293
+ this._logger.updateConfig({ outputMode: "console" });
294
+ }
295
+ /** Update the spinner text while running */
296
+ text(msg) {
297
+ this.message = msg;
298
+ }
299
+ render() {
300
+ const frame = SPINNER_FRAMES[this.frameIndex] ?? SPINNER_FRAMES[0];
301
+ const line = ` ${ANSI.fg.cyan}${frame}${ANSI.reset} ${this.message}`;
302
+ process.stderr.write(`\r\x1B[K${line}`);
303
+ }
304
+ clearLine() {
305
+ process.stderr.write("\r\x1B[K");
306
+ }
307
+ clearInterval() {
308
+ if (this.interval) {
309
+ clearInterval(this.interval);
310
+ this.interval = null;
311
+ }
312
+ }
313
+ }
314
+ class NoopSpinner {
315
+ message;
316
+ _logger;
317
+ constructor(message, logger) {
318
+ this.message = message;
319
+ this._logger = logger;
320
+ }
321
+ start() {
322
+ this._logger.info(this.message);
323
+ }
324
+ stop() {
325
+ }
326
+ succeed(msg) {
327
+ this._logger.success(msg ?? this.message);
328
+ }
329
+ fail(msg) {
330
+ this._logger.error(msg ?? this.message);
331
+ }
332
+ text(msg) {
333
+ this.message = msg;
334
+ }
335
+ }
336
+ class ServerFallback {
337
+ logger;
338
+ constructor(logger) {
339
+ this.logger = logger;
340
+ }
341
+ /** Render step as plain info log */
342
+ step(current, total, msg) {
343
+ this.logger.info(`[${current}/${total}] ${msg}`);
344
+ }
345
+ /** Render header as plain info log */
346
+ header(title, subtitle) {
347
+ const text = subtitle ? `${title} ${subtitle}` : title;
348
+ this.logger.info(text);
349
+ }
350
+ /** Divider is a no-op in server mode */
351
+ divider() {
352
+ }
353
+ /** Blank line is a no-op in server mode */
354
+ blank() {
355
+ }
356
+ /** Render box content as plain info log */
357
+ box(content, _options) {
358
+ this.logger.info(content);
359
+ }
360
+ /** Render table rows as plain info logs */
361
+ cliTable(rows, _options) {
362
+ for (const row of rows) {
363
+ this.logger.info(JSON.stringify(row));
364
+ }
365
+ }
366
+ }
367
+ export {
368
+ NoopSpinner as N,
369
+ SpinnerManager as S,
370
+ formatColumns as a,
371
+ formatKeyValue as b,
372
+ formatBadge as c,
373
+ formatTimestamp as d,
374
+ formatRelativeTime as e,
375
+ formatWithRightAlign as f,
376
+ formatElapsedTime as g,
377
+ getVisibleLength as h,
378
+ isKeyValueObject as i,
379
+ applyLogOptions as j,
380
+ renderStep as k,
381
+ renderDivider as l,
382
+ renderBox as m,
383
+ renderTable as n,
384
+ ServerFallback as o,
385
+ padToWidth as p,
386
+ renderHeader as q,
387
+ resetStartTime as r,
388
+ stripAnsi as s
389
+ };
390
+ //# sourceMappingURL=cli-module-Cx7qotPY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module-Cx7qotPY.js","sources":["../../src/terminal/formatter.ts","../../src/cli-primitives/step.ts","../../src/cli-primitives/header.ts","../../src/cli-primitives/divider.ts","../../src/cli-primitives/box.ts","../../src/cli-primitives/cli-table.ts","../../src/cli-primitives/spinner.ts","../../src/cli-primitives/server-fallback.ts"],"sourcesContent":["/**\n * Terminal Formatter - Alignment, key-value, and advanced terminal formatting\n */\n\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { getANSIForeground, getANSIBackground, ANSI, type ColorCapability } from './color-converter.js';\nimport type { ColumnConfig, ColumnAlign, BadgeStyle, TimestampFormat, LogOptions } from '../types/index.js';\n\nexport function stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nexport function getVisibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nexport function padToWidth(str: string, width: number, align: ColumnAlign = 'left'): string {\n const visibleLen = getVisibleLength(str);\n if (visibleLen >= width) return str;\n\n const padding = width - visibleLen;\n\n switch (align) {\n case 'right':\n return ' '.repeat(padding) + str;\n case 'center':\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n case 'left':\n default:\n return str + ' '.repeat(padding);\n }\n}\n\nexport function formatWithRightAlign(\n leftContent: string,\n rightContent: string,\n maxWidth?: number\n): string {\n const width = maxWidth ?? getTerminalWidth();\n const leftLen = getVisibleLength(leftContent);\n const rightLen = getVisibleLength(rightContent);\n\n const gap = width - leftLen - rightLen;\n if (gap <= 1) {\n return `${leftContent} ${rightContent}`;\n }\n\n return `${leftContent}${' '.repeat(gap)}${rightContent}`;\n}\n\nexport function formatColumns(\n columns: ColumnConfig[],\n maxWidth?: number,\n colorCapability: ColorCapability = 'full'\n): string {\n const width = maxWidth ?? getTerminalWidth();\n const totalColumns = columns.length;\n\n const columnsWithWidths = columns.map((col, idx) => {\n if (col.width) return { ...col, calculatedWidth: col.width };\n\n const remainingWidth = width - columns\n .filter((c, i) => i !== idx && c.width)\n .reduce((sum, c) => sum + (c.width ?? 0), 0);\n\n const autoColumns = columns.filter(c => !c.width).length;\n const calculatedWidth = Math.floor(remainingWidth / autoColumns);\n\n return { ...col, calculatedWidth };\n });\n\n return columnsWithWidths.map(col => {\n let content = col.content;\n\n if (col.color && colorCapability !== 'none') {\n const colorCode = getANSIForeground(col.color, colorCapability);\n content = `${colorCode}${content}${ANSI.reset}`;\n }\n\n return padToWidth(content, col.calculatedWidth, col.align);\n }).join('');\n}\n\nexport function formatKeyValue(\n obj: Record<string, unknown>,\n colorCapability: ColorCapability = 'full',\n options: { separator?: string; keyColor?: string; valueColor?: string } = {}\n): string {\n const {\n separator = ' ',\n keyColor = '#888888',\n valueColor = '#00ffff'\n } = options;\n\n const entries = Object.entries(obj);\n if (entries.length === 0) return '';\n\n const keyColorCode = colorCapability !== 'none'\n ? getANSIForeground(keyColor, colorCapability)\n : '';\n const valueColorCode = colorCapability !== 'none'\n ? getANSIForeground(valueColor, colorCapability)\n : '';\n const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n return entries\n .map(([key, value]) => {\n const valueStr = typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n return `${keyColorCode}${key}:${reset} ${valueColorCode}${valueStr}${reset}`;\n })\n .join(separator);\n}\n\nexport function isKeyValueObject(obj: unknown): obj is Record<string, unknown> {\n if (typeof obj !== 'object' || obj === null) return false;\n if (Array.isArray(obj)) return false;\n\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) return false;\n\n const values = Object.values(obj);\n return values.every(v =>\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n v === null\n );\n}\n\nexport function formatBadge(\n badge: string,\n style: BadgeStyle = 'brackets',\n colorCapability: ColorCapability = 'full',\n color?: string\n): string {\n const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n const text = badge.toUpperCase();\n\n switch (style) {\n case 'rounded':\n const colorCode1 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack1 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack1}${colorCode1}⟨${text}⟩${reset}`;\n case 'plain':\n const colorCode2 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n return `${colorCode2}${text}${reset}`;\n case 'unicode':\n const colorCode3 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack3 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack3}${colorCode3}╭${text}╮${reset}`;\n case 'pill':\n // Badge con background de color y texto blanco/negro\n const bgColor = color && colorCapability !== 'none' ? getANSIBackground(color, colorCapability) : '';\n const fgColor = colorCapability !== 'none' ? getANSIForeground('#000000', colorCapability) : '';\n return `${bgColor}${fgColor}[${text}]${reset}`;\n case 'brackets':\n default:\n const colorCode5 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n const bgBlack5 = colorCapability !== 'none' ? ANSI.bg.black : '';\n return `${bgBlack5}${colorCode5}[${text}]${reset}`;\n }\n}\n\nexport function formatTimestamp(\n date: Date = new Date(),\n format: TimestampFormat = 'time'\n): string {\n switch (format) {\n case 'iso':\n return date.toISOString();\n case 'date':\n return date.toISOString().split('T')[0] ?? '';\n case 'time':\n return date.toTimeString().slice(0, 8);\n case 'timeMs':\n return date.toTimeString().slice(0, 8) + '.' +\n String(date.getMilliseconds()).padStart(3, '0');\n case 'relative':\n return formatRelativeTime(date);\n case 'elapsed':\n return formatElapsedTime(date);\n case 'custom':\n default:\n return date.toLocaleTimeString();\n }\n}\n\nlet startTime: number | null = null;\n\nexport function formatRelativeTime(date: Date): string {\n if (startTime === null) {\n startTime = Date.now();\n }\n\n const diff = date.getTime() - startTime;\n\n if (diff < 1000) {\n return `+${diff}ms`;\n } else if (diff < 60000) {\n return `+${(diff / 1000).toFixed(1)}s`;\n } else {\n const mins = Math.floor(diff / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n return `+${mins}m${secs}s`;\n }\n}\n\nexport function formatElapsedTime(date: Date): string {\n if (startTime === null) {\n startTime = Date.now();\n }\n\n const diff = date.getTime() - startTime;\n const hours = Math.floor(diff / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n}\n\nexport function resetStartTime(): void {\n startTime = Date.now();\n}\n\nexport function applyLogOptions(\n message: string,\n options: LogOptions,\n colorCapability: ColorCapability = 'full'\n): string {\n let result = message;\n\n if (options.rightAlign) {\n result = formatWithRightAlign(message, options.rightAlign);\n }\n\n return result;\n}\n","/**\n * @fileoverview Step progress renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { getANSIForeground, ANSI, type ColorCapability } from '../terminal/color-converter.js';\n\n/**\n * Renders a step progress indicator like ` [2/5] Analyzing repository...`\n * @param current - Current step number\n * @param total - Total number of steps\n * @param msg - Step description message\n * @param colorCap - Terminal color capability\n * @returns Formatted step string\n */\nexport function renderStep(current: number, total: number, msg: string, colorCap: ColorCapability): string {\n const label = `[${current}/${total}]`;\n const colored = colorCap !== 'none'\n ? getANSIForeground('#00bcd4', colorCap) + ANSI.bold + label + ANSI.reset\n : label;\n return ` ${colored} ${msg}`;\n}\n","/**\n * @fileoverview Header renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\n\n/**\n * Renders a styled header with optional subtitle\n * @param title - Main title text\n * @param subtitle - Optional subtitle (rendered dimmed)\n * @returns Formatted header string\n */\nexport function renderHeader(title: string, subtitle?: string): string {\n const t = ANSI.bold + title + ANSI.reset;\n const s = subtitle ? ANSI.dim + ` ${subtitle}` + ANSI.reset : '';\n return ` ${t}${s}`;\n}\n","/**\n * @fileoverview Divider renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\n\n/**\n * Renders a horizontal divider line\n * @param width - Optional explicit width (defaults to terminal width capped at 60)\n * @returns Formatted divider string\n */\nexport function renderDivider(width?: number): string {\n const w = width ?? Math.min(getTerminalWidth() - 4, 60);\n return ANSI.dim + ' ' + '\\u2500'.repeat(w) + ANSI.reset;\n}\n","/**\n * @fileoverview Box renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport type { IBoxOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { stripAnsi, getVisibleLength } from '../terminal/formatter.js';\n\n/**\n * Border character sets for different styles\n */\nconst BORDER_CHARS = {\n single: { tl: '\\u250c', tr: '\\u2510', bl: '\\u2514', br: '\\u2518', h: '\\u2500', v: '\\u2502' },\n rounded: { tl: '\\u256d', tr: '\\u256e', bl: '\\u2570', br: '\\u256f', h: '\\u2500', v: '\\u2502' },\n double: { tl: '\\u2554', tr: '\\u2557', bl: '\\u255a', br: '\\u255d', h: '\\u2550', v: '\\u2551' },\n bold: { tl: '\\u250f', tr: '\\u2513', bl: '\\u2517', br: '\\u251b', h: '\\u2501', v: '\\u2503' },\n} as const;\n\n/**\n * Renders content inside a bordered box\n * @param content - Content string (may contain newlines)\n * @param options - Box rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted box string with border\n */\nexport function renderBox(content: string, options: IBoxOptions = {}, colorCap: ColorCapability = 'full'): string {\n const {\n title,\n borderColor,\n borderStyle = 'rounded',\n padding = 0,\n } = options;\n\n const chars = BORDER_CHARS[borderStyle] ?? BORDER_CHARS.rounded;\n const lines = content.split('\\n');\n const maxTermWidth = Math.min(getTerminalWidth() - 4, 80);\n\n // Calculate content width from visible text\n const contentWidths = lines.map(l => getVisibleLength(l));\n const titleWidth = title ? stripAnsi(title).length + 2 : 0; // +2 for spaces around title\n const maxContentWidth = Math.max(...contentWidths, titleWidth);\n const innerWidth = Math.min(maxContentWidth + 2, maxTermWidth); // +2 for horizontal padding\n\n // Color wrapper for border chars\n const bc = borderColor && colorCap !== 'none'\n ? getANSIForeground(borderColor, colorCap)\n : '';\n const reset = bc ? ANSI.reset : '';\n\n const wrap = (char: string) => `${bc}${char}${reset}`;\n\n // Build top border (with optional title)\n let topBorder: string;\n if (title) {\n const titleStr = ` ${title} `;\n const afterTitle = innerWidth - stripAnsi(titleStr).length;\n topBorder = ` ${wrap(chars.tl)}${wrap(chars.h)}${wrap(titleStr)}${wrap(chars.h.repeat(Math.max(0, afterTitle - 1)))}${wrap(chars.tr)}`;\n } else {\n topBorder = ` ${wrap(chars.tl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.tr)}`;\n }\n\n // Build bottom border\n const bottomBorder = ` ${wrap(chars.bl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.br)}`;\n\n // Build padding lines\n const emptyLine = ` ${wrap(chars.v)}${' '.repeat(innerWidth)}${wrap(chars.v)}`;\n const paddingLines = padding > 0 ? Array(padding).fill(emptyLine) : [];\n\n // Build content lines\n const contentLines = lines.map(line => {\n const visible = getVisibleLength(line);\n const pad = innerWidth - visible - 1; // -1 for left space\n return ` ${wrap(chars.v)} ${line}${' '.repeat(Math.max(0, pad))}${wrap(chars.v)}`;\n });\n\n return [\n topBorder,\n ...paddingLines,\n ...contentLines,\n ...paddingLines,\n bottomBorder,\n ].join('\\n');\n}\n","/**\n * @fileoverview CLI table renderer for CLI primitives\n * @since 5.0.0\n */\n\nimport type { ITableOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getVisibleLength, padToWidth } from '../terminal/formatter.js';\n\n/**\n * Renders an array of objects as a formatted ASCII table\n * @param rows - Array of row objects\n * @param options - Table rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted table string\n */\nexport function renderTable(\n rows: Record<string, unknown>[],\n options: ITableOptions = {},\n colorCap: ColorCapability = 'full'\n): string {\n if (rows.length === 0) return '';\n\n // Determine columns from options or first row's keys\n const columns = options.columns ?? Object.keys(rows[0]!);\n const headers = options.head ?? columns;\n\n // Calculate column widths (max of header and all values)\n const colWidths = columns.map((col, i) => {\n const headerLen = getVisibleLength(headers[i] ?? col);\n const maxValueLen = rows.reduce((max, row) => {\n const val = String(row[col] ?? '');\n return Math.max(max, getVisibleLength(val));\n }, 0);\n return Math.max(headerLen, maxValueLen) + 2; // +2 for padding\n });\n\n // Color helpers\n const cyan = colorCap !== 'none' ? getANSIForeground('#00bcd4', colorCap) : '';\n const dim = colorCap !== 'none' ? ANSI.dim : '';\n const reset = colorCap !== 'none' ? ANSI.reset : '';\n\n // Build header row\n const headerRow = ' ' + columns.map((col, i) => {\n const label = headers[i] ?? col;\n return cyan + ANSI.bold + padToWidth(` ${label}`, colWidths[i]!) + reset;\n }).join('');\n\n // Build separator\n const separator = ' ' + dim + colWidths.map(w => '\\u2500'.repeat(w)).join('\\u2500') + reset;\n\n // Build data rows\n const dataRows = rows.map(row => {\n return ' ' + columns.map((col, i) => {\n const val = String(row[col] ?? '');\n return padToWidth(` ${val}`, colWidths[i]!);\n }).join('');\n });\n\n return [headerRow, separator, ...dataRows].join('\\n');\n}\n","/**\n * @fileoverview Built-in spinner implementation for CLI primitives\n * @since 5.0.0\n */\n\nimport type { ISpinnerHandle, LoggerConfig } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\nimport { ANSI } from '../terminal/color-converter.js';\n\n/** Braille-based spinner animation frames */\nconst SPINNER_FRAMES = ['\\u280b', '\\u2819', '\\u2839', '\\u2838', '\\u283c', '\\u2834', '\\u2826', '\\u2827', '\\u2807', '\\u280f'];\n\n/** Spinner frame interval in milliseconds */\nconst FRAME_INTERVAL = 80;\n\n/**\n * Interactive terminal spinner with in-place line updates.\n * Writes to stderr to avoid polluting piped stdout.\n *\n * @implements {ISpinnerHandle}\n * @since 5.0.0\n */\nexport class SpinnerManager implements ISpinnerHandle {\n private message: string;\n private frameIndex = 0;\n private interval: ReturnType<typeof setInterval> | null = null;\n private _logger: Logger;\n\n constructor(message: string, _config: LoggerConfig, logger: Logger) {\n this.message = message;\n this._logger = logger;\n }\n\n /** Start the spinner animation */\n start(): void {\n if (this.interval) return; // Already running\n\n // Switch logger to buffer mode to prevent garbled output\n this._logger.updateConfig({ outputMode: 'silent' });\n\n this.frameIndex = 0;\n this.render();\n this.interval = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;\n this.render();\n }, FRAME_INTERVAL);\n }\n\n /** Stop the spinner without a status message */\n stop(): void {\n this.clearInterval();\n this.clearLine();\n // Restore logger output\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Stop with a success indicator */\n succeed(msg?: string): void {\n this.clearInterval();\n this.clearLine();\n const text = msg ?? this.message;\n process.stderr.write(` ${ANSI.fg.green}\\u2713${ANSI.reset} ${text}\\n`);\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Stop with a failure indicator */\n fail(msg?: string): void {\n this.clearInterval();\n this.clearLine();\n const text = msg ?? this.message;\n process.stderr.write(` ${ANSI.fg.red}\\u2717${ANSI.reset} ${text}\\n`);\n this._logger.updateConfig({ outputMode: 'console' });\n }\n\n /** Update the spinner text while running */\n text(msg: string): void {\n this.message = msg;\n }\n\n private render(): void {\n const frame = SPINNER_FRAMES[this.frameIndex] ?? SPINNER_FRAMES[0];\n const line = ` ${ANSI.fg.cyan}${frame}${ANSI.reset} ${this.message}`;\n process.stderr.write(`\\r\\x1b[K${line}`);\n }\n\n private clearLine(): void {\n process.stderr.write('\\r\\x1b[K');\n }\n\n private clearInterval(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n}\n\n/**\n * No-op spinner for non-TTY environments or silent mode.\n * Logs start/succeed/fail as plain log messages.\n *\n * @implements {ISpinnerHandle}\n * @since 5.0.0\n */\nexport class NoopSpinner implements ISpinnerHandle {\n private message: string;\n private _logger: Logger;\n\n constructor(message: string, logger: Logger) {\n this.message = message;\n this._logger = logger;\n }\n\n start(): void {\n this._logger.info(this.message);\n }\n\n stop(): void {\n // No-op\n }\n\n succeed(msg?: string): void {\n this._logger.success(msg ?? this.message);\n }\n\n fail(msg?: string): void {\n this._logger.error(msg ?? this.message);\n }\n\n text(msg: string): void {\n this.message = msg;\n }\n}\n","/**\n * @fileoverview Server/JSON fallback for CLI primitives in non-TTY environments\n * @since 5.0.0\n */\n\nimport type { IBoxOptions, ITableOptions } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\n\n/**\n * Server-mode fallback: outputs CLI primitives as plain logger calls\n * when not running in an interactive terminal.\n *\n * @since 5.0.0\n */\nexport class ServerFallback {\n private logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /** Render step as plain info log */\n step(current: number, total: number, msg: string): void {\n this.logger.info(`[${current}/${total}] ${msg}`);\n }\n\n /** Render header as plain info log */\n header(title: string, subtitle?: string): void {\n const text = subtitle ? `${title} ${subtitle}` : title;\n this.logger.info(text);\n }\n\n /** Divider is a no-op in server mode */\n divider(): void {\n // No-op in server/JSON mode\n }\n\n /** Blank line is a no-op in server mode */\n blank(): void {\n // No-op in server/JSON mode\n }\n\n /** Render box content as plain info log */\n box(content: string, _options?: IBoxOptions): void {\n this.logger.info(content);\n }\n\n /** Render table rows as plain info logs */\n cliTable(rows: Record<string, unknown>[], _options?: ITableOptions): void {\n for (const row of rows) {\n this.logger.info(JSON.stringify(row));\n }\n }\n}\n"],"names":[],"mappings":"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"}