@monoes/monobrowse 1.0.9 → 1.0.12

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 (221) hide show
  1. package/README.md +1 -1
  2. package/dist/src/__tests__/adapters.test.js +5 -2
  3. package/dist/src/__tests__/adapters.test.js.map +1 -1
  4. package/dist/src/__tests__/batch-eval-parsing.test.js +4 -2
  5. package/dist/src/__tests__/batch-eval-parsing.test.js.map +1 -1
  6. package/dist/src/__tests__/box-model.test.js +9 -5
  7. package/dist/src/__tests__/box-model.test.js.map +1 -1
  8. package/dist/src/__tests__/browser-launch.test.d.ts +10 -0
  9. package/dist/src/__tests__/browser-launch.test.d.ts.map +1 -1
  10. package/dist/src/__tests__/browser-launch.test.js +17 -10
  11. package/dist/src/__tests__/browser-launch.test.js.map +1 -1
  12. package/dist/src/__tests__/cdp-client.test.js +9 -3
  13. package/dist/src/__tests__/cdp-client.test.js.map +1 -1
  14. package/dist/src/__tests__/close-browser.test.d.ts +13 -0
  15. package/dist/src/__tests__/close-browser.test.d.ts.map +1 -1
  16. package/dist/src/__tests__/close-browser.test.js +40 -26
  17. package/dist/src/__tests__/close-browser.test.js.map +1 -1
  18. package/dist/src/__tests__/console-log.test.js +17 -6
  19. package/dist/src/__tests__/console-log.test.js.map +1 -1
  20. package/dist/src/__tests__/find.test.js +26 -6
  21. package/dist/src/__tests__/find.test.js.map +1 -1
  22. package/dist/src/__tests__/frame-command.test.js +9 -3
  23. package/dist/src/__tests__/frame-command.test.js.map +1 -1
  24. package/dist/src/__tests__/open-url-navigate-error.test.js +1 -3
  25. package/dist/src/__tests__/open-url-navigate-error.test.js.map +1 -1
  26. package/dist/src/__tests__/output.test.js +1 -1
  27. package/dist/src/__tests__/output.test.js.map +1 -1
  28. package/dist/src/__tests__/reap-idle-browser.test.d.ts +15 -0
  29. package/dist/src/__tests__/reap-idle-browser.test.d.ts.map +1 -0
  30. package/dist/src/__tests__/reap-idle-browser.test.js +238 -0
  31. package/dist/src/__tests__/reap-idle-browser.test.js.map +1 -0
  32. package/dist/src/__tests__/ref-cache.test.js +18 -10
  33. package/dist/src/__tests__/ref-cache.test.js.map +1 -1
  34. package/dist/src/__tests__/session-state.test.d.ts +8 -0
  35. package/dist/src/__tests__/session-state.test.d.ts.map +1 -1
  36. package/dist/src/__tests__/session-state.test.js +10 -10
  37. package/dist/src/__tests__/session-state.test.js.map +1 -1
  38. package/dist/src/__tests__/snapshot.test.js +45 -15
  39. package/dist/src/__tests__/snapshot.test.js.map +1 -1
  40. package/dist/src/__tests__/storage-eval.test.js +14 -6
  41. package/dist/src/__tests__/storage-eval.test.js.map +1 -1
  42. package/dist/src/__tests__/tabs.test.js +25 -9
  43. package/dist/src/__tests__/tabs.test.js.map +1 -1
  44. package/dist/src/browser/action-builder/analyzer.d.ts +1 -1
  45. package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -1
  46. package/dist/src/browser/action-builder/analyzer.js +25 -9
  47. package/dist/src/browser/action-builder/analyzer.js.map +1 -1
  48. package/dist/src/browser/action-builder/types.d.ts.map +1 -1
  49. package/dist/src/browser/actions.d.ts +1 -1
  50. package/dist/src/browser/actions.d.ts.map +1 -1
  51. package/dist/src/browser/actions.js +16 -6
  52. package/dist/src/browser/actions.js.map +1 -1
  53. package/dist/src/browser/adapters/gemini.d.ts.map +1 -1
  54. package/dist/src/browser/adapters/gemini.js.map +1 -1
  55. package/dist/src/browser/adapters/google.d.ts.map +1 -1
  56. package/dist/src/browser/adapters/google.js.map +1 -1
  57. package/dist/src/browser/adapters/index.d.ts.map +1 -1
  58. package/dist/src/browser/adapters/index.js +3 -3
  59. package/dist/src/browser/adapters/index.js.map +1 -1
  60. package/dist/src/browser/adapters/instagram.d.ts.map +1 -1
  61. package/dist/src/browser/adapters/instagram.js.map +1 -1
  62. package/dist/src/browser/adapters/linkedin.d.ts.map +1 -1
  63. package/dist/src/browser/adapters/linkedin.js.map +1 -1
  64. package/dist/src/browser/adapters/microsoft.d.ts.map +1 -1
  65. package/dist/src/browser/adapters/microsoft.js.map +1 -1
  66. package/dist/src/browser/adapters/x.d.ts.map +1 -1
  67. package/dist/src/browser/adapters/x.js.map +1 -1
  68. package/dist/src/browser/browser.d.ts +30 -0
  69. package/dist/src/browser/browser.d.ts.map +1 -1
  70. package/dist/src/browser/browser.js +122 -15
  71. package/dist/src/browser/browser.js.map +1 -1
  72. package/dist/src/browser/cdp.d.ts.map +1 -1
  73. package/dist/src/browser/cdp.js +21 -8
  74. package/dist/src/browser/cdp.js.map +1 -1
  75. package/dist/src/browser/console-log.d.ts.map +1 -1
  76. package/dist/src/browser/console-log.js +2 -2
  77. package/dist/src/browser/console-log.js.map +1 -1
  78. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  79. package/dist/src/browser/dashboard/server.js +29 -19
  80. package/dist/src/browser/dashboard/server.js.map +1 -1
  81. package/dist/src/browser/dashboard/ui.html +153 -165
  82. package/dist/src/browser/dialog.d.ts.map +1 -1
  83. package/dist/src/browser/dialog.js +3 -1
  84. package/dist/src/browser/dialog.js.map +1 -1
  85. package/dist/src/browser/emulation.d.ts.map +1 -1
  86. package/dist/src/browser/emulation.js +21 -6
  87. package/dist/src/browser/emulation.js.map +1 -1
  88. package/dist/src/browser/find.d.ts +4 -4
  89. package/dist/src/browser/find.d.ts.map +1 -1
  90. package/dist/src/browser/find.js +14 -6
  91. package/dist/src/browser/find.js.map +1 -1
  92. package/dist/src/browser/har.d.ts.map +1 -1
  93. package/dist/src/browser/har.js +14 -7
  94. package/dist/src/browser/har.js.map +1 -1
  95. package/dist/src/browser/index.d.ts +16 -16
  96. package/dist/src/browser/index.d.ts.map +1 -1
  97. package/dist/src/browser/index.js +16 -16
  98. package/dist/src/browser/index.js.map +1 -1
  99. package/dist/src/browser/network.d.ts.map +1 -1
  100. package/dist/src/browser/network.js +14 -4
  101. package/dist/src/browser/network.js.map +1 -1
  102. package/dist/src/browser/pdf.d.ts.map +1 -1
  103. package/dist/src/browser/pdf.js +3 -3
  104. package/dist/src/browser/pdf.js.map +1 -1
  105. package/dist/src/browser/profiler.d.ts.map +1 -1
  106. package/dist/src/browser/profiler.js +10 -5
  107. package/dist/src/browser/profiler.js.map +1 -1
  108. package/dist/src/browser/record.d.ts +1 -1
  109. package/dist/src/browser/record.d.ts.map +1 -1
  110. package/dist/src/browser/record.js +18 -7
  111. package/dist/src/browser/record.js.map +1 -1
  112. package/dist/src/browser/ref-cache.d.ts.map +1 -1
  113. package/dist/src/browser/ref-cache.js +9 -4
  114. package/dist/src/browser/ref-cache.js.map +1 -1
  115. package/dist/src/browser/screenshot.d.ts.map +1 -1
  116. package/dist/src/browser/screenshot.js +11 -7
  117. package/dist/src/browser/screenshot.js.map +1 -1
  118. package/dist/src/browser/session.d.ts +1 -1
  119. package/dist/src/browser/session.d.ts.map +1 -1
  120. package/dist/src/browser/session.js +27 -8
  121. package/dist/src/browser/session.js.map +1 -1
  122. package/dist/src/browser/snapshot.d.ts +1 -1
  123. package/dist/src/browser/snapshot.d.ts.map +1 -1
  124. package/dist/src/browser/snapshot.js +8 -4
  125. package/dist/src/browser/snapshot.js.map +1 -1
  126. package/dist/src/browser/storage.d.ts.map +1 -1
  127. package/dist/src/browser/storage.js.map +1 -1
  128. package/dist/src/browser/tabs.d.ts.map +1 -1
  129. package/dist/src/browser/tabs.js +9 -3
  130. package/dist/src/browser/tabs.js.map +1 -1
  131. package/dist/src/browser/trace.d.ts.map +1 -1
  132. package/dist/src/browser/trace.js +3 -3
  133. package/dist/src/browser/trace.js.map +1 -1
  134. package/dist/src/browser/types.d.ts.map +1 -1
  135. package/dist/src/browser/types.js +23 -4
  136. package/dist/src/browser/types.js.map +1 -1
  137. package/dist/src/browser/vitals.d.ts.map +1 -1
  138. package/dist/src/browser/vitals.js +1 -1
  139. package/dist/src/browser/vitals.js.map +1 -1
  140. package/dist/src/browser/wait.d.ts.map +1 -1
  141. package/dist/src/browser/wait.js +11 -5
  142. package/dist/src/browser/wait.js.map +1 -1
  143. package/dist/src/cli/action.d.ts.map +1 -1
  144. package/dist/src/cli/action.js +14 -11
  145. package/dist/src/cli/action.js.map +1 -1
  146. package/dist/src/cli/commands.d.ts.map +1 -1
  147. package/dist/src/cli/commands.js +453 -159
  148. package/dist/src/cli/commands.js.map +1 -1
  149. package/dist/src/cli/output.js +5 -5
  150. package/dist/src/cli/output.js.map +1 -1
  151. package/dist/src/cli/platform.d.ts.map +1 -1
  152. package/dist/src/cli/platform.js +15 -11
  153. package/dist/src/cli/platform.js.map +1 -1
  154. package/dist/src/cli/types.d.ts +1 -1
  155. package/dist/src/cli/types.d.ts.map +1 -1
  156. package/dist/src/cli.js +21 -9
  157. package/dist/src/cli.js.map +1 -1
  158. package/dist/src/index.d.ts +2 -2
  159. package/dist/src/index.d.ts.map +1 -1
  160. package/dist/src/index.js +2 -2
  161. package/dist/src/index.js.map +1 -1
  162. package/dist/tsconfig.tsbuildinfo +1 -1
  163. package/package.json +2 -2
  164. package/src/__tests__/adapters.test.ts +15 -8
  165. package/src/__tests__/batch-eval-parsing.test.ts +4 -2
  166. package/src/__tests__/box-model.test.ts +9 -5
  167. package/src/__tests__/browser-launch.test.ts +26 -15
  168. package/src/__tests__/cdp-client.test.ts +25 -9
  169. package/src/__tests__/close-browser.test.ts +49 -26
  170. package/src/__tests__/console-log.test.ts +36 -13
  171. package/src/__tests__/find.test.ts +58 -20
  172. package/src/__tests__/frame-command.test.ts +12 -6
  173. package/src/__tests__/open-url-navigate-error.test.ts +2 -4
  174. package/src/__tests__/output.test.ts +1 -1
  175. package/src/__tests__/reap-idle-browser.test.ts +276 -0
  176. package/src/__tests__/ref-cache.test.ts +25 -12
  177. package/src/__tests__/session-state.test.ts +40 -28
  178. package/src/__tests__/snapshot.test.ts +61 -22
  179. package/src/__tests__/storage-eval.test.ts +30 -16
  180. package/src/__tests__/tabs.test.ts +26 -10
  181. package/src/browser/action-builder/analyzer.ts +39 -15
  182. package/src/browser/action-builder/types.ts +45 -8
  183. package/src/browser/actions.ts +288 -123
  184. package/src/browser/adapters/gemini.ts +7 -3
  185. package/src/browser/adapters/google.ts +5 -3
  186. package/src/browser/adapters/index.ts +5 -4
  187. package/src/browser/adapters/instagram.ts +4 -2
  188. package/src/browser/adapters/linkedin.ts +4 -2
  189. package/src/browser/adapters/microsoft.ts +9 -5
  190. package/src/browser/adapters/x.ts +7 -3
  191. package/src/browser/browser.ts +188 -42
  192. package/src/browser/cdp.ts +43 -11
  193. package/src/browser/console-log.ts +24 -7
  194. package/src/browser/dashboard/server.ts +44 -25
  195. package/src/browser/dashboard/ui.html +153 -165
  196. package/src/browser/dialog.ts +25 -8
  197. package/src/browser/emulation.ts +86 -36
  198. package/src/browser/find.ts +110 -47
  199. package/src/browser/har.ts +58 -26
  200. package/src/browser/index.ts +16 -16
  201. package/src/browser/network.ts +147 -46
  202. package/src/browser/pdf.ts +4 -4
  203. package/src/browser/profiler.ts +23 -10
  204. package/src/browser/record.ts +38 -19
  205. package/src/browser/ref-cache.ts +38 -17
  206. package/src/browser/screenshot.ts +58 -32
  207. package/src/browser/session.ts +51 -18
  208. package/src/browser/snapshot.ts +34 -20
  209. package/src/browser/storage.ts +73 -17
  210. package/src/browser/tabs.ts +29 -17
  211. package/src/browser/trace.ts +14 -10
  212. package/src/browser/types.ts +23 -4
  213. package/src/browser/vitals.ts +33 -16
  214. package/src/browser/wait.ts +47 -21
  215. package/src/cli/action.ts +52 -21
  216. package/src/cli/commands.ts +1093 -385
  217. package/src/cli/output.ts +5 -5
  218. package/src/cli/platform.ts +44 -23
  219. package/src/cli/types.ts +1 -1
  220. package/src/cli.ts +34 -18
  221. package/src/index.ts +2 -2
