@socketsecurity/lib 1.3.1 → 1.3.3

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 (337) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/abort.js +1 -60
  3. package/dist/abort.js.map +2 -2
  4. package/dist/agent.js +1 -289
  5. package/dist/agent.js.map +2 -2
  6. package/dist/ansi.js +1 -60
  7. package/dist/ansi.js.map +2 -2
  8. package/dist/argv/flags.js +1 -282
  9. package/dist/argv/flags.js.map +2 -2
  10. package/dist/argv/parse.js +1 -171
  11. package/dist/argv/parse.js.map +2 -2
  12. package/dist/arrays.js +1 -85
  13. package/dist/arrays.js.map +2 -2
  14. package/dist/bin.js +1 -402
  15. package/dist/bin.js.map +2 -2
  16. package/dist/cacache.js +1 -137
  17. package/dist/cacache.js.map +2 -2
  18. package/dist/cache-with-ttl.js +1 -223
  19. package/dist/cache-with-ttl.js.map +2 -2
  20. package/dist/constants/agents.js +1 -126
  21. package/dist/constants/agents.js.map +2 -2
  22. package/dist/constants/core.js +2 -57
  23. package/dist/constants/core.js.map +2 -2
  24. package/dist/constants/encoding.js +1 -48
  25. package/dist/constants/encoding.js.map +2 -2
  26. package/dist/constants/github.js +1 -30
  27. package/dist/constants/github.js.map +2 -2
  28. package/dist/constants/licenses.js +1 -66
  29. package/dist/constants/licenses.js.map +2 -2
  30. package/dist/constants/node.js +1 -171
  31. package/dist/constants/node.js.map +2 -2
  32. package/dist/constants/packages.js +1 -128
  33. package/dist/constants/packages.js.map +2 -2
  34. package/dist/constants/paths.js +1 -150
  35. package/dist/constants/paths.js.map +2 -2
  36. package/dist/constants/platform.js +1 -41
  37. package/dist/constants/platform.js.map +2 -2
  38. package/dist/constants/process.js +1 -52
  39. package/dist/constants/process.js.map +2 -2
  40. package/dist/constants/socket.js +1 -81
  41. package/dist/constants/socket.js.map +2 -2
  42. package/dist/constants/testing.js +1 -36
  43. package/dist/constants/testing.js.map +2 -2
  44. package/dist/constants/time.js +1 -39
  45. package/dist/constants/time.js.map +2 -2
  46. package/dist/constants/typescript.js +1 -54
  47. package/dist/constants/typescript.js.map +2 -2
  48. package/dist/cover/code.js +1 -135
  49. package/dist/cover/code.js.map +2 -2
  50. package/dist/cover/formatters.js +11 -101
  51. package/dist/cover/formatters.js.map +2 -2
  52. package/dist/cover/type.js +1 -63
  53. package/dist/cover/type.js.map +2 -2
  54. package/dist/cover/types.js +1 -15
  55. package/dist/cover/types.js.map +2 -2
  56. package/dist/debug.js +2 -343
  57. package/dist/debug.js.map +2 -2
  58. package/dist/dlx-binary.js +1 -259
  59. package/dist/dlx-binary.js.map +2 -2
  60. package/dist/dlx-package.js +1 -149
  61. package/dist/dlx-package.js.map +2 -2
  62. package/dist/dlx.js +1 -166
  63. package/dist/dlx.js.map +2 -2
  64. package/dist/download-lock.js +1 -137
  65. package/dist/download-lock.js.map +2 -2
  66. package/dist/effects/pulse-frames.js +1 -64
  67. package/dist/effects/pulse-frames.js.map +2 -2
  68. package/dist/effects/text-shimmer.js +1 -174
  69. package/dist/effects/text-shimmer.js.map +2 -2
  70. package/dist/effects/types.js +1 -15
  71. package/dist/effects/types.js.map +2 -2
  72. package/dist/effects/ultra.js +1 -61
  73. package/dist/effects/ultra.js.map +2 -2
  74. package/dist/env/appdata.js +1 -28
  75. package/dist/env/appdata.js.map +2 -2
  76. package/dist/env/ci.js +1 -29
  77. package/dist/env/ci.js.map +2 -2
  78. package/dist/env/comspec.js +1 -28
  79. package/dist/env/comspec.js.map +2 -2
  80. package/dist/env/debug.js +1 -28
  81. package/dist/env/debug.js.map +2 -2
  82. package/dist/env/getters.js +1 -281
  83. package/dist/env/getters.js.map +2 -2
  84. package/dist/env/github-api-url.js +1 -28
  85. package/dist/env/github-api-url.js.map +2 -2
  86. package/dist/env/github-base-ref.js +1 -28
  87. package/dist/env/github-base-ref.js.map +2 -2
  88. package/dist/env/github-ref-name.js +1 -28
  89. package/dist/env/github-ref-name.js.map +2 -2
  90. package/dist/env/github-ref-type.js +1 -28
  91. package/dist/env/github-ref-type.js.map +2 -2
  92. package/dist/env/github-repository.js +1 -28
  93. package/dist/env/github-repository.js.map +2 -2
  94. package/dist/env/github-server-url.js +1 -28
  95. package/dist/env/github-server-url.js.map +2 -2
  96. package/dist/env/github-token.js +1 -28
  97. package/dist/env/github-token.js.map +2 -2
  98. package/dist/env/helpers.js +1 -47
  99. package/dist/env/helpers.js.map +2 -2
  100. package/dist/env/home.js +1 -28
  101. package/dist/env/home.js.map +2 -2
  102. package/dist/env/jest-worker-id.js +1 -28
  103. package/dist/env/jest-worker-id.js.map +2 -2
  104. package/dist/env/lang.js +1 -28
  105. package/dist/env/lang.js.map +2 -2
  106. package/dist/env/lc-all.js +1 -28
  107. package/dist/env/lc-all.js.map +2 -2
  108. package/dist/env/lc-messages.js +1 -28
  109. package/dist/env/lc-messages.js.map +2 -2
  110. package/dist/env/localappdata.js +1 -28
  111. package/dist/env/localappdata.js.map +2 -2
  112. package/dist/env/node-auth-token.js +1 -28
  113. package/dist/env/node-auth-token.js.map +2 -2
  114. package/dist/env/node-env.js +1 -28
  115. package/dist/env/node-env.js.map +2 -2
  116. package/dist/env/npm-config-registry.js +1 -28
  117. package/dist/env/npm-config-registry.js.map +2 -2
  118. package/dist/env/npm-config-user-agent.js +1 -28
  119. package/dist/env/npm-config-user-agent.js.map +2 -2
  120. package/dist/env/npm-lifecycle-event.js +1 -28
  121. package/dist/env/npm-lifecycle-event.js.map +2 -2
  122. package/dist/env/npm-registry.js +1 -28
  123. package/dist/env/npm-registry.js.map +2 -2
  124. package/dist/env/npm-token.js +1 -28
  125. package/dist/env/npm-token.js.map +2 -2
  126. package/dist/env/path.js +1 -28
  127. package/dist/env/path.js.map +2 -2
  128. package/dist/env/pre-commit.js +1 -29
  129. package/dist/env/pre-commit.js.map +2 -2
  130. package/dist/env/shell.js +1 -28
  131. package/dist/env/shell.js.map +2 -2
  132. package/dist/env/socket-accept-risks.js +1 -29
  133. package/dist/env/socket-accept-risks.js.map +2 -2
  134. package/dist/env/socket-api-base-url.js +1 -28
  135. package/dist/env/socket-api-base-url.js.map +2 -2
  136. package/dist/env/socket-api-proxy.js +1 -28
  137. package/dist/env/socket-api-proxy.js.map +2 -2
  138. package/dist/env/socket-api-timeout.js +1 -29
  139. package/dist/env/socket-api-timeout.js.map +2 -2
  140. package/dist/env/socket-api-token.js +1 -28
  141. package/dist/env/socket-api-token.js.map +2 -2
  142. package/dist/env/socket-cacache-dir.js +1 -28
  143. package/dist/env/socket-cacache-dir.js.map +2 -2
  144. package/dist/env/socket-cli-accept-risks.js +1 -31
  145. package/dist/env/socket-cli-accept-risks.js.map +2 -2
  146. package/dist/env/socket-cli-api-base-url.js +1 -28
  147. package/dist/env/socket-cli-api-base-url.js.map +2 -2
  148. package/dist/env/socket-cli-api-proxy.js +1 -28
  149. package/dist/env/socket-cli-api-proxy.js.map +2 -2
  150. package/dist/env/socket-cli-api-timeout.js +1 -29
  151. package/dist/env/socket-cli-api-timeout.js.map +2 -2
  152. package/dist/env/socket-cli-api-token.js +1 -28
  153. package/dist/env/socket-cli-api-token.js.map +2 -2
  154. package/dist/env/socket-cli-config.js +1 -28
  155. package/dist/env/socket-cli-config.js.map +2 -2
  156. package/dist/env/socket-cli-fix.js +1 -28
  157. package/dist/env/socket-cli-fix.js.map +2 -2
  158. package/dist/env/socket-cli-no-api-token.js +1 -31
  159. package/dist/env/socket-cli-no-api-token.js.map +2 -2
  160. package/dist/env/socket-cli-optimize.js +1 -29
  161. package/dist/env/socket-cli-optimize.js.map +2 -2
  162. package/dist/env/socket-cli-org-slug.js +1 -28
  163. package/dist/env/socket-cli-org-slug.js.map +2 -2
  164. package/dist/env/socket-cli-shadow-accept-risks.js +1 -31
  165. package/dist/env/socket-cli-shadow-accept-risks.js.map +2 -2
  166. package/dist/env/socket-cli-shadow-api-token.js +1 -28
  167. package/dist/env/socket-cli-shadow-api-token.js.map +2 -2
  168. package/dist/env/socket-cli-shadow-bin.js +1 -28
  169. package/dist/env/socket-cli-shadow-bin.js.map +2 -2
  170. package/dist/env/socket-cli-shadow-progress.js +1 -31
  171. package/dist/env/socket-cli-shadow-progress.js.map +2 -2
  172. package/dist/env/socket-cli-shadow-silent.js +1 -31
  173. package/dist/env/socket-cli-shadow-silent.js.map +2 -2
  174. package/dist/env/socket-cli-view-all-risks.js +1 -31
  175. package/dist/env/socket-cli-view-all-risks.js.map +2 -2
  176. package/dist/env/socket-config.js +1 -28
  177. package/dist/env/socket-config.js.map +2 -2
  178. package/dist/env/socket-debug.js +1 -28
  179. package/dist/env/socket-debug.js.map +2 -2
  180. package/dist/env/socket-home.js +1 -28
  181. package/dist/env/socket-home.js.map +2 -2
  182. package/dist/env/socket-no-api-token.js +1 -29
  183. package/dist/env/socket-no-api-token.js.map +2 -2
  184. package/dist/env/socket-npm-registry.js +1 -28
  185. package/dist/env/socket-npm-registry.js.map +2 -2
  186. package/dist/env/socket-org-slug.js +1 -28
  187. package/dist/env/socket-org-slug.js.map +2 -2
  188. package/dist/env/socket-registry-url.js +1 -28
  189. package/dist/env/socket-registry-url.js.map +2 -2
  190. package/dist/env/socket-view-all-risks.js +1 -29
  191. package/dist/env/socket-view-all-risks.js.map +2 -2
  192. package/dist/env/temp.js +1 -28
  193. package/dist/env/temp.js.map +2 -2
  194. package/dist/env/term.js +1 -28
  195. package/dist/env/term.js.map +2 -2
  196. package/dist/env/tmp.js +1 -28
  197. package/dist/env/tmp.js.map +2 -2
  198. package/dist/env/tmpdir.js +1 -28
  199. package/dist/env/tmpdir.js.map +2 -2
  200. package/dist/env/userprofile.js +1 -28
  201. package/dist/env/userprofile.js.map +2 -2
  202. package/dist/env/vitest.js +1 -29
  203. package/dist/env/vitest.js.map +2 -2
  204. package/dist/env/xdg-cache-home.js +1 -28
  205. package/dist/env/xdg-cache-home.js.map +2 -2
  206. package/dist/env/xdg-config-home.js +1 -28
  207. package/dist/env/xdg-config-home.js.map +2 -2
  208. package/dist/env/xdg-data-home.js +1 -28
  209. package/dist/env/xdg-data-home.js.map +2 -2
  210. package/dist/env.js +1 -61
  211. package/dist/env.js.map +2 -2
  212. package/dist/fs.js +3 -626
  213. package/dist/fs.js.map +2 -2
  214. package/dist/functions.js +1 -68
  215. package/dist/functions.js.map +2 -2
  216. package/dist/git.js +2 -320
  217. package/dist/git.js.map +2 -2
  218. package/dist/github.js +1 -201
  219. package/dist/github.js.map +2 -2
  220. package/dist/globs.js +1 -152
  221. package/dist/globs.js.map +2 -2
  222. package/dist/http-request.js +1 -313
  223. package/dist/http-request.js.map +2 -2
  224. package/dist/index.js +1 -62
  225. package/dist/index.js.map +2 -2
  226. package/dist/ipc.js +1 -232
  227. package/dist/ipc.js.map +2 -2
  228. package/dist/json.js +1 -73
  229. package/dist/json.js.map +2 -2
  230. package/dist/logger.js +1 -1254
  231. package/dist/logger.js.map +2 -2
  232. package/dist/maintained-node-versions.js +1 -35
  233. package/dist/maintained-node-versions.js.map +2 -2
  234. package/dist/memoization.js +1 -210
  235. package/dist/memoization.js.map +2 -2
  236. package/dist/objects.d.ts +0 -3
  237. package/dist/objects.js +1 -319
  238. package/dist/objects.js.map +3 -3
  239. package/dist/packages/editable.js +9 -356
  240. package/dist/packages/editable.js.map +2 -2
  241. package/dist/packages/exports.js +1 -162
  242. package/dist/packages/exports.js.map +2 -2
  243. package/dist/packages/isolation.js +1 -195
  244. package/dist/packages/isolation.js.map +2 -2
  245. package/dist/packages/licenses.js +1 -214
  246. package/dist/packages/licenses.js.map +2 -2
  247. package/dist/packages/manifest.js +1 -190
  248. package/dist/packages/manifest.js.map +2 -2
  249. package/dist/packages/normalize.js +1 -120
  250. package/dist/packages/normalize.js.map +2 -2
  251. package/dist/packages/operations.js +1 -304
  252. package/dist/packages/operations.js.map +2 -2
  253. package/dist/packages/paths.js +1 -53
  254. package/dist/packages/paths.js.map +2 -2
  255. package/dist/packages/provenance.js +1 -178
  256. package/dist/packages/provenance.js.map +2 -2
  257. package/dist/packages/registry.js +1 -28
  258. package/dist/packages/registry.js.map +2 -2
  259. package/dist/packages/specs.js +1 -83
  260. package/dist/packages/specs.js.map +2 -2
  261. package/dist/packages/validation.js +1 -51
  262. package/dist/packages/validation.js.map +2 -2
  263. package/dist/packages.js +1 -129
  264. package/dist/packages.js.map +2 -2
  265. package/dist/path.js +1 -448
  266. package/dist/path.js.map +2 -2
  267. package/dist/paths.js +1 -143
  268. package/dist/paths.js.map +2 -2
  269. package/dist/performance.js +15 -216
  270. package/dist/performance.js.map +2 -2
  271. package/dist/promise-queue.js +1 -109
  272. package/dist/promise-queue.js.map +2 -2
  273. package/dist/promises.js +1 -269
  274. package/dist/promises.js.map +2 -2
  275. package/dist/prompts.js +1 -58
  276. package/dist/prompts.js.map +2 -2
  277. package/dist/regexps.js +1 -30
  278. package/dist/regexps.js.map +2 -2
  279. package/dist/sea.js +1 -44
  280. package/dist/sea.js.map +2 -2
  281. package/dist/shadow.js +1 -58
  282. package/dist/shadow.js.map +2 -2
  283. package/dist/signal-exit.js +1 -248
  284. package/dist/signal-exit.js.map +2 -2
  285. package/dist/sorts.js +1 -94
  286. package/dist/sorts.js.map +2 -2
  287. package/dist/spawn.js +1 -199
  288. package/dist/spawn.js.map +2 -2
  289. package/dist/spinner.js +1 -865
  290. package/dist/spinner.js.map +2 -2
  291. package/dist/ssri.js +1 -71
  292. package/dist/ssri.js.map +2 -2
  293. package/dist/stdio/clear.js +1 -82
  294. package/dist/stdio/clear.js.map +2 -2
  295. package/dist/stdio/divider.js +3 -89
  296. package/dist/stdio/divider.js.map +2 -2
  297. package/dist/stdio/footer.js +2 -94
  298. package/dist/stdio/footer.js.map +2 -2
  299. package/dist/stdio/header.js +2 -100
  300. package/dist/stdio/header.js.map +2 -2
  301. package/dist/stdio/mask.js +5 -206
  302. package/dist/stdio/mask.js.map +2 -2
  303. package/dist/stdio/progress.js +2 -209
  304. package/dist/stdio/progress.js.map +2 -2
  305. package/dist/stdio/prompts.js +1 -88
  306. package/dist/stdio/prompts.js.map +2 -2
  307. package/dist/stdio/stderr.js +2 -89
  308. package/dist/stdio/stderr.js.map +2 -2
  309. package/dist/stdio/stdout.js +2 -103
  310. package/dist/stdio/stdout.js.map +2 -2
  311. package/dist/streams.js +1 -78
  312. package/dist/streams.js.map +2 -2
  313. package/dist/strings.js +3 -251
  314. package/dist/strings.js.map +2 -2
  315. package/dist/suppress-warnings.js +1 -98
  316. package/dist/suppress-warnings.js.map +2 -2
  317. package/dist/tables.js +3 -128
  318. package/dist/tables.js.map +2 -2
  319. package/dist/temporary-executor.js +1 -53
  320. package/dist/temporary-executor.js.map +2 -2
  321. package/dist/types.js +1 -72
  322. package/dist/types.js.map +2 -2
  323. package/dist/url.js +1 -142
  324. package/dist/url.js.map +2 -2
  325. package/dist/utils/get-ipc.js +1 -58
  326. package/dist/utils/get-ipc.js.map +2 -2
  327. package/dist/validation/json-parser.js +1 -127
  328. package/dist/validation/json-parser.js.map +2 -2
  329. package/dist/validation/types.js +1 -15
  330. package/dist/validation/types.js.map +2 -2
  331. package/dist/versions.js +1 -153
  332. package/dist/versions.js.map +2 -2
  333. package/dist/words.js +1 -50
  334. package/dist/words.js.map +2 -2
  335. package/dist/zod.js +1 -27
  336. package/dist/zod.js.map +2 -2
  337. package/package.json +2 -2
