browser-debugger-cli 0.6.9 → 0.6.11

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 (259) hide show
  1. package/README.md +10 -0
  2. package/dist/commands/cdp.js +1 -1
  3. package/dist/commands/cdp.js.map +1 -1
  4. package/dist/commands/cleanup.js +1 -1
  5. package/dist/commands/cleanup.js.map +1 -1
  6. package/dist/commands/console.d.ts +4 -28
  7. package/dist/commands/console.d.ts.map +1 -1
  8. package/dist/commands/console.js +82 -192
  9. package/dist/commands/console.js.map +1 -1
  10. package/dist/commands/details.d.ts.map +1 -1
  11. package/dist/commands/details.js +27 -8
  12. package/dist/commands/details.js.map +1 -1
  13. package/dist/commands/dom/DomElementResolver.d.ts +25 -9
  14. package/dist/commands/dom/DomElementResolver.d.ts.map +1 -1
  15. package/dist/commands/dom/DomElementResolver.js +65 -17
  16. package/dist/commands/dom/DomElementResolver.js.map +1 -1
  17. package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts +2 -0
  18. package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts.map +1 -0
  19. package/dist/commands/dom/__tests__/screenshotResize.unit.test.js +184 -0
  20. package/dist/commands/dom/__tests__/screenshotResize.unit.test.js.map +1 -0
  21. package/dist/commands/dom/a11y.d.ts.map +1 -1
  22. package/dist/commands/dom/a11y.js +9 -9
  23. package/dist/commands/dom/a11y.js.map +1 -1
  24. package/dist/commands/dom/evalHelpers.d.ts.map +1 -1
  25. package/dist/commands/dom/evalHelpers.js +10 -7
  26. package/dist/commands/dom/evalHelpers.js.map +1 -1
  27. package/dist/commands/dom/formFillHelpers.d.ts +2 -1
  28. package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
  29. package/dist/commands/dom/formFillHelpers.js +22 -20
  30. package/dist/commands/dom/formFillHelpers.js.map +1 -1
  31. package/dist/commands/dom/formInteraction.d.ts.map +1 -1
  32. package/dist/commands/dom/formInteraction.js +26 -10
  33. package/dist/commands/dom/formInteraction.js.map +1 -1
  34. package/dist/commands/dom/formSubmitHelpers.d.ts +2 -1
  35. package/dist/commands/dom/formSubmitHelpers.d.ts.map +1 -1
  36. package/dist/commands/dom/formSubmitHelpers.js.map +1 -1
  37. package/dist/commands/dom/helpers.d.ts +47 -4
  38. package/dist/commands/dom/helpers.d.ts.map +1 -1
  39. package/dist/commands/dom/helpers.js +406 -21
  40. package/dist/commands/dom/helpers.js.map +1 -1
  41. package/dist/commands/dom/index.d.ts +1 -1
  42. package/dist/commands/dom/index.d.ts.map +1 -1
  43. package/dist/commands/dom/index.js +414 -151
  44. package/dist/commands/dom/index.js.map +1 -1
  45. package/dist/commands/dom/reactEventHelpers.d.ts +4 -4
  46. package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -1
  47. package/dist/commands/dom/reactEventHelpers.js +11 -11
  48. package/dist/commands/dom/screenshotResize.d.ts +81 -0
  49. package/dist/commands/dom/screenshotResize.d.ts.map +1 -0
  50. package/dist/commands/dom/screenshotResize.js +103 -0
  51. package/dist/commands/dom/screenshotResize.js.map +1 -0
  52. package/dist/commands/helpJson.d.ts +20 -0
  53. package/dist/commands/helpJson.d.ts.map +1 -1
  54. package/dist/commands/helpJson.js +48 -39
  55. package/dist/commands/helpJson.js.map +1 -1
  56. package/dist/commands/network/har.d.ts.map +1 -1
  57. package/dist/commands/network/har.js +3 -2
  58. package/dist/commands/network/har.js.map +1 -1
  59. package/dist/commands/network/list.d.ts +0 -8
  60. package/dist/commands/network/list.d.ts.map +1 -1
  61. package/dist/commands/network/list.js +134 -208
  62. package/dist/commands/network/list.js.map +1 -1
  63. package/dist/commands/network/shared.d.ts.map +1 -1
  64. package/dist/commands/network/shared.js +6 -0
  65. package/dist/commands/network/shared.js.map +1 -1
  66. package/dist/commands/optionBehaviors.d.ts +26 -0
  67. package/dist/commands/optionBehaviors.d.ts.map +1 -0
  68. package/dist/commands/optionBehaviors.js +184 -0
  69. package/dist/commands/optionBehaviors.js.map +1 -0
  70. package/dist/commands/peek.d.ts +2 -4
  71. package/dist/commands/peek.d.ts.map +1 -1
  72. package/dist/commands/peek.js +109 -97
  73. package/dist/commands/peek.js.map +1 -1
  74. package/dist/commands/shared/CommandRunner.js +1 -1
  75. package/dist/commands/shared/CommandRunner.js.map +1 -1
  76. package/dist/commands/shared/dataFetcher.d.ts +58 -0
  77. package/dist/commands/shared/dataFetcher.d.ts.map +1 -0
  78. package/dist/commands/shared/dataFetcher.js +98 -0
  79. package/dist/commands/shared/dataFetcher.js.map +1 -0
  80. package/dist/commands/shared/followMode.d.ts +50 -0
  81. package/dist/commands/shared/followMode.d.ts.map +1 -0
  82. package/dist/commands/shared/followMode.js +58 -0
  83. package/dist/commands/shared/followMode.js.map +1 -0
  84. package/dist/commands/shared/optionTypes.d.ts +18 -4
  85. package/dist/commands/shared/optionTypes.d.ts.map +1 -1
  86. package/dist/commands/shared/startHelpers.d.ts.map +1 -1
  87. package/dist/commands/shared/startHelpers.js +6 -5
  88. package/dist/commands/shared/startHelpers.js.map +1 -1
  89. package/dist/commands/shared/validation.d.ts +0 -45
  90. package/dist/commands/shared/validation.d.ts.map +1 -1
  91. package/dist/commands/shared/validation.js +65 -107
  92. package/dist/commands/shared/validation.js.map +1 -1
  93. package/dist/commands/status.d.ts.map +1 -1
  94. package/dist/commands/status.js +18 -9
  95. package/dist/commands/status.js.map +1 -1
  96. package/dist/commands/stop.d.ts.map +1 -1
  97. package/dist/commands/stop.js +15 -4
  98. package/dist/commands/stop.js.map +1 -1
  99. package/dist/commands/tail.d.ts +2 -7
  100. package/dist/commands/tail.d.ts.map +1 -1
  101. package/dist/commands/tail.js +67 -79
  102. package/dist/commands/tail.js.map +1 -1
  103. package/dist/commands/types.d.ts +11 -5
  104. package/dist/commands/types.d.ts.map +1 -1
  105. package/dist/connection/cdp.d.ts.map +1 -1
  106. package/dist/connection/cdp.js +5 -3
  107. package/dist/connection/cdp.js.map +1 -1
  108. package/dist/connection/diagnostics.d.ts +9 -0
  109. package/dist/connection/diagnostics.d.ts.map +1 -1
  110. package/dist/connection/diagnostics.js +14 -1
  111. package/dist/connection/diagnostics.js.map +1 -1
  112. package/dist/connection/errors.d.ts +0 -7
  113. package/dist/connection/errors.d.ts.map +1 -1
  114. package/dist/connection/errors.js +0 -7
  115. package/dist/connection/errors.js.map +1 -1
  116. package/dist/connection/handlers.d.ts +1 -8
  117. package/dist/connection/handlers.d.ts.map +1 -1
  118. package/dist/connection/handlers.js.map +1 -1
  119. package/dist/connection/launcher/binaryResolver.d.ts.map +1 -1
  120. package/dist/connection/launcher/binaryResolver.js +3 -15
  121. package/dist/connection/launcher/binaryResolver.js.map +1 -1
  122. package/dist/connection/launcher/preferencesLoader.d.ts.map +1 -1
  123. package/dist/connection/launcher/preferencesLoader.js +2 -1
  124. package/dist/connection/launcher/preferencesLoader.js.map +1 -1
  125. package/dist/connection/launcher.d.ts.map +1 -1
  126. package/dist/connection/launcher.js +5 -16
  127. package/dist/connection/launcher.js.map +1 -1
  128. package/dist/connection/pageReadiness.d.ts.map +1 -1
  129. package/dist/connection/pageReadiness.js +13 -16
  130. package/dist/connection/pageReadiness.js.map +1 -1
  131. package/dist/connection/typed-cdp.d.ts +3 -5
  132. package/dist/connection/typed-cdp.d.ts.map +1 -1
  133. package/dist/connection/typed-cdp.js +1 -1
  134. package/dist/connection/typed-cdp.js.map +1 -1
  135. package/dist/daemon/handlers/BaseHandler.d.ts.map +1 -1
  136. package/dist/daemon/handlers/BaseHandler.js +1 -1
  137. package/dist/daemon/handlers/BaseHandler.js.map +1 -1
  138. package/dist/daemon/handlers/QueryHandlers.d.ts.map +1 -1
  139. package/dist/daemon/handlers/QueryHandlers.js +1 -1
  140. package/dist/daemon/handlers/QueryHandlers.js.map +1 -1
  141. package/dist/daemon/handlers/SessionHandlers.d.ts.map +1 -1
  142. package/dist/daemon/handlers/SessionHandlers.js +1 -1
  143. package/dist/daemon/handlers/SessionHandlers.js.map +1 -1
  144. package/dist/daemon/handlers/responseHandler.d.ts.map +1 -1
  145. package/dist/daemon/handlers/responseHandler.js +10 -0
  146. package/dist/daemon/handlers/responseHandler.js.map +1 -1
  147. package/dist/daemon/ipcServer.js +1 -1
  148. package/dist/daemon/ipcServer.js.map +1 -1
  149. package/dist/daemon/launcher.d.ts.map +1 -1
  150. package/dist/daemon/launcher.js +3 -2
  151. package/dist/daemon/launcher.js.map +1 -1
  152. package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -1
  153. package/dist/daemon/lifecycle/signalHandlers.js +1 -1
  154. package/dist/daemon/lifecycle/signalHandlers.js.map +1 -1
  155. package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
  156. package/dist/daemon/lifecycle/workerCleanup.js +4 -3
  157. package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
  158. package/dist/daemon/lifecycle/workerConfig.d.ts.map +1 -1
  159. package/dist/daemon/lifecycle/workerConfig.js +1 -1
  160. package/dist/daemon/lifecycle/workerConfig.js.map +1 -1
  161. package/dist/daemon/lifecycle/workerIpc.d.ts.map +1 -1
  162. package/dist/daemon/lifecycle/workerIpc.js +1 -1
  163. package/dist/daemon/lifecycle/workerIpc.js.map +1 -1
  164. package/dist/daemon/server/JsonlParser.d.ts.map +1 -1
  165. package/dist/daemon/server/JsonlParser.js +1 -1
  166. package/dist/daemon/server/JsonlParser.js.map +1 -1
  167. package/dist/daemon/startSession.d.ts.map +1 -1
  168. package/dist/daemon/startSession.js +1 -1
  169. package/dist/daemon/startSession.js.map +1 -1
  170. package/dist/daemon/worker/TelemetryStore.d.ts +2 -1
  171. package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -1
  172. package/dist/daemon/worker/TelemetryStore.js +4 -0
  173. package/dist/daemon/worker/TelemetryStore.js.map +1 -1
  174. package/dist/daemon/worker/plugins.d.ts.map +1 -1
  175. package/dist/daemon/worker/plugins.js +9 -2
  176. package/dist/daemon/worker/plugins.js.map +1 -1
  177. package/dist/index.js +23 -7
  178. package/dist/index.js.map +1 -1
  179. package/dist/ipc/utils/errors.js +1 -1
  180. package/dist/ipc/utils/errors.js.map +1 -1
  181. package/dist/session/QueryCacheManager.d.ts.map +1 -1
  182. package/dist/session/QueryCacheManager.js +1 -1
  183. package/dist/session/QueryCacheManager.js.map +1 -1
  184. package/dist/session/chrome.js +1 -1
  185. package/dist/session/chrome.js.map +1 -1
  186. package/dist/session/cleanup.js +5 -5
  187. package/dist/session/cleanup.js.map +1 -1
  188. package/dist/session/lock.js +1 -1
  189. package/dist/session/lock.js.map +1 -1
  190. package/dist/session/metadata.d.ts.map +1 -1
  191. package/dist/session/metadata.js +1 -1
  192. package/dist/session/metadata.js.map +1 -1
  193. package/dist/session/pid.js +1 -1
  194. package/dist/session/pid.js.map +1 -1
  195. package/dist/telemetry/dom.d.ts.map +1 -1
  196. package/dist/telemetry/dom.js +1 -1
  197. package/dist/telemetry/dom.js.map +1 -1
  198. package/dist/telemetry/filterPresets.d.ts.map +1 -1
  199. package/dist/telemetry/filterPresets.js +5 -2
  200. package/dist/telemetry/filterPresets.js.map +1 -1
  201. package/dist/telemetry/navigation.d.ts.map +1 -1
  202. package/dist/telemetry/navigation.js +7 -0
  203. package/dist/telemetry/navigation.js.map +1 -1
  204. package/dist/telemetry/network.d.ts +12 -1
  205. package/dist/telemetry/network.d.ts.map +1 -1
  206. package/dist/telemetry/network.js +117 -1
  207. package/dist/telemetry/network.js.map +1 -1
  208. package/dist/types.d.ts +148 -0
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/types.js +33 -1
  211. package/dist/types.js.map +1 -1
  212. package/dist/ui/OutputBuilder.d.ts +2 -44
  213. package/dist/ui/OutputBuilder.d.ts.map +1 -1
  214. package/dist/ui/OutputBuilder.js +71 -103
  215. package/dist/ui/OutputBuilder.js.map +1 -1
  216. package/dist/ui/errors/CommandError.d.ts +0 -2
  217. package/dist/ui/errors/CommandError.d.ts.map +1 -1
  218. package/dist/ui/errors/CommandError.js.map +1 -1
  219. package/dist/ui/formatters/dom.d.ts +10 -30
  220. package/dist/ui/formatters/dom.d.ts.map +1 -1
  221. package/dist/ui/formatters/dom.js +13 -36
  222. package/dist/ui/formatters/dom.js.map +1 -1
  223. package/dist/ui/logging/logger.d.ts +1 -1
  224. package/dist/ui/logging/logger.d.ts.map +1 -1
  225. package/dist/ui/logging/logger.js +1 -1
  226. package/dist/ui/logging/logger.js.map +1 -1
  227. package/dist/ui/messages/dom.d.ts +14 -0
  228. package/dist/ui/messages/dom.d.ts.map +1 -0
  229. package/dist/ui/messages/dom.js +28 -0
  230. package/dist/ui/messages/dom.js.map +1 -0
  231. package/dist/ui/messages/errors.d.ts +83 -0
  232. package/dist/ui/messages/errors.d.ts.map +1 -1
  233. package/dist/ui/messages/errors.js +171 -0
  234. package/dist/ui/messages/errors.js.map +1 -1
  235. package/dist/utils/async.d.ts +10 -0
  236. package/dist/utils/async.d.ts.map +1 -0
  237. package/dist/utils/async.js +12 -0
  238. package/dist/utils/async.js.map +1 -0
  239. package/dist/utils/atomicFile.js +1 -1
  240. package/dist/utils/atomicFile.js.map +1 -1
  241. package/dist/utils/errorMapping.d.ts.map +1 -1
  242. package/dist/utils/errorMapping.js +4 -1
  243. package/dist/utils/errorMapping.js.map +1 -1
  244. package/dist/utils/exitCodes.d.ts +17 -16
  245. package/dist/utils/exitCodes.d.ts.map +1 -1
  246. package/dist/utils/exitCodes.js +86 -16
  247. package/dist/utils/exitCodes.js.map +1 -1
  248. package/dist/utils/suggestions.d.ts +19 -0
  249. package/dist/utils/suggestions.d.ts.map +1 -0
  250. package/dist/utils/suggestions.js +34 -0
  251. package/dist/utils/suggestions.js.map +1 -0
  252. package/dist/utils/taskMappings.d.ts.map +1 -1
  253. package/dist/utils/taskMappings.js +35 -0
  254. package/dist/utils/taskMappings.js.map +1 -1
  255. package/dist/utils/typeGuards.d.ts +11 -4
  256. package/dist/utils/typeGuards.d.ts.map +1 -1
  257. package/dist/utils/typeGuards.js +1 -17
  258. package/dist/utils/typeGuards.js.map +1 -1
  259. package/package.json +4 -4
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared data fetching utilities for commands that query daemon state.
3
+ */
4
+ import { getPeek } from '../../ipc/client.js';
5
+ import { validateIPCResponse } from '../../ipc/index.js';
6
+ import { createLogger } from '../../ui/logging/index.js';
7
+ import { getExitCodeForConnectionError } from '../../utils/errorMapping.js';
8
+ import { getErrorMessage } from '../../utils/errors.js';
9
+ import { EXIT_CODES } from '../../utils/exitCodes.js';
10
+ const log = createLogger('fetcher');
11
+ /**
12
+ * Fetch raw preview output from daemon.
13
+ */
14
+ export async function fetchPreviewOutput(lastN) {
15
+ log.debug(`Fetching preview output${lastN !== undefined ? ` (lastN: ${lastN})` : ''}`);
16
+ const response = await getPeek(lastN !== undefined ? { lastN } : undefined);
17
+ try {
18
+ validateIPCResponse(response);
19
+ }
20
+ catch (validationError) {
21
+ const errorMsg = getErrorMessage(validationError);
22
+ const exitCode = getExitCodeForConnectionError(errorMsg);
23
+ log.debug(`IPC validation failed: ${errorMsg}`);
24
+ return { success: false, error: errorMsg, exitCode };
25
+ }
26
+ const output = response.data?.preview;
27
+ if (!output) {
28
+ log.debug('No preview data in response');
29
+ return {
30
+ success: false,
31
+ error: 'No preview data in response',
32
+ exitCode: EXIT_CODES.SESSION_FILE_ERROR,
33
+ };
34
+ }
35
+ log.debug('Preview output fetched successfully');
36
+ return { success: true, data: output };
37
+ }
38
+ /**
39
+ * Fetch preview data with parsed network and console arrays.
40
+ */
41
+ export async function fetchPreviewData(lastN) {
42
+ const result = await fetchPreviewOutput(lastN);
43
+ if (!result.success)
44
+ return result;
45
+ return {
46
+ success: true,
47
+ data: {
48
+ output: result.data,
49
+ network: result.data.data.network ?? [],
50
+ console: result.data.data.console ?? [],
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Fetch network requests from daemon.
56
+ */
57
+ export async function fetchNetworkRequests() {
58
+ const result = await fetchPreviewData();
59
+ if (!result.success)
60
+ return result;
61
+ return { success: true, data: result.data.network };
62
+ }
63
+ /**
64
+ * Fetch console messages from daemon.
65
+ */
66
+ export async function fetchConsoleMessages() {
67
+ const result = await fetchPreviewData(0);
68
+ if (!result.success)
69
+ return result;
70
+ return { success: true, data: result.data.console };
71
+ }
72
+ /**
73
+ * Create error result for daemon not running.
74
+ */
75
+ export function createDaemonNotRunningError() {
76
+ return {
77
+ success: false,
78
+ error: 'Daemon not running',
79
+ exitCode: EXIT_CODES.RESOURCE_NOT_FOUND,
80
+ };
81
+ }
82
+ /**
83
+ * Create command result with suggestion.
84
+ *
85
+ * @param error - Error message
86
+ * @param exitCode - Exit code for the error
87
+ * @param suggestion - Suggestion text for the user
88
+ * @returns Error result object
89
+ */
90
+ export function createErrorResult(error, exitCode, suggestion = 'Start a session with: bdg <url>') {
91
+ return {
92
+ success: false,
93
+ error,
94
+ exitCode,
95
+ errorContext: { suggestion },
96
+ };
97
+ }
98
+ //# sourceMappingURL=dataFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFetcher.js","sourceRoot":"","sources":["../../../src/commands/shared/dataFetcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAYpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAc;IACrD,GAAG,CAAC,KAAK,CAAC,0BAA0B,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,eAAe,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAgC,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,6BAA6B;YACpC,QAAQ,EAAE,UAAU,CAAC,kBAAkB;SACxC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAc;IACnD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAEnC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE;YACvC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE;SACxC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,UAAU,CAAC,kBAAkB;KACxC,CAAC;AACJ,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,QAAgB,EAChB,UAAU,GAAG,iCAAiC;IAE9C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK;QACL,QAAQ;QACR,YAAY,EAAE,EAAE,UAAU,EAAE;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared utilities for follow/watch mode in commands.
3
+ *
4
+ * Provides a unified pattern for commands that continuously poll
5
+ * and display updates (like tail -f behavior).
6
+ */
7
+ /**
8
+ * Options for configuring follow mode behavior.
9
+ */
10
+ export interface FollowModeOptions {
11
+ /** Function that returns the "started following" message */
12
+ startMessage: () => string;
13
+ /** Function that returns the "stopped following" message */
14
+ stopMessage: () => string;
15
+ /** Polling interval in milliseconds (default: 1000) */
16
+ intervalMs?: number;
17
+ /** Handle EPIPE errors gracefully (for piped output) */
18
+ handleEpipe?: boolean;
19
+ }
20
+ /**
21
+ * Sets up follow mode with periodic refresh and graceful shutdown.
22
+ *
23
+ * This helper eliminates duplicated follow-mode setup code across commands.
24
+ * It handles:
25
+ * - Initial display of start message
26
+ * - First refresh call (awaited)
27
+ * - Periodic interval-based refresh
28
+ * - SIGINT handler for graceful shutdown
29
+ * - Optional EPIPE handling for piped output
30
+ *
31
+ * @param refreshFn - Async function to call on each refresh cycle
32
+ * @param options - Configuration options for follow mode
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * setupFollowMode(
37
+ * async () => {
38
+ * const data = await fetchData();
39
+ * displayData(data);
40
+ * },
41
+ * {
42
+ * startMessage: () => followingPreviewMessage(),
43
+ * stopMessage: () => stoppedFollowingPreviewMessage(),
44
+ * intervalMs: 1000,
45
+ * }
46
+ * );
47
+ * ```
48
+ */
49
+ export declare function setupFollowMode(refreshFn: () => Promise<void>, options: FollowModeOptions): Promise<void>;
50
+ //# sourceMappingURL=followMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followMode.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/followMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared utilities for follow/watch mode in commands.
3
+ *
4
+ * Provides a unified pattern for commands that continuously poll
5
+ * and display updates (like tail -f behavior).
6
+ */
7
+ import { EXIT_CODES } from '../../utils/exitCodes.js';
8
+ /**
9
+ * Sets up follow mode with periodic refresh and graceful shutdown.
10
+ *
11
+ * This helper eliminates duplicated follow-mode setup code across commands.
12
+ * It handles:
13
+ * - Initial display of start message
14
+ * - First refresh call (awaited)
15
+ * - Periodic interval-based refresh
16
+ * - SIGINT handler for graceful shutdown
17
+ * - Optional EPIPE handling for piped output
18
+ *
19
+ * @param refreshFn - Async function to call on each refresh cycle
20
+ * @param options - Configuration options for follow mode
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * setupFollowMode(
25
+ * async () => {
26
+ * const data = await fetchData();
27
+ * displayData(data);
28
+ * },
29
+ * {
30
+ * startMessage: () => followingPreviewMessage(),
31
+ * stopMessage: () => stoppedFollowingPreviewMessage(),
32
+ * intervalMs: 1000,
33
+ * }
34
+ * );
35
+ * ```
36
+ */
37
+ export async function setupFollowMode(refreshFn, options) {
38
+ const { startMessage, stopMessage, intervalMs = 1000, handleEpipe = false } = options;
39
+ console.error(startMessage());
40
+ await refreshFn();
41
+ const intervalId = setInterval(() => {
42
+ void refreshFn();
43
+ }, intervalMs);
44
+ process.on('SIGINT', () => {
45
+ clearInterval(intervalId);
46
+ console.error(stopMessage());
47
+ process.exit(EXIT_CODES.SUCCESS);
48
+ });
49
+ if (handleEpipe) {
50
+ process.stdout.on('error', (err) => {
51
+ if (err.code === 'EPIPE') {
52
+ clearInterval(intervalId);
53
+ process.exit(EXIT_CODES.SUCCESS);
54
+ }
55
+ });
56
+ }
57
+ }
58
+ //# sourceMappingURL=followMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followMode.js","sourceRoot":"","sources":["../../../src/commands/shared/followMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA8B,EAC9B,OAA0B;IAE1B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,GAAG,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtF,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9B,MAAM,SAAS,EAAE,CAAC;IAElB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,KAAK,SAAS,EAAE,CAAC;IACnB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YACxD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -36,7 +36,7 @@ export interface VerboseOptions {
36
36
  * Used by DOM interaction commands (fill, click, submit, pressKey).
37
37
  */
38
38
  export interface IndexOptions {
39
- /** 1-based index for selecting nth element matching selector */
39
+ /** 0-based index for selecting nth element matching selector */
40
40
  index?: number;
41
41
  }
42
42
  /**
@@ -70,7 +70,7 @@ export interface RawOptions {
70
70
  export interface SelectionOptions {
71
71
  /** Select all matching elements */
72
72
  all?: boolean;
73
- /** Select nth element (1-based) */
73
+ /** Select nth element (0-based) */
74
74
  nth?: number;
75
75
  /** Use specific nodeId directly */
76
76
  nodeId?: number;
@@ -85,6 +85,20 @@ export interface ScreenshotOptions {
85
85
  quality?: number;
86
86
  /** Capture full page vs viewport only */
87
87
  fullPage?: boolean;
88
+ /** CSS selector for element capture */
89
+ selector?: string;
90
+ /** Cached element index (0-based) from previous query */
91
+ index?: number;
92
+ /** Continuous capture mode to directory */
93
+ follow?: boolean;
94
+ /** Capture interval in ms for follow mode (string from CLI) */
95
+ interval?: string;
96
+ /** Max frames for follow mode (string from CLI) */
97
+ limit?: string;
98
+ /** Auto-resize enabled (--no-resize sets to false via Commander.js convention) */
99
+ resize?: boolean;
100
+ /** Scroll element into view before capture */
101
+ scroll?: string;
88
102
  }
89
103
  /**
90
104
  * Options for key press commands.
@@ -225,8 +239,8 @@ import type { ConsoleLevel } from '../../types.js';
225
239
  * By default shows only current navigation; use --history for all.
226
240
  */
227
241
  export interface ConsoleCommandOptions extends BaseOptions {
228
- /** Show last N messages (0 = all, default: 100) */
229
- last: number;
242
+ /** Show last N messages (string from CLI, 0 = all, default: 100) */
243
+ last?: string;
230
244
  /** List all messages chronologically (default: smart summary) */
231
245
  list?: boolean;
232
246
  /** Stream console messages in real-time */
@@ -1 +1 @@
1
- {"version":3,"file":"optionTypes.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/optionTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optionTypes.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/optionTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"startHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAK5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAsDf"}
1
+ {"version":3,"file":"startHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAsDf"}
@@ -5,12 +5,13 @@
5
5
  * Handles IPC communication with daemon to start browser sessions.
6
6
  */
7
7
  import { landingPage } from '../../commands/shared/landingPage.js';
8
- import { getErrorMessage } from '../../connection/errors.js';
9
8
  import { startSession as sendStartSessionRequest } from '../../ipc/client.js';
10
9
  import { IPCErrorCode } from '../../ipc/index.js';
11
10
  import { isConnectionError } from '../../ipc/utils/errors.js';
12
11
  import { createLogger } from '../../ui/logging/index.js';
13
12
  import { sessionAlreadyRunningError, daemonNotRunningError, invalidResponseError, genericError, } from '../../ui/messages/errors.js';
13
+ import { getExitCodeForIPCError } from '../../utils/errorMapping.js';
14
+ import { getErrorMessage } from '../../utils/errors.js';
14
15
  import { EXIT_CODES } from '../../utils/exitCodes.js';
15
16
  import { filterDefined } from '../../utils/objects.js';
16
17
  const log = createLogger('bdg');
@@ -49,12 +50,12 @@ export async function startSessionViaDaemon(url, options, telemetry) {
49
50
  else {
50
51
  console.error(genericError(`Daemon error: ${response.message ?? 'Unknown error'}`));
51
52
  }
52
- process.exit(EXIT_CODES.UNHANDLED_EXCEPTION);
53
+ process.exit(getExitCodeForIPCError(response.errorCode));
53
54
  }
54
55
  const { data } = response;
55
56
  if (!data) {
56
57
  console.error(invalidResponseError('missing data'));
57
- process.exit(EXIT_CODES.UNHANDLED_EXCEPTION);
58
+ process.exit(EXIT_CODES.SOFTWARE_ERROR);
58
59
  }
59
60
  if (options.quiet) {
60
61
  console.error(`Session started: ${data.targetUrl}`);
@@ -70,10 +71,10 @@ export async function startSessionViaDaemon(url, options, telemetry) {
70
71
  catch (error) {
71
72
  if (isConnectionError(error)) {
72
73
  console.error(daemonNotRunningError({ suggestStatus: true, suggestRetry: true }));
73
- process.exit(EXIT_CODES.UNHANDLED_EXCEPTION);
74
+ process.exit(EXIT_CODES.RESOURCE_NOT_FOUND);
74
75
  }
75
76
  console.error(genericError(getErrorMessage(error)));
76
- process.exit(EXIT_CODES.UNHANDLED_EXCEPTION);
77
+ process.exit(EXIT_CODES.SOFTWARE_ERROR);
77
78
  }
78
79
  }
79
80
  //# sourceMappingURL=startHelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"startHelpers.js","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"startHelpers.js","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"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"}
@@ -1,63 +1,18 @@
1
1
  /**
2
2
  * Validation layer for command options.
3
- *
4
- * Provides centralized validation with type safety and consistent error messages.
5
- * Eliminates scattered validation logic across commands.
6
3
  */
7
4
  import type { Protocol } from '../../connection/typed-cdp.js';
8
- /**
9
- * Base validation rule interface
10
- */
11
5
  export interface ValidationRule<T> {
12
- /** Validate and transform the value */
13
6
  validate: (value: unknown) => T;
14
- /** Optional custom error message */
15
7
  errorMessage?: (value: unknown) => string;
16
8
  }
17
- /**
18
- * Validation options for integer rules
19
- */
20
9
  export interface IntegerRuleOptions {
21
- /** Minimum allowed value */
22
10
  min?: number;
23
- /** Maximum allowed value */
24
11
  max?: number;
25
- /** Default value if not provided */
26
12
  default?: number;
27
- /** Whether the field is required */
28
13
  required?: boolean;
29
- /** Allow 0 to represent "all items" or unlimited */
30
14
  allowZeroForAll?: boolean;
31
15
  }
32
- /**
33
- * Create a positive integer validation rule
34
- *
35
- * @param options - Validation constraints
36
- * @returns Validation rule that parses and validates integers
37
- *
38
- * @example
39
- * ```typescript
40
- * const rules = {
41
- * last: positiveIntRule({ min: 1, max: 1000, default: 10 }),
42
- * timeout: positiveIntRule({ min: 1, max: 3600, required: false }),
43
- * };
44
- * ```
45
- */
46
16
  export declare function positiveIntRule(options?: IntegerRuleOptions): ValidationRule<number>;
47
- /**
48
- * Create a resource type validation rule for comma-separated type filters.
49
- * Performs case-insensitive matching and normalization.
50
- *
51
- * @returns Validation rule that parses and validates resource types
52
- *
53
- * @example
54
- * ```typescript
55
- * const rules = {
56
- * type: resourceTypeRule(),
57
- * };
58
- * const validated = validateOptions(options, rules);
59
- * // Input: "document,xhr" → Output: ["Document", "XHR"]
60
- * ```
61
- */
62
17
  export declare function resourceTypeRule(): ValidationRule<Protocol.Network.ResourceType[]>;
63
18
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAChC,oCAAoC;IACpC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAAC,MAAM,CAAC,CAoDxF;AA6ED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CA8BlF"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAqFD,wBAAgB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAAC,MAAM,CAAC,CAIxF;AAwCD,wBAAgB,gBAAgB,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBlF"}
@@ -1,72 +1,10 @@
1
1
  /**
2
2
  * Validation layer for command options.
3
- *
4
- * Provides centralized validation with type safety and consistent error messages.
5
- * Eliminates scattered validation logic across commands.
6
3
  */
7
4
  import { CommandError } from '../../ui/errors/index.js';
8
5
  import { invalidIntegerError } from '../../ui/messages/validation.js';
9
6
  import { EXIT_CODES } from '../../utils/exitCodes.js';
10
- /**
11
- * Create a positive integer validation rule
12
- *
13
- * @param options - Validation constraints
14
- * @returns Validation rule that parses and validates integers
15
- *
16
- * @example
17
- * ```typescript
18
- * const rules = {
19
- * last: positiveIntRule({ min: 1, max: 1000, default: 10 }),
20
- * timeout: positiveIntRule({ min: 1, max: 3600, required: false }),
21
- * };
22
- * ```
23
- */
24
- export function positiveIntRule(options = {}) {
25
- const { min, max, default: defaultValue, required = true, allowZeroForAll = false } = options;
26
- return {
27
- validate: (value) => {
28
- if (value === undefined || value === null) {
29
- if (defaultValue !== undefined) {
30
- return defaultValue;
31
- }
32
- if (!required) {
33
- return 0;
34
- }
35
- throw new CommandError('Value is required', {}, EXIT_CODES.INVALID_ARGUMENTS);
36
- }
37
- if (typeof value !== 'string' && typeof value !== 'number') {
38
- throw new CommandError(`Value must be a number, got ${typeof value}`, {}, EXIT_CODES.INVALID_ARGUMENTS);
39
- }
40
- const strValue = String(value).trim();
41
- const parsed = parseInt(strValue, 10);
42
- const errorOptions = {};
43
- if (min !== undefined)
44
- errorOptions.min = min;
45
- if (max !== undefined)
46
- errorOptions.max = max;
47
- if (isNaN(parsed)) {
48
- const message = invalidIntegerError('value', strValue, errorOptions);
49
- throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
50
- }
51
- if (parsed === 0 && allowZeroForAll) {
52
- return 0;
53
- }
54
- if (min !== undefined && parsed < min) {
55
- const message = invalidIntegerError('value', strValue, errorOptions);
56
- throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
57
- }
58
- if (max !== undefined && parsed > max) {
59
- const message = invalidIntegerError('value', strValue, errorOptions);
60
- throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
61
- }
62
- return parsed;
63
- },
64
- };
65
- }
66
- /**
67
- * Valid CDP ResourceType values for filtering.
68
- * Matches Protocol.Network.ResourceType enum.
69
- */
7
+ import { findSimilar } from '../../utils/suggestions.js';
70
8
  const VALID_RESOURCE_TYPES = [
71
9
  'Document',
72
10
  'Stylesheet',
@@ -88,34 +26,68 @@ const VALID_RESOURCE_TYPES = [
88
26
  'FedCM',
89
27
  'Other',
90
28
  ];
91
- /**
92
- * Parse comma-separated string into trimmed, non-empty tokens.
93
- *
94
- * @param value - Comma-separated string
95
- * @returns Array of trimmed, non-empty tokens
96
- */
29
+ function buildRangeSuggestion(min, max) {
30
+ if (min !== undefined && max !== undefined)
31
+ return `Use a value between ${min} and ${max}`;
32
+ if (min !== undefined)
33
+ return `Use a value >= ${min}`;
34
+ if (max !== undefined)
35
+ return `Use a value <= ${max}`;
36
+ return 'Provide a valid integer';
37
+ }
38
+ function throwValidationError(message, suggestion) {
39
+ throw new CommandError(message, { suggestion }, EXIT_CODES.INVALID_ARGUMENTS);
40
+ }
41
+ function buildErrorOptions(min, max) {
42
+ const opts = {};
43
+ if (min !== undefined)
44
+ opts.min = min;
45
+ if (max !== undefined)
46
+ opts.max = max;
47
+ return opts;
48
+ }
49
+ function parseInteger(value, options) {
50
+ const { min, max, default: defaultValue, required = true, allowZeroForAll = false } = options;
51
+ if (value === undefined || value === null) {
52
+ if (defaultValue !== undefined)
53
+ return defaultValue;
54
+ if (!required)
55
+ return 0;
56
+ throwValidationError('Value is required', 'Provide a numeric value for this option');
57
+ }
58
+ if (typeof value !== 'string' && typeof value !== 'number') {
59
+ throwValidationError(`Value must be a number, got ${typeof value}`, 'Provide a numeric value');
60
+ }
61
+ const parsed = parseInt(String(value).trim(), 10);
62
+ const rangeSuggestion = buildRangeSuggestion(min, max);
63
+ const errorOptions = buildErrorOptions(min, max);
64
+ if (isNaN(parsed)) {
65
+ throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
66
+ }
67
+ if (parsed === 0 && allowZeroForAll)
68
+ return 0;
69
+ if (min !== undefined && parsed < min) {
70
+ throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
71
+ }
72
+ if (max !== undefined && parsed > max) {
73
+ throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
74
+ }
75
+ return parsed;
76
+ }
77
+ export function positiveIntRule(options = {}) {
78
+ return {
79
+ validate: (value) => parseInteger(value, options),
80
+ };
81
+ }
97
82
  function parseCommaSeparated(value) {
98
83
  return value
99
84
  .split(',')
100
85
  .map((t) => t.trim())
101
86
  .filter((t) => t.length > 0);
102
87
  }
103
- /**
104
- * Normalize resource type string to CDP format (case-insensitive lookup).
105
- *
106
- * @param type - User input (e.g., "document", "xhr")
107
- * @returns Normalized CDP type or undefined if invalid
108
- */
109
88
  function normalizeResourceType(type) {
110
- const found = VALID_RESOURCE_TYPES.find((valid) => valid.toLowerCase() === type.toLowerCase());
111
- return found;
89
+ return VALID_RESOURCE_TYPES.find((valid) => valid.toLowerCase() === type.toLowerCase());
112
90
  }
113
- /**
114
- * Validate and normalize array of resource type strings.
115
- *
116
- * @param types - Array of type strings to validate
117
- * @returns Object with normalized types and invalid entries
118
- */
119
91
  function validateResourceTypes(types) {
120
92
  const normalized = [];
121
93
  const invalid = [];
@@ -130,39 +102,25 @@ function validateResourceTypes(types) {
130
102
  }
131
103
  return { normalized, invalid };
132
104
  }
133
- /**
134
- * Create a resource type validation rule for comma-separated type filters.
135
- * Performs case-insensitive matching and normalization.
136
- *
137
- * @returns Validation rule that parses and validates resource types
138
- *
139
- * @example
140
- * ```typescript
141
- * const rules = {
142
- * type: resourceTypeRule(),
143
- * };
144
- * const validated = validateOptions(options, rules);
145
- * // Input: "document,xhr" → Output: ["Document", "XHR"]
146
- * ```
147
- */
105
+ function buildTypoSuggestion(invalid) {
106
+ const similar = invalid.flatMap((inv) => findSimilar(inv, VALID_RESOURCE_TYPES));
107
+ const uniqueSimilar = [...new Set(similar)];
108
+ return uniqueSimilar.length > 0
109
+ ? `Did you mean: ${uniqueSimilar.join(', ')}?`
110
+ : `Valid types: ${VALID_RESOURCE_TYPES.join(', ')}`;
111
+ }
148
112
  export function resourceTypeRule() {
149
113
  return {
150
114
  validate: (value) => {
151
- // Handle empty input
152
- if (value === undefined || value === null || value === '') {
115
+ if (value === undefined || value === null || value === '')
153
116
  return [];
154
- }
155
- // Type guard
156
117
  if (typeof value !== 'string') {
157
- throw new CommandError('Resource type must be a string', {}, EXIT_CODES.INVALID_ARGUMENTS);
118
+ throwValidationError('Resource type must be a string', `Valid types: ${VALID_RESOURCE_TYPES.join(', ')}`);
158
119
  }
159
- // Parse and validate
160
120
  const types = parseCommaSeparated(value);
161
121
  const { normalized, invalid } = validateResourceTypes(types);
162
- // Report errors if any invalid types
163
122
  if (invalid.length > 0) {
164
- const validList = VALID_RESOURCE_TYPES.join(', ');
165
- throw new CommandError(`Invalid resource type(s): ${invalid.join(', ')}`, { suggestion: `Valid types: ${validList}` }, EXIT_CODES.INVALID_ARGUMENTS);
123
+ throwValidationError(`Invalid resource type(s): ${invalid.join(', ')}`, buildTypoSuggestion(invalid));
166
124
  }
167
125
  return normalized;
168
126
  },