package/src/cli/output.ts CHANGED
@@ -17,20 +17,20 @@ class OutputFormatter {
17
17
  }
18
18
 
19
19
  printSuccess(message: string): void {
20
- console.log(this.c('green', '✓') + ' ' + message);
20
+ console.log(`${this.c('green', '✓')} ${message}`);
21
21
  }
22
22
 
23
23
  printError(message: string, details?: string): void {
24
- console.error(this.c('red', '✗') + ' ' + message);
25
- if (details) console.error(this.c('red', ' ' + details));
24
+ console.error(`${this.c('red', '✗')} ${message}`);
25
+ if (details) console.error(this.c('red', ` ${details}`));
26
26
  }
27
27
 
28
28
  printWarning(message: string): void {
29
- console.warn(this.c('yellow', '⚠') + ' ' + message);
29
+ console.warn(`${this.c('yellow', '⚠')} ${message}`);
30
30
  }
31
31
 
32
32
  printInfo(message: string): void {
33
- console.log(this.c('cyan', 'ℹ') + ' ' + message);
33
+ console.log(`${this.c('cyan', 'ℹ')} ${message}`);
34
34
  }
35
35
  }
36
36
 
@@ -3,22 +3,22 @@
3
3
  * Sessions stored as JSON at ~/.monomind/sessions.json