@@ -1,96 +1,4 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var footer_exports = {};
30
- __export(footer_exports, {
31
- createFooter: () => createFooter,
32
- createSummaryFooter: () => createSummaryFooter
33
- });
34
- module.exports = __toCommonJS(footer_exports);
35
- var import_yoctocolors_cjs = __toESM(require("../external/yoctocolors-cjs"));
36
- var import_strings = require("../strings");
37
- function createFooter(message, options) {
38
- const {
39
- borderChar = "=",
40
- color = "gray",
41
- showDuration = false,
42
- showTimestamp = false,
43
- startTime,
44
- width = 80
45
- } = { __proto__: null, ...options };
46
- const border = (0, import_strings.repeatString)(borderChar, width);
47
- const lines = [];
48
- if (message) {
49
- const colorFn = color && import_yoctocolors_cjs.default[color] ? import_yoctocolors_cjs.default[color] : (s) => s;
50
- lines.push(colorFn(message));
51
- }
52
- if (showTimestamp) {
53
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
54
- lines.push(import_yoctocolors_cjs.default.gray(`Completed at: ${timestamp}`));
55
- }
56
- if (showDuration && startTime) {
57
- const duration = Date.now() - startTime;
58
- const seconds = (duration / 1e3).toFixed(2);
59
- lines.push(import_yoctocolors_cjs.default.gray(`Duration: ${seconds}s`));
60
- }
61
- lines.push(border);
62
- return lines.join("\n");
63
- }
64
- function createSummaryFooter(stats, options) {
65
- const parts = [];
66
- if (stats.total !== void 0) {
67
- parts.push(`Total: ${stats.total}`);
68
- }
69
- if (stats.success !== void 0) {
70
- parts.push(import_yoctocolors_cjs.default.green(`\u2713 ${stats.success} passed`));
71
- }
72
- if (stats.failed !== void 0 && stats.failed > 0) {
73
- parts.push(import_yoctocolors_cjs.default.red(`\u2717 ${stats.failed} failed`));
74
- }
75
- if (stats.skipped !== void 0 && stats.skipped > 0) {
76
- parts.push(import_yoctocolors_cjs.default.yellow(`\u25CB ${stats.skipped} skipped`));
77
- }
78
- if (stats.warnings !== void 0 && stats.warnings > 0) {
79
- parts.push(import_yoctocolors_cjs.default.yellow(`\u26A0 ${stats.warnings} warnings`));
80
- }
81
- if (stats.errors !== void 0 && stats.errors > 0) {
82
- parts.push(import_yoctocolors_cjs.default.red(`\u2717 ${stats.errors} errors`));
83
- }
84
- const message = parts.join(" | ");
85
- return createFooter(message, {
86
- ...options,
87
- showDuration: stats.duration !== void 0,
88
- ...stats.duration !== void 0 && { startTime: stats.duration }
89
- });
90
- }
91
- // Annotate the CommonJS export names for ESM import in node:
92
- 0 && (module.exports = {
93
- createFooter,
94
- createSummaryFooter
95
- });
2
+ var w=Object.create;var f=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var $=(e,r)=>{for(var n in r)f(e,n,{get:r[n],enumerable:!0})},p=(e,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of y(r))!S.call(e,d)&&d!==n&&f(e,d,{get:()=>r[d],enumerable:!(o=b(r,d))||o.enumerable});return e};var D=(e,r,n)=>(n=e!=null?w(F(e)):{},p(r||!e||!e.__esModule?f(n,"default",{value:e,enumerable:!0}):n,e)),T=e=>p(f({},"__esModule",{value:!0}),e);var x={};$(x,{createFooter:()=>l,createSummaryFooter:()=>k});module.exports=T(x);var i=D(require("../external/yoctocolors-cjs")),m=require("../strings");function l(e,r){const{borderChar:n="=",color:o="gray",showDuration:d=!1,showTimestamp:c=!1,startTime:a,width:g=80}={__proto__:null,...r},h=(0,m.repeatString)(n,g),u=[];if(e){const t=o&&i.default[o]?i.default[o]:s=>s;u.push(t(e))}if(c){const t=new Date().toISOString();u.push(i.default.gray(`Completed at: ${t}`))}if(d&&a){const s=((Date.now()-a)/1e3).toFixed(2);u.push(i.default.gray(`Duration: ${s}s`))}return u.push(h),u.join(`
3
+ `)}function k(e,r){const n=[];e.total!==void 0&&n.push(`Total: ${e.total}`),e.success!==void 0&&n.push(i.default.green(`\u2713 ${e.success} passed`)),e.failed!==void 0&&e.failed>0&&n.push(i.default.red(`\u2717 ${e.failed} failed`)),e.skipped!==void 0&&e.skipped>0&&n.push(i.default.yellow(`\u25CB ${e.skipped} skipped`)),e.warnings!==void 0&&e.warnings>0&&n.push(i.default.yellow(`\u26A0 ${e.warnings} warnings`)),e.errors!==void 0&&e.errors>0&&n.push(i.default.red(`\u2717 ${e.errors} errors`));const o=n.join(" | ");return l(o,{...r,showDuration:e.duration!==void 0,...e.duration!==void 0&&{startTime:e.duration}})}0&&(module.exports={createFooter,createSummaryFooter});
96
4
  //# sourceMappingURL=footer.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/stdio/footer.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Console footer/summary formatting utilities.\n * Provides consistent footer and summary formatting for CLI applications.\n */\n\nimport colors from '../external/yoctocolors-cjs'\nimport { repeatString } from '../strings'\n\nexport interface FooterOptions {\n /**\n * Width of the footer border in characters.\n * @default 80\n */\n width?: number | undefined\n /**\n * Character to use for the border line.\n * @default '='\n */\n borderChar?: string | undefined\n /**\n * Include ISO timestamp in footer.\n * @default false\n */\n showTimestamp?: boolean | undefined\n /**\n * Show duration since start time.\n * @default false\n */\n showDuration?: boolean | undefined\n /**\n * Start time in milliseconds (from Date.now()).\n * Required when `showDuration` is true.\n */\n startTime?: number | undefined\n /**\n * Color to apply to the footer message.\n * @default 'gray'\n */\n color?:\n | 'cyan'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'red'\n | 'gray'\n | undefined\n}\n\nexport interface SummaryStats {\n /** Total number of items processed */\n total?: number | undefined\n /** Number of successful items */\n success?: number | undefined\n /** Number of failed items */\n failed?: number | undefined\n /** Number of skipped items */\n skipped?: number | undefined\n /** Number of warnings */\n warnings?: number | undefined\n /** Number of errors */\n errors?: number | undefined\n /** Duration in milliseconds (timestamp value, not elapsed time) */\n duration?: number | undefined\n}\n\n/**\n * Create a formatted footer with optional message, timestamp, and duration.\n * Useful for marking the end of CLI output or showing completion status.\n *\n * @param message - Optional message to display in footer\n * @param options - Footer formatting options\n * @returns Formatted footer string with border and optional info\n *\n * @example\n * ```ts\n * const startTime = Date.now()\n * // ... do work\n * console.log(createFooter('Build complete', {\n * width: 60,\n * color: 'green',\n * showDuration: true,\n * startTime\n * }))\n * ```\n */\nexport function createFooter(\n message?: string | undefined,\n options?: FooterOptions,\n): string {\n const {\n borderChar = '=',\n color = 'gray',\n showDuration = false,\n showTimestamp = false,\n startTime,\n width = 80,\n } = { __proto__: null, ...options } as FooterOptions\n\n const border = repeatString(borderChar, width)\n const lines: string[] = []\n\n if (message) {\n const colorFn = color && colors[color] ? colors[color] : (s: string) => s\n lines.push(colorFn(message))\n }\n\n if (showTimestamp) {\n const timestamp = new Date().toISOString()\n lines.push(colors.gray(`Completed at: ${timestamp}`))\n }\n\n if (showDuration && startTime) {\n const duration = Date.now() - startTime\n const seconds = (duration / 1000).toFixed(2)\n lines.push(colors.gray(`Duration: ${seconds}s`))\n }\n\n lines.push(border)\n return lines.join('\\n')\n}\n\n/**\n * Create a summary footer with statistics and colored status indicators.\n * Automatically formats success/failure/warning counts with appropriate colors.\n * Useful for test results, build summaries, or batch operation reports.\n *\n * @param stats - Statistics to display in the summary\n * @param options - Footer formatting options\n * @returns Formatted summary footer string with colored indicators\n *\n * @example\n * ```ts\n * console.log(createSummaryFooter({\n * total: 150,\n * success: 145,\n * failed: 3,\n * skipped: 2,\n * warnings: 5\n * }))\n * // Output: Total: 150 | \u2713 145 passed | \u2717 3 failed | \u25CB 2 skipped | \u26A0 5 warnings\n * // ========================================\n * ```\n */\nexport function createSummaryFooter(\n stats: SummaryStats,\n options?: FooterOptions,\n): string {\n const parts: string[] = []\n\n if (stats.total !== undefined) {\n parts.push(`Total: ${stats.total}`)\n }\n\n if (stats.success !== undefined) {\n parts.push(colors.green(`\u2713 ${stats.success} passed`))\n }\n\n if (stats.failed !== undefined && stats.failed > 0) {\n parts.push(colors.red(`\u2717 ${stats.failed} failed`))\n }\n\n if (stats.skipped !== undefined && stats.skipped > 0) {\n parts.push(colors.yellow(`\u25CB ${stats.skipped} skipped`))\n }\n\n if (stats.warnings !== undefined && stats.warnings > 0) {\n parts.push(colors.yellow(`\u26A0 ${stats.warnings} warnings`))\n }\n\n if (stats.errors !== undefined && stats.errors > 0) {\n parts.push(colors.red(`\u2717 ${stats.errors} errors`))\n }\n\n const message = parts.join(' | ')\n return createFooter(message, {\n ...options,\n showDuration: stats.duration !== undefined,\n ...(stats.duration !== undefined && { startTime: stats.duration }),\n })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,6BAAmB;AACnB,qBAA6B;AAgFtB,SAAS,aACd,SACA,SACQ;AACR,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,EACV,IAAI,EAAE,WAAW,MAAM,GAAG,QAAQ;AAElC,QAAM,aAAS,6BAAa,YAAY,KAAK;AAC7C,QAAM,QAAkB,CAAC;AAEzB,MAAI,SAAS;AACX,UAAM,UAAU,SAAS,uBAAAA,QAAO,KAAK,IAAI,uBAAAA,QAAO,KAAK,IAAI,CAAC,MAAc;AACxE,UAAM,KAAK,QAAQ,OAAO,CAAC;AAAA,EAC7B;AAEA,MAAI,eAAe;AACjB,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,KAAK,uBAAAA,QAAO,KAAK,iBAAiB,SAAS,EAAE,CAAC;AAAA,EACtD;AAEA,MAAI,gBAAgB,WAAW;AAC7B,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,UAAM,WAAW,WAAW,KAAM,QAAQ,CAAC;AAC3C,UAAM,KAAK,uBAAAA,QAAO,KAAK,aAAa,OAAO,GAAG,CAAC;AAAA,EACjD;AAEA,QAAM,KAAK,MAAM;AACjB,SAAO,MAAM,KAAK,IAAI;AACxB;AAwBO,SAAS,oBACd,OACA,SACQ;AACR,QAAM,QAAkB,CAAC;AAEzB,MAAI,MAAM,UAAU,QAAW;AAC7B,UAAM,KAAK,UAAU,MAAM,KAAK,EAAE;AAAA,EACpC;AAEA,MAAI,MAAM,YAAY,QAAW;AAC/B,UAAM,KAAK,uBAAAA,QAAO,MAAM,UAAK,MAAM,OAAO,SAAS,CAAC;AAAA,EACtD;AAEA,MAAI,MAAM,WAAW,UAAa,MAAM,SAAS,GAAG;AAClD,UAAM,KAAK,uBAAAA,QAAO,IAAI,UAAK,MAAM,MAAM,SAAS,CAAC;AAAA,EACnD;AAEA,MAAI,MAAM,YAAY,UAAa,MAAM,UAAU,GAAG;AACpD,UAAM,KAAK,uBAAAA,QAAO,OAAO,UAAK,MAAM,OAAO,UAAU,CAAC;AAAA,EACxD;AAEA,MAAI,MAAM,aAAa,UAAa,MAAM,WAAW,GAAG;AACtD,UAAM,KAAK,uBAAAA,QAAO,OAAO,UAAK,MAAM,QAAQ,WAAW,CAAC;AAAA,EAC1D;AAEA,MAAI,MAAM,WAAW,UAAa,MAAM,SAAS,GAAG;AAClD,UAAM,KAAK,uBAAAA,QAAO,IAAI,UAAK,MAAM,MAAM,SAAS,CAAC;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,KAAK,KAAK;AAChC,SAAO,aAAa,SAAS;AAAA,IAC3B,GAAG;AAAA,IACH,cAAc,MAAM,aAAa;AAAA,IACjC,GAAI,MAAM,aAAa,UAAa,EAAE,WAAW,MAAM,SAAS;AAAA,EAClE,CAAC;AACH;",
6
- "names": ["colors"]
5
+ "mappings": ";6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,wBAAAC,IAAA,eAAAC,EAAAJ,GAKA,IAAAK,EAAmB,0CACnBC,EAA6B,sBAgFtB,SAASJ,EACdK,EACAC,EACQ,CACR,KAAM,CACJ,WAAAC,EAAa,IACb,MAAAC,EAAQ,OACR,aAAAC,EAAe,GACf,cAAAC,EAAgB,GAChB,UAAAC,EACA,MAAAC,EAAQ,EACV,EAAI,CAAE,UAAW,KAAM,GAAGN,CAAQ,EAE5BO,KAAS,gBAAaN,EAAYK,CAAK,EACvCE,EAAkB,CAAC,EAEzB,GAAIT,EAAS,CACX,MAAMU,EAAUP,GAAS,EAAAQ,QAAOR,CAAK,EAAI,EAAAQ,QAAOR,CAAK,EAAK,GAAc,EACxEM,EAAM,KAAKC,EAAQV,CAAO,CAAC,CAC7B,CAEA,GAAIK,EAAe,CACjB,MAAMO,EAAY,IAAI,KAAK,EAAE,YAAY,EACzCH,EAAM,KAAK,EAAAE,QAAO,KAAK,iBAAiBC,CAAS,EAAE,CAAC,CACtD,CAEA,GAAIR,GAAgBE,EAAW,CAE7B,MAAMO,IADW,KAAK,IAAI,EAAIP,GACF,KAAM,QAAQ,CAAC,EAC3CG,EAAM,KAAK,EAAAE,QAAO,KAAK,aAAaE,CAAO,GAAG,CAAC,CACjD,CAEA,OAAAJ,EAAM,KAAKD,CAAM,EACVC,EAAM,KAAK;AAAA,CAAI,CACxB,CAwBO,SAASb,EACdkB,EACAb,EACQ,CACR,MAAMc,EAAkB,CAAC,EAErBD,EAAM,QAAU,QAClBC,EAAM,KAAK,UAAUD,EAAM,KAAK,EAAE,EAGhCA,EAAM,UAAY,QACpBC,EAAM,KAAK,EAAAJ,QAAO,MAAM,UAAKG,EAAM,OAAO,SAAS,CAAC,EAGlDA,EAAM,SAAW,QAAaA,EAAM,OAAS,GAC/CC,EAAM,KAAK,EAAAJ,QAAO,IAAI,UAAKG,EAAM,MAAM,SAAS,CAAC,EAG/CA,EAAM,UAAY,QAAaA,EAAM,QAAU,GACjDC,EAAM,KAAK,EAAAJ,QAAO,OAAO,UAAKG,EAAM,OAAO,UAAU,CAAC,EAGpDA,EAAM,WAAa,QAAaA,EAAM,SAAW,GACnDC,EAAM,KAAK,EAAAJ,QAAO,OAAO,UAAKG,EAAM,QAAQ,WAAW,CAAC,EAGtDA,EAAM,SAAW,QAAaA,EAAM,OAAS,GAC/CC,EAAM,KAAK,EAAAJ,QAAO,IAAI,UAAKG,EAAM,MAAM,SAAS,CAAC,EAGnD,MAAMd,EAAUe,EAAM,KAAK,KAAK,EAChC,OAAOpB,EAAaK,EAAS,CAC3B,GAAGC,EACH,aAAca,EAAM,WAAa,OACjC,GAAIA,EAAM,WAAa,QAAa,CAAE,UAAWA,EAAM,QAAS,CAClE,CAAC,CACH",
6
+ "names": ["footer_exports", "__export", "createFooter", "createSummaryFooter", "__toCommonJS", "import_yoctocolors_cjs", "import_strings", "message", "options", "borderChar", "color", "showDuration", "showTimestamp", "startTime", "width", "border", "lines", "colorFn", "colors", "timestamp", "seconds", "stats", "parts"]
7
7
  }