4
4
  */
5
5
 
6
- import { Command } from 'commander';
7
- import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
8
6
  import { existsSync } from 'node:fs';
9
- import { join } from 'node:path';
7
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
10
8
  import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { Command } from 'commander';
11
11
  import { getAdapter } from '../index.js';
12
12
 
13
- const CDP_PORT = Number(process.env['MONOMIND_CDP_PORT'] ?? 9222);
13
+ const CDP_PORT = Number(process.env.MONOMIND_CDP_PORT ?? 9222);
14
14
 
15
15
  const SESSIONS_FILE = join(homedir(), '.monomind', 'sessions.json');
16
16
 
17
17
  interface Session {
18
- id: string; // "platform:username"
18
+ id: string; // "platform:username"
19
19
  platform: string;
20
20
  username: string;
21
- cookies: string; // JSON-serialized
21
+ cookies: string; // JSON-serialized
22
22
  userAgent: string;
23
23
  createdAt: number;
24
24
  lastUsedAt: number;
@@ -46,7 +46,9 @@ export function createPlatformCommand(): Command {
46
46
 
47
47
  cmd
48
48
  .command('connect <platform>')
49
- .description('Connect a platform account via browser — opens Chrome, waits for login, saves session')
49
+ .description(
50
+ 'Connect a platform account via browser — opens Chrome, waits for login, saves session',
51
+ )
50
52
  .option('--port <number>', 'CDP port of running Chrome instance', String(CDP_PORT))
51
53
  .option('--timeout <seconds>', 'Login timeout in seconds', '300')
52
54
  .action(async (platform: string, opts: { port: string; timeout: string }) => {
@@ -57,7 +59,9 @@ export function createPlatformCommand(): Command {
57
59
  }
58
60
 
59
61
  let adapter: ReturnType<typeof getAdapter>;
60
- try { adapter = getAdapter(platform); } catch (err) {
62
+ try {
63
+ adapter = getAdapter(platform);
64
+ } catch (err) {
61
65
  console.error(err instanceof Error ? err.message : String(err));
62
66
  process.exit(1);
63
67
  }
@@ -67,7 +71,9 @@ export function createPlatformCommand(): Command {
67
71
 
68
72
  // Lazy-load browser module
69
73
  let browser: typeof import('@monoes/monobrowse');
70
- try { browser = await import('@monoes/monobrowse'); } catch (err) {
74
+ try {
75
+ browser = await import('@monoes/monobrowse');
76
+ } catch (err) {
71
77
  console.error('Browser module unavailable:', err);
72
78
  process.exit(1);
73
79
  }
@@ -91,16 +97,18 @@ export function createPlatformCommand(): Command {
91
97
  const { client, sessionId: sid } = conn;
92
98
 
93
99
  try {
94
- const refs = new Map();
100
+ const _refs = new Map();
95
101
 
96
102
  // Restore any existing cookies first so the user might already be logged in
97
103
  const sessions = await loadSessions();
98
- const existingSession = sessions.find(s => s.platform === platform);
104
+ const existingSession = sessions.find((s) => s.platform === platform);
99
105
  if (existingSession?.cookies) {
100
106
  try {
101
107
  const cookies = JSON.parse(existingSession.cookies);
102
108
  if (cookies.length > 0) await browser.setCookies(client, sid, cookies);
103
- } catch { /* ignore */ }
109
+ } catch {
110
+ /* ignore */
111
+ }
104
112
  }
105
113
 
106
114
  // Navigate to login URL
@@ -120,25 +128,31 @@ export function createPlatformCommand(): Command {
120
128
  console.log(`│ Please sign in to ${platform.padEnd(34)}│`);
121
129
  console.log('│ │');
122
130
  console.log('│ Complete the login in the browser window. │');
123
- console.log(`│ Waiting up to ${Math.round(timeoutMs / 60000)} minutes for login… │`);
131
+ console.log(
132
+ `│ Waiting up to ${Math.round(timeoutMs / 60000)} minutes for login… │`,
133
+ );
124
134
  console.log('└──────────────────────────────────────────────────────┘');
125
135
  console.log('');
126
136
 
127
137
  const deadline = Date.now() + timeoutMs;
128
138
  while (Date.now() < deadline) {
129
- await new Promise(r => setTimeout(r, 2000));
139
+ await new Promise((r) => setTimeout(r, 2000));
130
140
  isLoggedIn = await adapter.isLoggedIn(pageIface).catch(() => false);
131
141
  if (isLoggedIn) break;
132
142
  // Navigate to app URL if user manually browsed away from login
133
143
  const currentUrl = await browser.getCurrentUrl(client, sid).catch(() => '');
134
- if (!currentUrl.includes(new URL(adapter.loginURL()).hostname) &&
135
- !currentUrl.includes(new URL(adapter.baseURL).hostname)) {
144
+ if (
145
+ !currentUrl.includes(new URL(adapter.loginURL()).hostname) &&
146
+ !currentUrl.includes(new URL(adapter.baseURL).hostname)
147
+ ) {
136
148
  await browser.openUrl(client, sid, adapter.loginURL());
137
149
  }
138
150
  }
139
151
 
140
152
  if (!isLoggedIn) {
141
- console.error(`\nLogin timeout after ${Math.round(timeoutMs / 1000)}s. Session not saved.`);
153
+ console.error(
154
+ `\nLogin timeout after ${Math.round(timeoutMs / 1000)}s. Session not saved.`,
155
+ );
142
156
  process.exit(1);
143
157
  }
144
158
  }
@@ -147,7 +161,9 @@ export function createPlatformCommand(): Command {
147
161
 
148
162
  // Capture cookies and user agent
149
163
  const liveCookies = await browser.getCookies(client, sid).catch(() => []);
150
- const userAgent = await browser.evaluateJs(client, sid, 'navigator.userAgent').catch(() => 'unknown') as string;
164
+ const userAgent = (await browser
165
+ .evaluateJs(client, sid, 'navigator.userAgent')
166
+ .catch(() => 'unknown')) as string;
151
167
  const username = await adapter.extractUsername(pageIface).catch(() => `${platform}-user`);
152
168
 
153
169
  // Save to sessions file
@@ -160,8 +176,9 @@ export function createPlatformCommand(): Command {
160
176
  createdAt: existingSession?.createdAt ?? Date.now(),
161
177
  lastUsedAt: Date.now(),
162
178
  };
163
- const idx = sessions.findIndex(s => s.platform === platform);
164
- if (idx >= 0) sessions[idx] = sessionEntry; else sessions.push(sessionEntry);
179
+ const idx = sessions.findIndex((s) => s.platform === platform);
180
+ if (idx >= 0) sessions[idx] = sessionEntry;
181
+ else sessions.push(sessionEntry);
165
182
  await saveSessions(sessions);
166
183
 
167
184
  console.log(`\n✓ Session saved: ${sessionEntry.id}`);
@@ -183,11 +200,15 @@ export function createPlatformCommand(): Command {
183
200
  console.log('No connected accounts. Run: browse platform connect <platform>');
184
201
  return;
185
202
  }
186
- console.log(`\n${'ID'.padEnd(40)} ${'PLATFORM'.padEnd(12)} ${'USERNAME'.padEnd(30)} LAST USED`);
203
+ console.log(
204
+ `\n${'ID'.padEnd(40)} ${'PLATFORM'.padEnd(12)} ${'USERNAME'.padEnd(30)} LAST USED`,
205
+ );
187
206
  console.log('─'.repeat(95));
188
207
  for (const s of sessions) {
189
208
  const lastUsed = new Date(s.lastUsedAt).toLocaleString();
190
- console.log(`${s.id.padEnd(40)} ${s.platform.padEnd(12)} ${s.username.padEnd(30)} ${lastUsed}`);
209
+ console.log(
210
+ `${s.id.padEnd(40)} ${s.platform.padEnd(12)} ${s.username.padEnd(30)} ${lastUsed}`,
211
+ );
191
212
  }
192
213
  });
193
214
 
@@ -196,7 +217,7 @@ export function createPlatformCommand(): Command {
196
217
  .description('Remove a saved platform session')
197
218
  .action(async (id: string) => {
198
219
  const sessions = await loadSessions();
199
- const idx = sessions.findIndex(s => s.id === id);
220
+ const idx = sessions.findIndex((s) => s.id === id);
200
221
  if (idx < 0) {
201
222
  console.error(`Session not found: ${id}`);
202
223
  console.log('Run "browse platform list" to see available sessions.');
package/src/cli/types.ts CHANGED
@@ -37,7 +37,7 @@ export interface CommandExample {
37
37
  description: string;
38
38
  }
39
39
 
40
- export type CommandAction = (ctx: CommandContext) => Promise<CommandResult | void>;
40
+ export type CommandAction = (ctx: CommandContext) => Promise<CommandResult | undefined>;
41
41
 
42
42
  export interface CommandResult {
43
43
  success: boolean;
package/src/cli.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  * Dispatches to the same command tree used by `monomind browse`
5
5
  */
6
6
 
7
- import { createRequire } from 'module';
7
+ import { createRequire } from 'node:module';
8
8
  import browseCommand from './cli/commands.js';
9
9
  import { output } from './cli/output.js';
10
- import type { Command, CommandContext, CommandOption, ParsedFlags } from './cli/types.js';
10
+ import type { Command, CommandContext, ParsedFlags } from './cli/types.js';
11
11
 
12
12
  const _require = createRequire(import.meta.url);
13
13
 
@@ -16,7 +16,7 @@ const _require = createRequire(import.meta.url);
16
16
  // ---------------------------------------------------------------------------
17
17
 
18
18
  function findSub(name: string, subs: Command[]): Command | undefined {
19
- return subs.find(s => s.name === name || s.aliases?.includes(name));
19
+ return subs.find((s) => s.name === name || s.aliases?.includes(name));
20
20
  }
21
21
 
22
22
  // ---------------------------------------------------------------------------
@@ -33,11 +33,14 @@ function buildShortMap(cmd: Command | undefined): Record<string, string> {
33
33
  }
34
34
 
35
35
  function isBooleanOpt(name: string, cmd: Command | undefined): boolean {
36
- const opt = cmd?.options?.find(o => o.name === name);
36
+ const opt = cmd?.options?.find((o) => o.name === name);
37
37
  return opt?.type === 'boolean';
38
38
  }
39
39
 
40
- function parseArgv(argv: string[], sub: Command | undefined): { args: string[]; flags: ParsedFlags } {
40
+ function parseArgv(
41
+ argv: string[],
42
+ sub: Command | undefined,
43
+ ): { args: string[]; flags: ParsedFlags } {
41
44
  const shortMap = buildShortMap(sub);
42
45
  const flags: ParsedFlags = { _: [] };
43
46
  const positional: string[] = [];
@@ -81,7 +84,7 @@ function parseArgv(argv: string[], sub: Command | undefined): { args: string[];
81
84
  }
82
85
 
83
86
  // Coerce number options
84
- for (const opt of (sub?.options ?? [])) {
87
+ for (const opt of sub?.options ?? []) {
85
88
  if (opt.type === 'number' && typeof flags[opt.name] === 'string') {
86
89
  flags[opt.name] = Number(flags[opt.name]);
87
90
  }
@@ -95,11 +98,12 @@ function parseArgv(argv: string[], sub: Command | undefined): { args: string[];
95
98
  // ---------------------------------------------------------------------------
96
99
 
97
100
  function printHelp(cmd: Command, prefix = 'monobrowse'): void {
98
- const usage = cmd.name === 'browse'
99
- ? `${prefix} <subcommand> [options]`
100
- : `${prefix} ${cmd.name} [subcommand] [options]`;
101
+ const usage =
102
+ cmd.name === 'browse'
103
+ ? `${prefix} <subcommand> [options]`
104
+ : `${prefix} ${cmd.name} [subcommand] [options]`;
101
105
  console.log(`\nUsage: ${usage}\n`);
102
- console.log(cmd.description + '\n');
106
+ console.log(`${cmd.description}\n`);
103
107
 
104
108
  if (cmd.subcommands?.length) {
105
109
  console.log('Subcommands:');
@@ -160,7 +164,12 @@ async function dispatch(cmd: Command, argv: string[]): Promise<void> {
160
164
  const nested = findSub(rest[0], sub.subcommands);
161
165
  if (nested?.action) {
162
166
  const { args, flags } = parseArgv(rest.slice(1), nested);
163
- const ctx: CommandContext = { args, flags, cwd: process.cwd(), interactive: !!process.stdout.isTTY };
167
+ const ctx: CommandContext = {
168
+ args,
169
+ flags,
170
+ cwd: process.cwd(),
171
+ interactive: !!process.stdout.isTTY,
172
+ };
164
173
  const result = await nested.action(ctx);
165
174
  if (result && !result.success) process.exitCode = result.exitCode ?? 1;
166
175
  return;
@@ -174,7 +183,12 @@ async function dispatch(cmd: Command, argv: string[]): Promise<void> {
174
183
  }
175
184
 
176
185
  const { args, flags } = parseArgv(rest, sub);
177
- const ctx: CommandContext = { args, flags, cwd: process.cwd(), interactive: !!process.stdout.isTTY };
186
+ const ctx: CommandContext = {
187
+ args,
188
+ flags,
189
+ cwd: process.cwd(),
190
+ interactive: !!process.stdout.isTTY,
191
+ };
178
192
  const result = await sub.action(ctx);
179
193
  if (result && !result.success) process.exitCode = result.exitCode ?? 1;
180
194
  }
@@ -200,9 +214,11 @@ async function main(): Promise<void> {
200
214
  await dispatch(browseCommand, userArgs);
201
215
  }
202
216
 
203
- main().then(() => {
204
- process.exit(process.exitCode ?? 0);
205
- }).catch(err => {
206
- output.printError(err instanceof Error ? err.message : String(err));
207
- process.exit(1);
208
- });
217
+ main()
218
+ .then(() => {
219
+ process.exit(process.exitCode ?? 0);
220
+ })
221
+ .catch((err) => {
222
+ output.printError(err instanceof Error ? err.message : String(err));
223
+ process.exit(1);
224
+ });
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './browser/index.js';
2
1
  export * from './browser/action-builder/analyzer.js';
3
2
  export * from './browser/action-builder/types.js';
4
3
  export * from './browser/adapters/index.js';
5
- export { startDashboard, getDashboard } from './browser/dashboard/server.js';
4
+ export { getDashboard, startDashboard } from './browser/dashboard/server.js';
5
+ export * from './browser/index.js';