@@ -1,102 +1,4 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var header_exports = {};
30
- __export(header_exports, {
31
- createHeader: () => createHeader,
32
- createSectionHeader: () => createSectionHeader,
33
- printFooter: () => printFooter,
34
- printHeader: () => printHeader
35
- });
36
- module.exports = __toCommonJS(header_exports);
37
- var import_yoctocolors_cjs = __toESM(require("../external/yoctocolors-cjs"));
38
- var import_strings = require("../strings");
39
- function createHeader(title, options) {
40
- const {
41
- bold = true,
42
- borderChar = "=",
43
- color = "cyan",
44
- padding = 1,
45
- width = 80
46
- } = { __proto__: null, ...options };
47
- const border = (0, import_strings.repeatString)(borderChar, width);
48
- let formattedTitle = title;
49
- if (color && import_yoctocolors_cjs.default[color]) {
50
- formattedTitle = import_yoctocolors_cjs.default[color](formattedTitle);
51
- }
52
- if (bold && import_yoctocolors_cjs.default.bold) {
53
- formattedTitle = import_yoctocolors_cjs.default.bold(formattedTitle);
54
- }
55
- const centeredTitle = (0, import_strings.centerText)(formattedTitle, width);
56
- const paddingLine = (0, import_strings.repeatString)(" ", width);
57
- const lines = [border];
58
- for (let i = 0; i < padding; i++) {
59
- lines.push(paddingLine);
60
- }
61
- lines.push(centeredTitle);
62
- for (let i = 0; i < padding; i++) {
63
- lines.push(paddingLine);
64
- }
65
- lines.push(border);
66
- return lines.join("\n");
67
- }
68
- function createSectionHeader(title, options) {
69
- const {
70
- borderChar = "-",
71
- color = "blue",
72
- width = 60
73
- } = { __proto__: null, ...options };
74
- return createHeader(title, {
75
- width,
76
- borderChar,
77
- padding: 0,
78
- color,
79
- bold: false
80
- });
81
- }
82
- function printHeader(title) {
83
- const border = (0, import_strings.repeatString)("\u2550", 55);
84
- console.log(border);
85
- console.log(` ${title}`);
86
- console.log(border);
87
- }
88
- function printFooter(message) {
89
- const border = (0, import_strings.repeatString)("\u2500", 55);
90
- console.log(border);
91
- if (message) {
92
- console.log(import_yoctocolors_cjs.default.green(message));
93
- }
94
- }
95
- // Annotate the CommonJS export names for ESM import in node:
96
- 0 && (module.exports = {
97
- createHeader,
98
- createSectionHeader,
99
- printFooter,
100
- printHeader
101
- });
2
+ var _=Object.create;var a=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var y=(e,o)=>{for(var n in o)a(e,n,{get:o[n],enumerable:!0})},b=(e,o,n,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of x(o))!w.call(e,r)&&r!==n&&a(e,r,{get:()=>o[r],enumerable:!(i=m(o,r))||i.enumerable});return e};var C=(e,o,n)=>(n=e!=null?_(O(e)):{},b(o||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e)),T=e=>b(a({},"__esModule",{value:!0}),e);var F={};y(F,{createHeader:()=>h,createSectionHeader:()=>v,printFooter:()=>j,printHeader:()=>S});module.exports=T(F);var d=C(require("../external/yoctocolors-cjs")),t=require("../strings");function h(e,o){const{bold:n=!0,borderChar:i="=",color:r="cyan",padding:u=1,width:p=80}={__proto__:null,...o},g=(0,t.repeatString)(i,p);let l=e;r&&d.default[r]&&(l=d.default[r](l)),n&&d.default.bold&&(l=d.default.bold(l));const H=(0,t.centerText)(l,p),f=(0,t.repeatString)(" ",p),s=[g];for(let c=0;c<u;c++)s.push(f);s.push(H);for(let c=0;c<u;c++)s.push(f);return s.push(g),s.join(`
3
+ `)}function v(e,o){const{borderChar:n="-",color:i="blue",width:r=60}={__proto__:null,...o};return h(e,{width:r,borderChar:n,padding:0,color:i,bold:!1})}function S(e){const o=(0,t.repeatString)("\u2550",55);console.log(o),console.log(` ${e}`),console.log(o)}function j(e){const o=(0,t.repeatString)("\u2500",55);console.log(o),e&&console.log(d.default.green(e))}0&&(module.exports={createHeader,createSectionHeader,printFooter,printHeader});
102
4
  //# sourceMappingURL=header.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/stdio/header.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Console header/banner formatting utilities.\n * Provides consistent header formatting for CLI applications.\n */\n\nimport colors from '../external/yoctocolors-cjs'\nimport { centerText, repeatString } from '../strings'\n\nexport interface HeaderOptions {\n /**\n * Width of the header in characters.\n * @default 80\n */\n width?: number | undefined\n /**\n * Character to use for border lines.\n * @default '='\n */\n borderChar?: string | undefined\n /**\n * Number of blank lines above and below title.\n * @default 1\n */\n padding?: number | undefined\n /**\n * Color to apply to the title text.\n * @default 'cyan'\n */\n color?:\n | 'cyan'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'red'\n | 'gray'\n | undefined\n /**\n * Apply bold styling to title.\n * @default true\n */\n bold?: boolean | undefined\n}\n\n/**\n * Create a formatted header/banner with borders and centered title.\n * Useful for marking the start of CLI output or creating visual sections.\n *\n * @param title - Title text to display in header\n * @param options - Header formatting options\n * @returns Formatted header string with borders and centered title\n *\n * @example\n * ```ts\n * console.log(createHeader('Socket Security Analysis', {\n * width: 70,\n * color: 'cyan',\n * bold: true,\n * padding: 2\n * }))\n * // Output:\n * // ======================================================================\n * //\n * // Socket Security Analysis\n * //\n * // ======================================================================\n * ```\n */\nexport function createHeader(title: string, options?: HeaderOptions): string {\n const {\n bold = true,\n borderChar = '=',\n color = 'cyan',\n padding = 1,\n width = 80,\n } = { __proto__: null, ...options } as HeaderOptions\n\n const border = repeatString(borderChar, width)\n\n // Apply color and bold\n let formattedTitle = title\n if (color && colors[color]) {\n formattedTitle = colors[color](formattedTitle)\n }\n if (bold && colors.bold) {\n formattedTitle = colors.bold(formattedTitle)\n }\n\n const centeredTitle = centerText(formattedTitle, width)\n const paddingLine = repeatString(' ', width)\n\n const lines: string[] = [border]\n\n for (let i = 0; i < padding; i++) {\n lines.push(paddingLine)\n }\n\n lines.push(centeredTitle)\n\n for (let i = 0; i < padding; i++) {\n lines.push(paddingLine)\n }\n\n lines.push(border)\n\n return lines.join('\\n')\n}\n\n/**\n * Create a simple section header without padding.\n * A lighter-weight alternative to `createHeader()` for subsections.\n *\n * @param title - Title text to display in header\n * @param options - Header formatting options\n * @returns Formatted section header string\n *\n * @example\n * ```ts\n * console.log(createSectionHeader('Dependencies', {\n * width: 50,\n * color: 'blue'\n * }))\n * // Output:\n * // --------------------------------------------------\n * // Dependencies\n * // --------------------------------------------------\n * ```\n */\nexport function createSectionHeader(\n title: string,\n options?: HeaderOptions,\n): string {\n const {\n borderChar = '-',\n color = 'blue',\n width = 60,\n } = { __proto__: null, ...options } as HeaderOptions\n\n return createHeader(title, {\n width,\n borderChar,\n padding: 0,\n color,\n bold: false,\n })\n}\n\n/**\n * Print a header directly to stdout with standard formatting.\n * Uses fixed width of 55 characters with `\u2550` borders.\n * Simpler alternative to `createHeader()` for quick headers.\n *\n * @param title - Title text to display\n *\n * @example\n * ```ts\n * printHeader('Package Analysis')\n * // Output:\n * // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n * // Package Analysis\n * // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n * ```\n */\nexport function printHeader(title: string): void {\n const border = repeatString('\u2550', 55)\n console.log(border)\n console.log(` ${title}`)\n console.log(border)\n}\n\n/**\n * Print a footer with optional success message.\n * Uses `\u2500` border character for a lighter appearance.\n * Fixed width of 55 characters to match `printHeader()`.\n *\n * @param message - Optional message to display (shown in green)\n *\n * @example\n * ```ts\n * printFooter('Analysis complete')\n * // Output:\n * // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * // Analysis complete (in green)\n * ```\n */\nexport function printFooter(message?: string | undefined): void {\n const border = repeatString('\u2500', 55)\n console.log(border)\n if (message) {\n console.log(colors.green(message))\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,6BAAmB;AACnB,qBAAyC;AA8DlC,SAAS,aAAa,OAAe,SAAiC;AAC3E,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,IAAI,EAAE,WAAW,MAAM,GAAG,QAAQ;AAElC,QAAM,aAAS,6BAAa,YAAY,KAAK;AAG7C,MAAI,iBAAiB;AACrB,MAAI,SAAS,uBAAAA,QAAO,KAAK,GAAG;AAC1B,qBAAiB,uBAAAA,QAAO,KAAK,EAAE,cAAc;AAAA,EAC/C;AACA,MAAI,QAAQ,uBAAAA,QAAO,MAAM;AACvB,qBAAiB,uBAAAA,QAAO,KAAK,cAAc;AAAA,EAC7C;AAEA,QAAM,oBAAgB,2BAAW,gBAAgB,KAAK;AACtD,QAAM,kBAAc,6BAAa,KAAK,KAAK;AAE3C,QAAM,QAAkB,CAAC,MAAM;AAE/B,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,UAAM,KAAK,WAAW;AAAA,EACxB;AAEA,QAAM,KAAK,aAAa;AAExB,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,UAAM,KAAK,WAAW;AAAA,EACxB;AAEA,QAAM,KAAK,MAAM;AAEjB,SAAO,MAAM,KAAK,IAAI;AACxB;AAsBO,SAAS,oBACd,OACA,SACQ;AACR,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,IAAI,EAAE,WAAW,MAAM,GAAG,QAAQ;AAElC,SAAO,aAAa,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACH;AAkBO,SAAS,YAAY,OAAqB;AAC/C,QAAM,aAAS,6BAAa,UAAK,EAAE;AACnC,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAI,KAAK,KAAK,EAAE;AACxB,UAAQ,IAAI,MAAM;AACpB;AAiBO,SAAS,YAAY,SAAoC;AAC9D,QAAM,aAAS,6BAAa,UAAK,EAAE;AACnC,UAAQ,IAAI,MAAM;AAClB,MAAI,SAAS;AACX,YAAQ,IAAI,uBAAAA,QAAO,MAAM,OAAO,CAAC;AAAA,EACnC;AACF;",
6
- "names": ["colors"]
5
+ "mappings": ";6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,wBAAAC,EAAA,gBAAAC,EAAA,gBAAAC,IAAA,eAAAC,EAAAN,GAKA,IAAAO,EAAmB,0CACnBC,EAAyC,sBA8DlC,SAASN,EAAaO,EAAeC,EAAiC,CAC3E,KAAM,CACJ,KAAAC,EAAO,GACP,WAAAC,EAAa,IACb,MAAAC,EAAQ,OACR,QAAAC,EAAU,EACV,MAAAC,EAAQ,EACV,EAAI,CAAE,UAAW,KAAM,GAAGL,CAAQ,EAE5BM,KAAS,gBAAaJ,EAAYG,CAAK,EAG7C,IAAIE,EAAiBR,EACjBI,GAAS,EAAAK,QAAOL,CAAK,IACvBI,EAAiB,EAAAC,QAAOL,CAAK,EAAEI,CAAc,GAE3CN,GAAQ,EAAAO,QAAO,OACjBD,EAAiB,EAAAC,QAAO,KAAKD,CAAc,GAG7C,MAAME,KAAgB,cAAWF,EAAgBF,CAAK,EAChDK,KAAc,gBAAa,IAAKL,CAAK,EAErCM,EAAkB,CAACL,CAAM,EAE/B,QAASM,EAAI,EAAGA,EAAIR,EAASQ,IAC3BD,EAAM,KAAKD,CAAW,EAGxBC,EAAM,KAAKF,CAAa,EAExB,QAASG,EAAI,EAAGA,EAAIR,EAASQ,IAC3BD,EAAM,KAAKD,CAAW,EAGxB,OAAAC,EAAM,KAAKL,CAAM,EAEVK,EAAM,KAAK;AAAA,CAAI,CACxB,CAsBO,SAASlB,EACdM,EACAC,EACQ,CACR,KAAM,CACJ,WAAAE,EAAa,IACb,MAAAC,EAAQ,OACR,MAAAE,EAAQ,EACV,EAAI,CAAE,UAAW,KAAM,GAAGL,CAAQ,EAElC,OAAOR,EAAaO,EAAO,CACzB,MAAAM,EACA,WAAAH,EACA,QAAS,EACT,MAAAC,EACA,KAAM,EACR,CAAC,CACH,CAkBO,SAASR,EAAYI,EAAqB,CAC/C,MAAMO,KAAS,gBAAa,SAAK,EAAE,EACnC,QAAQ,IAAIA,CAAM,EAClB,QAAQ,IAAI,KAAKP,CAAK,EAAE,EACxB,QAAQ,IAAIO,CAAM,CACpB,CAiBO,SAASZ,EAAYmB,EAAoC,CAC9D,MAAMP,KAAS,gBAAa,SAAK,EAAE,EACnC,QAAQ,IAAIA,CAAM,EACdO,GACF,QAAQ,IAAI,EAAAL,QAAO,MAAMK,CAAO,CAAC,CAErC",
6
+ "names": ["header_exports", "__export", "createHeader", "createSectionHeader", "printFooter", "printHeader", "__toCommonJS", "import_yoctocolors_cjs", "import_strings", "title", "options", "bold", "borderChar", "color", "padding", "width", "border", "formattedTitle", "colors", "centeredTitle", "paddingLine", "lines", "i", "message"]
7
7
  }
@@ -1,208 +1,7 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var mask_exports = {};
30
- __export(mask_exports, {
31
- attachOutputMask: () => attachOutputMask,
32
- createKeyboardHandler: () => createKeyboardHandler,
33
- createOutputMask: () => createOutputMask,
34
- runWithMask: () => runWithMask
35
- });
36
- module.exports = __toCommonJS(mask_exports);
37
- var import_node_child_process = require("node:child_process");
38
- var import_node_readline = __toESM(require("node:readline"));
39
- var import_spinner = require("../spinner.js");
40
- var import_clear = require("./clear.js");
41
- var import_stdout = require("./stdout.js");
42
- function createOutputMask(options = {}) {
43
- const { showOutput = false } = options;
44
- return {
45
- isSpinning: !showOutput,
46
- outputBuffer: [],
47
- stderrCapture: "",
48
- stdoutCapture: "",
49
- verbose: showOutput
50
- };
51
- }
52
- function createKeyboardHandler(mask, child, options = {}) {
53
- const { message = "Running\u2026", toggleText = "to see full output" } = options;
54
- return (_str, key) => {
55
- if (key?.ctrl && key.name === "o") {
56
- mask.verbose = !mask.verbose;
57
- if (mask.verbose) {
58
- if (mask.isSpinning) {
59
- import_spinner.spinner.stop();
60
- mask.isSpinning = false;
61
- }
62
- (0, import_clear.clearLine)();
63
- if (mask.outputBuffer.length > 0) {
64
- console.log("--- Output (ctrl+o to hide) ---");
65
- mask.outputBuffer.forEach((line) => {
66
- (0, import_stdout.write)(line);
67
- });
68
- }
69
- } else {
70
- if (mask.outputBuffer.length > 0) {
71
- const lineCount = mask.outputBuffer.join("").split("\n").length + 1;
72
- for (let i = 0; i < lineCount; i += 1) {
73
- process.stdout.write("\x1B[1A\x1B[2K");
74
- }
75
- }
76
- (0, import_clear.clearLine)();
77
- mask.outputBuffer = [];
78
- if (!mask.isSpinning) {
79
- import_spinner.spinner.start(`${message} (ctrl+o ${toggleText})`);
80
- mask.isSpinning = true;
81
- }
82
- }
83
- } else if (key?.ctrl && key.name === "c") {
84
- child.kill("SIGTERM");
85
- if (process.stdin.isTTY) {
86
- process.stdin.setRawMode(false);
87
- }
88
- throw new Error("Process cancelled by user");
89
- }
90
- };
91
- }
92
- function attachOutputMask(child, options = {}) {
93
- return new Promise((resolve, reject) => {
94
- const { message = "Running\u2026" } = options;
95
- const mask = createOutputMask(options);
96
- if (mask.isSpinning && process.stdout.isTTY) {
97
- import_spinner.spinner.start(
98
- `${message} (ctrl+o ${options.toggleText || "to see full output"})`
99
- );
100
- }
101
- if (process.stdin.isTTY) {
102
- import_node_readline.default.emitKeypressEvents(process.stdin);
103
- process.stdin.setRawMode(true);
104
- const keypressHandler = createKeyboardHandler(mask, child, options);
105
- process.stdin.on("keypress", keypressHandler);
106
- child.on("exit", () => {
107
- if (process.stdin.isTTY) {
108
- process.stdin.setRawMode(false);
109
- process.stdin.removeListener("keypress", keypressHandler);
110
- }
111
- });
112
- }
113
- if (child.stdout) {
114
- child.stdout.on("data", (data) => {
115
- const text = data.toString();
116
- mask.stdoutCapture += text;
117
- if (options.filterOutput && !options.filterOutput(text, "stdout")) {
118
- return void 0;
119
- }
120
- if (mask.verbose) {
121
- (0, import_stdout.write)(text);
122
- } else {
123
- mask.outputBuffer.push(text);
124
- const lines = mask.outputBuffer.join("").split("\n");
125
- if (lines.length > 1e3) {
126
- mask.outputBuffer = [lines.slice(-1e3).join("\n")];
127
- }
128
- }
129
- return void 0;
130
- });
131
- }
132
- if (child.stderr) {
133
- child.stderr.on("data", (data) => {
134
- const text = data.toString();
135
- mask.stderrCapture += text;
136
- if (options.filterOutput && !options.filterOutput(text, "stderr")) {
137
- return void 0;
138
- }
139
- if (mask.verbose) {
140
- process.stderr.write(text);
141
- } else {
142
- mask.outputBuffer.push(text);
143
- }
144
- return void 0;
145
- });
146
- }
147
- child.on("exit", (code) => {
148
- if (process.stdin.isTTY) {
149
- process.stdin.setRawMode(false);
150
- }
151
- let finalCode = code || 0;
152
- if (options.overrideExitCode) {
153
- const overridden = options.overrideExitCode(
154
- finalCode,
155
- mask.stdoutCapture,
156
- mask.stderrCapture
157
- );
158
- if (overridden !== void 0) {
159
- finalCode = overridden;
160
- }
161
- }
162
- if (mask.isSpinning) {
163
- if (finalCode === 0) {
164
- import_spinner.spinner.successAndStop(`${message} completed`);
165
- } else {
166
- import_spinner.spinner.failAndStop(`${message} failed`);
167
- if (mask.outputBuffer.length > 0 && !mask.verbose) {
168
- console.log("\n--- Output ---");
169
- mask.outputBuffer.forEach((line) => {
170
- (0, import_stdout.write)(line);
171
- });
172
- }
173
- }
174
- }
175
- resolve(finalCode);
176
- });
177
- child.on("error", (error) => {
178
- if (process.stdin.isTTY) {
179
- process.stdin.setRawMode(false);
180
- }
181
- if (mask.isSpinning) {
182
- import_spinner.spinner.failAndStop(`${message} error`);
183
- }
184
- reject(error);
185
- });
186
- });
187
- }
188
- async function runWithMask(command, args = [], options = {}) {
189
- const {
190
- message = "Running\u2026",
191
- showOutput = false,
192
- toggleText = "to see output",
193
- ...spawnOptions
194
- } = options;
195
- const child = (0, import_node_child_process.spawn)(command, args, {
196
- stdio: ["inherit", "pipe", "pipe"],
197
- ...spawnOptions
198
- });
199
- return await attachOutputMask(child, { message, showOutput, toggleText });
200
- }
201
- // Annotate the CommonJS export names for ESM import in node:
202
- 0 && (module.exports = {
203
- attachOutputMask,
204
- createKeyboardHandler,
205
- createOutputMask,
206
- runWithMask
207
- });
2
+ var m=Object.create;var d=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var i in t)d(e,i,{get:t[i],enumerable:!0})},c=(e,t,i,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of v(t))!T.call(e,o)&&o!==i&&d(e,o,{get:()=>t[o],enumerable:!(p=S(t,o))||p.enumerable});return e};var h=(e,t,i)=>(i=e!=null?m(M(e)):{},c(t||!e||!e.__esModule?d(i,"default",{value:e,enumerable:!0}):i,e)),B=e=>c(d({},"__esModule",{value:!0}),e);var R={};C(R,{attachOutputMask:()=>x,createKeyboardHandler:()=>w,createOutputMask:()=>b,runWithMask:()=>E});module.exports=B(R);var g=require("node:child_process"),O=h(require("node:readline")),f=require("../spinner.js"),l=require("./clear.js"),a=require("./stdout.js");function b(e={}){const{showOutput:t=!1}=e;return{isSpinning:!t,outputBuffer:[],stderrCapture:"",stdoutCapture:"",verbose:t}}function w(e,t,i={}){const{message:p="Running\u2026",toggleText:o="to see full output"}=i;return(s,n)=>{if(n?.ctrl&&n.name==="o")if(e.verbose=!e.verbose,e.verbose)e.isSpinning&&(f.spinner.stop(),e.isSpinning=!1),(0,l.clearLine)(),e.outputBuffer.length>0&&(console.log("--- Output (ctrl+o to hide) ---"),e.outputBuffer.forEach(r=>{(0,a.write)(r)}));else{if(e.outputBuffer.length>0){const r=e.outputBuffer.join("").split(`
3
+ `).length+1;for(let u=0;u<r;u+=1)process.stdout.write("\x1B[1A\x1B[2K")}(0,l.clearLine)(),e.outputBuffer=[],e.isSpinning||(f.spinner.start(`${p} (ctrl+o ${o})`),e.isSpinning=!0)}else if(n?.ctrl&&n.name==="c")throw t.kill("SIGTERM"),process.stdin.isTTY&&process.stdin.setRawMode(!1),new Error("Process cancelled by user")}}function x(e,t={}){return new Promise((i,p)=>{const{message:o="Running\u2026"}=t,s=b(t);if(s.isSpinning&&process.stdout.isTTY&&f.spinner.start(`${o} (ctrl+o ${t.toggleText||"to see full output"})`),process.stdin.isTTY){O.default.emitKeypressEvents(process.stdin),process.stdin.setRawMode(!0);const n=w(s,e,t);process.stdin.on("keypress",n),e.on("exit",()=>{process.stdin.isTTY&&(process.stdin.setRawMode(!1),process.stdin.removeListener("keypress",n))})}e.stdout&&e.stdout.on("data",n=>{const r=n.toString();if(s.stdoutCapture+=r,!(t.filterOutput&&!t.filterOutput(r,"stdout")))if(s.verbose)(0,a.write)(r);else{s.outputBuffer.push(r);const u=s.outputBuffer.join("").split(`
4
+ `);u.length>1e3&&(s.outputBuffer=[u.slice(-1e3).join(`
5
+ `)])}}),e.stderr&&e.stderr.on("data",n=>{const r=n.toString();s.stderrCapture+=r,!(t.filterOutput&&!t.filterOutput(r,"stderr"))&&(s.verbose?process.stderr.write(r):s.outputBuffer.push(r))}),e.on("exit",n=>{process.stdin.isTTY&&process.stdin.setRawMode(!1);let r=n||0;if(t.overrideExitCode){const u=t.overrideExitCode(r,s.stdoutCapture,s.stderrCapture);u!==void 0&&(r=u)}s.isSpinning&&(r===0?f.spinner.successAndStop(`${o} completed`):(f.spinner.failAndStop(`${o} failed`),s.outputBuffer.length>0&&!s.verbose&&(console.log(`
6
+ --- Output ---`),s.outputBuffer.forEach(u=>{(0,a.write)(u)})))),i(r)}),e.on("error",n=>{process.stdin.isTTY&&process.stdin.setRawMode(!1),s.isSpinning&&f.spinner.failAndStop(`${o} error`),p(n)})})}async function E(e,t=[],i={}){const{message:p="Running\u2026",showOutput:o=!1,toggleText:s="to see output",...n}=i,r=(0,g.spawn)(e,t,{stdio:["inherit","pipe","pipe"],...n});return await x(r,{message:p,showOutput:o,toggleText:s})}0&&(module.exports={attachOutputMask,createKeyboardHandler,createOutputMask,runWithMask});
208
7
  //# sourceMappingURL=mask.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/stdio/mask.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Interactive output masking utilities for CLI tools.\n * Provides output control with keyboard toggling (ctrl+o).\n *\n * ANSI Escape Sequences Used:\n * - '\\r': Carriage return - moves cursor to beginning of current line.\n * - '\\x1b[K' or '\\x1b[0K': CSI K (erase line) - clear from cursor to end of line.\n * - '\\x1b[2K': CSI 2K - erase entire line.\n * - '\\x1b[1A': CSI A - move cursor up 1 line.\n *\n * Terminal Control:\n * - Raw mode (setRawMode(true)): Captures keypresses immediately without buffering.\n * - TTY detection: Ensures terminal manipulation only occurs in interactive terminals.\n *\n * Key Features:\n * - Output buffering: Stores up to 1000 lines when masked to prevent memory issues.\n * - Graceful cleanup: Always restores terminal to normal mode on exit/error.\n * - Visual feedback: Uses spinner to indicate process is running when output is masked.\n */\n\nimport type { ChildProcess, SpawnOptions } from 'node:child_process'\nimport { spawn } from 'node:child_process'\nimport readline from 'node:readline'\nimport { spinner } from '../spinner.js'\nimport { clearLine } from './clear.js'\nimport { write } from './stdout.js'\n\nexport interface OutputMaskOptions {\n /**\n * Current working directory for spawned process.\n * @default process.cwd()\n */\n cwd?: string | undefined\n /**\n * Environment variables for spawned process.\n * @default process.env\n */\n env?: NodeJS.ProcessEnv | undefined\n /**\n * Filter output before displaying or buffering.\n * Return `false` to skip the line, `true` to include it.\n *\n * Useful for filtering non-fatal warnings or noise from test runners.\n * The filter runs on every chunk of output before display/buffering.\n *\n * @param text - The output text chunk (may include ANSI codes)\n * @param stream - Whether this came from 'stdout' or 'stderr'\n * @returns `true` to include this output, `false` to skip it\n *\n * @example\n * ```ts\n * filterOutput: (text, stream) => {\n * // Skip vitest worker termination errors\n * if (text.includes('Terminating worker thread')) return false\n * return true\n * }\n * ```\n */\n filterOutput?:\n | ((text: string, stream: 'stdout' | 'stderr') => boolean)\n | undefined\n /**\n * Progress message to display in spinner.\n * @default 'Running\u2026'\n */\n message?: string | undefined\n /**\n * Override the exit code based on captured output.\n *\n * Useful for handling non-fatal errors that shouldn't fail the build.\n * Called after the process exits with the original code and all captured output.\n * Return a number to override the exit code, or `undefined` to keep original.\n *\n * @param code - Original exit code from the process\n * @param stdout - All captured stdout (even filtered lines are captured)\n * @param stderr - All captured stderr (even filtered lines are captured)\n * @returns New exit code, or `undefined` to keep original\n *\n * @example\n * ```ts\n * overrideExitCode: (code, stdout, stderr) => {\n * // If only worker termination errors, treat as success\n * const output = stdout + stderr\n * const hasWorkerError = output.includes('Terminating worker thread')\n * const hasRealFailure = output.includes('FAIL')\n * if (code !== 0 && hasWorkerError && !hasRealFailure) {\n * return 0 // Override to success\n * }\n * return undefined // Keep original\n * }\n * ```\n */\n overrideExitCode?:\n | ((code: number, stdout: string, stderr: string) => number | undefined)\n | undefined\n /**\n * Start with output visible instead of masked.\n * When `true`, output shows immediately without needing ctrl+o.\n * @default false\n */\n showOutput?: boolean | undefined\n /**\n * Text to show after \"ctrl+o\" in spinner message.\n * @default 'to see full output'\n */\n toggleText?: string | undefined\n}\n\nexport interface OutputMask {\n /** Whether spinner is currently active */\n isSpinning: boolean\n /** Buffered output lines */\n outputBuffer: string[]\n /** All stderr captured (for exit code override) */\n stderrCapture: string\n /** All stdout captured (for exit code override) */\n stdoutCapture: string\n /** Whether output is currently visible */\n verbose: boolean\n}\n\n/**\n * Create an output mask for controlling command output visibility.\n * The mask tracks whether output should be shown or hidden (buffered).\n * When hidden, output is buffered and a spinner is shown instead.\n */\nexport function createOutputMask(options: OutputMaskOptions = {}): OutputMask {\n const { showOutput = false } = options\n\n return {\n isSpinning: !showOutput,\n outputBuffer: [],\n stderrCapture: '',\n stdoutCapture: '',\n verbose: showOutput,\n }\n}\n\n/**\n * Create a keyboard handler for toggling output visibility.\n * Handles two key combinations:\n * - ctrl+o: Toggle between showing and hiding output.\n * - ctrl+c: Cancel the running process.\n * The handler manipulates terminal state using ANSI escape sequences.\n */\nexport function createKeyboardHandler(\n mask: OutputMask,\n child: ChildProcess,\n options: OutputMaskOptions = {},\n): (_str: string, key: readline.Key) => void {\n const { message = 'Running\u2026', toggleText = 'to see full output' } = options\n\n return (_str, key) => {\n // ctrl+o toggles verbose mode.\n if (key?.ctrl && key.name === 'o') {\n mask.verbose = !mask.verbose\n\n if (mask.verbose) {\n // Stop spinner and show buffered output.\n if (mask.isSpinning) {\n spinner.stop()\n mask.isSpinning = false\n }\n\n // Clear the current line (removes spinner remnants).\n clearLine()\n\n // Show buffered output.\n if (mask.outputBuffer.length > 0) {\n console.log('--- Output (ctrl+o to hide) ---')\n mask.outputBuffer.forEach(line => {\n write(line)\n })\n }\n } else {\n // Hide output and show spinner.\n // Clear all the output lines that were shown.\n if (mask.outputBuffer.length > 0) {\n // Calculate number of lines to clear (output + header line).\n const lineCount = mask.outputBuffer.join('').split('\\n').length + 1\n // Move up and clear each line using ANSI escape sequences:\n // - '\\x1b[1A' (CSI A): Move cursor up 1 line.\n // - '\\x1b[2K' (CSI K with param 2): Erase entire line.\n // This combination effectively \"rewinds\" the terminal output.\n for (let i = 0; i < lineCount; i += 1) {\n process.stdout.write('\\x1b[1A\\x1b[2K')\n }\n }\n clearLine()\n\n // Clear the buffer and restart spinner.\n mask.outputBuffer = []\n if (!mask.isSpinning) {\n spinner.start(`${message} (ctrl+o ${toggleText})`)\n mask.isSpinning = true\n }\n }\n }\n // ctrl+c to cancel.\n else if (key?.ctrl && key.name === 'c') {\n // Gracefully terminate child process.\n child.kill('SIGTERM')\n // Restore terminal to normal mode before exiting.\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n throw new Error('Process cancelled by user')\n }\n }\n}\n\n/**\n * Attach output masking to a child process.\n * Returns a promise that resolves with the exit code.\n * This function:\n * - Sets up keyboard input handling in raw mode for immediate key capture.\n * - Buffers stdout/stderr when not in verbose mode.\n * - Shows a spinner when output is masked.\n * - Allows toggling between masked and unmasked output with ctrl+o.\n */\nexport function attachOutputMask(\n child: ChildProcess,\n options: OutputMaskOptions = {},\n): Promise<number> {\n return new Promise((resolve, reject) => {\n const { message = 'Running\u2026' } = options\n const mask = createOutputMask(options)\n\n // Start spinner if not verbose.\n if (mask.isSpinning && process.stdout.isTTY) {\n spinner.start(\n `${message} (ctrl+o ${options.toggleText || 'to see full output'})`,\n )\n }\n\n // Setup keyboard input handling.\n // Raw mode is required to capture ctrl+o without waiting for Enter.\n if (process.stdin.isTTY) {\n readline.emitKeypressEvents(process.stdin)\n process.stdin.setRawMode(true)\n\n const keypressHandler = createKeyboardHandler(mask, child, options)\n process.stdin.on('keypress', keypressHandler)\n\n // Cleanup on exit: restore terminal to normal mode.\n child.on('exit', () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n process.stdin.removeListener('keypress', keypressHandler)\n }\n })\n }\n\n // Handle stdout: either show immediately or buffer for later.\n if (child.stdout) {\n child.stdout.on('data', data => {\n const text = data.toString()\n\n // Always capture for exit code override.\n mask.stdoutCapture += text\n\n // Apply filter if provided.\n if (options.filterOutput && !options.filterOutput(text, 'stdout')) {\n // Skip this output.\n return undefined\n }\n\n if (mask.verbose) {\n write(text)\n } else {\n // Buffer the output for later.\n mask.outputBuffer.push(text)\n\n // Keep buffer size reasonable (last 1000 lines).\n // This prevents unbounded memory growth for long-running processes.\n const lines = mask.outputBuffer.join('').split('\\n')\n if (lines.length > 1000) {\n mask.outputBuffer = [lines.slice(-1000).join('\\n')]\n }\n }\n return undefined\n })\n }\n\n // Handle stderr: same as stdout, but write to stderr stream when verbose.\n if (child.stderr) {\n child.stderr.on('data', data => {\n const text = data.toString()\n\n // Always capture for exit code override.\n mask.stderrCapture += text\n\n // Apply filter if provided.\n if (options.filterOutput && !options.filterOutput(text, 'stderr')) {\n // Skip this output.\n return undefined\n }\n\n if (mask.verbose) {\n process.stderr.write(text)\n } else {\n mask.outputBuffer.push(text)\n }\n return undefined\n })\n }\n\n child.on('exit', code => {\n // Cleanup keyboard if needed.\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n\n // Allow caller to override exit code based on output.\n let finalCode = code || 0\n if (options.overrideExitCode) {\n const overridden = options.overrideExitCode(\n finalCode,\n mask.stdoutCapture,\n mask.stderrCapture,\n )\n if (overridden !== undefined) {\n finalCode = overridden\n }\n }\n\n if (mask.isSpinning) {\n if (finalCode === 0) {\n spinner.successAndStop(`${message} completed`)\n } else {\n spinner.failAndStop(`${message} failed`)\n // Show buffered output on failure so user can see what went wrong.\n if (mask.outputBuffer.length > 0 && !mask.verbose) {\n console.log('\\n--- Output ---')\n mask.outputBuffer.forEach(line => {\n write(line)\n })\n }\n }\n }\n\n resolve(finalCode)\n })\n\n child.on('error', error => {\n // Ensure terminal is restored to normal mode on error.\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n\n if (mask.isSpinning) {\n spinner.failAndStop(`${message} error`)\n }\n reject(error)\n })\n })\n}\n\n/**\n * Run a command with interactive output masking.\n * Convenience wrapper around spawn + attachOutputMask.\n * Spawns a child process and attaches the output masking system to it.\n * stdin is inherited, stdout and stderr are piped for masking control.\n */\nexport async function runWithMask(\n command: string,\n args: string[] = [],\n options: OutputMaskOptions & SpawnOptions = {},\n): Promise<number> {\n const {\n message = 'Running\u2026',\n showOutput = false,\n toggleText = 'to see output',\n ...spawnOptions\n } = options\n\n const child = spawn(command, args, {\n stdio: ['inherit', 'pipe', 'pipe'],\n ...spawnOptions,\n })\n\n return await attachOutputMask(child, { message, showOutput, toggleText })\n}\n"],
5
- "mappings": "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",
6
- "names": ["readline"]
5
+ "mappings": "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",
6
+ "names": ["mask_exports", "__export", "attachOutputMask", "createKeyboardHandler", "createOutputMask", "runWithMask", "__toCommonJS", "import_node_child_process", "import_node_readline", "import_spinner", "import_clear", "import_stdout", "options", "showOutput", "mask", "child", "message", "toggleText", "_str", "key", "line", "lineCount", "i", "resolve", "reject", "readline", "keypressHandler", "data", "text", "lines", "code", "finalCode", "overridden", "error", "command", "args", "spawnOptions"]
7
7
  }