@lhremote/cli 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/README.md +58 -2
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/handlers/campaign-add-action.d.ts +14 -0
  5. package/dist/handlers/campaign-add-action.d.ts.map +1 -0
  6. package/dist/handlers/campaign-add-action.js +51 -0
  7. package/dist/handlers/campaign-add-action.js.map +1 -0
  8. package/dist/handlers/campaign-add-action.test.d.ts +2 -0
  9. package/dist/handlers/campaign-add-action.test.d.ts.map +1 -0
  10. package/dist/handlers/campaign-add-action.test.js +121 -0
  11. package/dist/handlers/campaign-add-action.test.js.map +1 -0
  12. package/dist/handlers/campaign-create.d.ts +11 -0
  13. package/dist/handlers/campaign-create.d.ts.map +1 -0
  14. package/dist/handlers/campaign-create.js +79 -0
  15. package/dist/handlers/campaign-create.js.map +1 -0
  16. package/dist/handlers/campaign-create.test.d.ts +2 -0
  17. package/dist/handlers/campaign-create.test.d.ts.map +1 -0
  18. package/dist/handlers/campaign-create.test.js +139 -0
  19. package/dist/handlers/campaign-create.test.js.map +1 -0
  20. package/dist/handlers/campaign-delete.d.ts +8 -0
  21. package/dist/handlers/campaign-delete.d.ts.map +1 -0
  22. package/dist/handlers/campaign-delete.js +39 -0
  23. package/dist/handlers/campaign-delete.js.map +1 -0
  24. package/dist/handlers/campaign-delete.test.d.ts +2 -0
  25. package/dist/handlers/campaign-delete.test.d.ts.map +1 -0
  26. package/dist/handlers/campaign-delete.test.js +73 -0
  27. package/dist/handlers/campaign-delete.test.js.map +1 -0
  28. package/dist/handlers/campaign-exclude-add.d.ts +11 -0
  29. package/dist/handlers/campaign-exclude-add.d.ts.map +1 -0
  30. package/dist/handlers/campaign-exclude-add.js +58 -0
  31. package/dist/handlers/campaign-exclude-add.js.map +1 -0
  32. package/dist/handlers/campaign-exclude-add.test.d.ts +2 -0
  33. package/dist/handlers/campaign-exclude-add.test.d.ts.map +1 -0
  34. package/dist/handlers/campaign-exclude-add.test.js +144 -0
  35. package/dist/handlers/campaign-exclude-add.test.js.map +1 -0
  36. package/dist/handlers/campaign-exclude-list.d.ts +9 -0
  37. package/dist/handlers/campaign-exclude-list.d.ts.map +1 -0
  38. package/dist/handlers/campaign-exclude-list.js +46 -0
  39. package/dist/handlers/campaign-exclude-list.js.map +1 -0
  40. package/dist/handlers/campaign-exclude-list.test.d.ts +2 -0
  41. package/dist/handlers/campaign-exclude-list.test.d.ts.map +1 -0
  42. package/dist/handlers/campaign-exclude-list.test.js +109 -0
  43. package/dist/handlers/campaign-exclude-list.test.js.map +1 -0
  44. package/dist/handlers/campaign-exclude-remove.d.ts +11 -0
  45. package/dist/handlers/campaign-exclude-remove.d.ts.map +1 -0
  46. package/dist/handlers/campaign-exclude-remove.js +58 -0
  47. package/dist/handlers/campaign-exclude-remove.js.map +1 -0
  48. package/dist/handlers/campaign-exclude-remove.test.d.ts +2 -0
  49. package/dist/handlers/campaign-exclude-remove.test.d.ts.map +1 -0
  50. package/dist/handlers/campaign-exclude-remove.test.js +147 -0
  51. package/dist/handlers/campaign-exclude-remove.test.js.map +1 -0
  52. package/dist/handlers/campaign-export.d.ts +9 -0
  53. package/dist/handlers/campaign-export.d.ts.map +1 -0
  54. package/dist/handlers/campaign-export.js +42 -0
  55. package/dist/handlers/campaign-export.js.map +1 -0
  56. package/dist/handlers/campaign-export.test.d.ts +2 -0
  57. package/dist/handlers/campaign-export.test.d.ts.map +1 -0
  58. package/dist/handlers/campaign-export.test.js +84 -0
  59. package/dist/handlers/campaign-export.test.js.map +1 -0
  60. package/dist/handlers/campaign-get.d.ts +8 -0
  61. package/dist/handlers/campaign-get.d.ts.map +1 -0
  62. package/dist/handlers/campaign-get.js +46 -0
  63. package/dist/handlers/campaign-get.js.map +1 -0
  64. package/dist/handlers/campaign-get.test.d.ts +2 -0
  65. package/dist/handlers/campaign-get.test.d.ts.map +1 -0
  66. package/dist/handlers/campaign-get.test.js +131 -0
  67. package/dist/handlers/campaign-get.test.js.map +1 -0
  68. package/dist/handlers/campaign-list.d.ts +6 -0
  69. package/dist/handlers/campaign-list.d.ts.map +1 -0
  70. package/dist/handlers/campaign-list.js +55 -0
  71. package/dist/handlers/campaign-list.js.map +1 -0
  72. package/dist/handlers/campaign-list.test.d.ts +2 -0
  73. package/dist/handlers/campaign-list.test.d.ts.map +1 -0
  74. package/dist/handlers/campaign-list.test.js +129 -0
  75. package/dist/handlers/campaign-list.test.js.map +1 -0
  76. package/dist/handlers/campaign-move-next.d.ts +10 -0
  77. package/dist/handlers/campaign-move-next.d.ts.map +1 -0
  78. package/dist/handlers/campaign-move-next.js +52 -0
  79. package/dist/handlers/campaign-move-next.js.map +1 -0
  80. package/dist/handlers/campaign-move-next.test.d.ts +2 -0
  81. package/dist/handlers/campaign-move-next.test.d.ts.map +1 -0
  82. package/dist/handlers/campaign-move-next.test.js +127 -0
  83. package/dist/handlers/campaign-move-next.test.js.map +1 -0
  84. package/dist/handlers/campaign-remove-action.d.ts +8 -0
  85. package/dist/handlers/campaign-remove-action.d.ts.map +1 -0
  86. package/dist/handlers/campaign-remove-action.js +43 -0
  87. package/dist/handlers/campaign-remove-action.js.map +1 -0
  88. package/dist/handlers/campaign-remove-action.test.d.ts +2 -0
  89. package/dist/handlers/campaign-remove-action.test.d.ts.map +1 -0
  90. package/dist/handlers/campaign-remove-action.test.js +79 -0
  91. package/dist/handlers/campaign-remove-action.test.js.map +1 -0
  92. package/dist/handlers/campaign-reorder-actions.d.ts +9 -0
  93. package/dist/handlers/campaign-reorder-actions.d.ts.map +1 -0
  94. package/dist/handlers/campaign-reorder-actions.js +66 -0
  95. package/dist/handlers/campaign-reorder-actions.js.map +1 -0
  96. package/dist/handlers/campaign-reorder-actions.test.d.ts +2 -0
  97. package/dist/handlers/campaign-reorder-actions.test.d.ts.map +1 -0
  98. package/dist/handlers/campaign-reorder-actions.test.js +118 -0
  99. package/dist/handlers/campaign-reorder-actions.test.js.map +1 -0
  100. package/dist/handlers/campaign-retry.d.ts +10 -0
  101. package/dist/handlers/campaign-retry.d.ts.map +1 -0
  102. package/dist/handlers/campaign-retry.js +45 -0
  103. package/dist/handlers/campaign-retry.js.map +1 -0
  104. package/dist/handlers/campaign-retry.test.d.ts +2 -0
  105. package/dist/handlers/campaign-retry.test.d.ts.map +1 -0
  106. package/dist/handlers/campaign-retry.test.js +111 -0
  107. package/dist/handlers/campaign-retry.test.js.map +1 -0
  108. package/dist/handlers/campaign-start.d.ts +10 -0
  109. package/dist/handlers/campaign-start.d.ts.map +1 -0
  110. package/dist/handlers/campaign-start.js +54 -0
  111. package/dist/handlers/campaign-start.js.map +1 -0
  112. package/dist/handlers/campaign-start.test.d.ts +2 -0
  113. package/dist/handlers/campaign-start.test.d.ts.map +1 -0
  114. package/dist/handlers/campaign-start.test.js +119 -0
  115. package/dist/handlers/campaign-start.test.js.map +1 -0
  116. package/dist/handlers/campaign-statistics.d.ts +10 -0
  117. package/dist/handlers/campaign-statistics.d.ts.map +1 -0
  118. package/dist/handlers/campaign-statistics.js +63 -0
  119. package/dist/handlers/campaign-statistics.js.map +1 -0
  120. package/dist/handlers/campaign-statistics.test.d.ts +2 -0
  121. package/dist/handlers/campaign-statistics.test.d.ts.map +1 -0
  122. package/dist/handlers/campaign-statistics.test.js +141 -0
  123. package/dist/handlers/campaign-statistics.test.js.map +1 -0
  124. package/dist/handlers/campaign-status.d.ts +10 -0
  125. package/dist/handlers/campaign-status.d.ts.map +1 -0
  126. package/dist/handlers/campaign-status.js +62 -0
  127. package/dist/handlers/campaign-status.js.map +1 -0
  128. package/dist/handlers/campaign-status.test.d.ts +2 -0
  129. package/dist/handlers/campaign-status.test.d.ts.map +1 -0
  130. package/dist/handlers/campaign-status.test.js +123 -0
  131. package/dist/handlers/campaign-status.test.js.map +1 -0
  132. package/dist/handlers/campaign-stop.d.ts +8 -0
  133. package/dist/handlers/campaign-stop.d.ts.map +1 -0
  134. package/dist/handlers/campaign-stop.js +39 -0
  135. package/dist/handlers/campaign-stop.js.map +1 -0
  136. package/dist/handlers/campaign-stop.test.d.ts +2 -0
  137. package/dist/handlers/campaign-stop.test.d.ts.map +1 -0
  138. package/dist/handlers/campaign-stop.test.js +73 -0
  139. package/dist/handlers/campaign-stop.test.js.map +1 -0
  140. package/dist/handlers/campaign-update.d.ts +11 -0
  141. package/dist/handlers/campaign-update.d.ts.map +1 -0
  142. package/dist/handlers/campaign-update.js +51 -0
  143. package/dist/handlers/campaign-update.js.map +1 -0
  144. package/dist/handlers/campaign-update.test.d.ts +2 -0
  145. package/dist/handlers/campaign-update.test.d.ts.map +1 -0
  146. package/dist/handlers/campaign-update.test.js +95 -0
  147. package/dist/handlers/campaign-update.test.js.map +1 -0
  148. package/dist/handlers/check-replies.d.ts +9 -0
  149. package/dist/handlers/check-replies.d.ts.map +1 -0
  150. package/dist/handlers/check-replies.js +49 -0
  151. package/dist/handlers/check-replies.js.map +1 -0
  152. package/dist/handlers/check-replies.test.d.ts +2 -0
  153. package/dist/handlers/check-replies.test.d.ts.map +1 -0
  154. package/dist/handlers/check-replies.test.js +138 -0
  155. package/dist/handlers/check-replies.test.js.map +1 -0
  156. package/dist/handlers/check-status.d.ts +3 -0
  157. package/dist/handlers/check-status.d.ts.map +1 -1
  158. package/dist/handlers/check-status.js +9 -3
  159. package/dist/handlers/check-status.js.map +1 -1
  160. package/dist/handlers/check-status.test.js +3 -1
  161. package/dist/handlers/check-status.test.js.map +1 -1
  162. package/dist/handlers/describe-actions.d.ts +7 -0
  163. package/dist/handlers/describe-actions.d.ts.map +1 -0
  164. package/dist/handlers/describe-actions.js +74 -0
  165. package/dist/handlers/describe-actions.js.map +1 -0
  166. package/dist/handlers/describe-actions.test.d.ts +2 -0
  167. package/dist/handlers/describe-actions.test.d.ts.map +1 -0
  168. package/dist/handlers/describe-actions.test.js +95 -0
  169. package/dist/handlers/describe-actions.test.js.map +1 -0
  170. package/dist/handlers/find-app.d.ts +5 -0
  171. package/dist/handlers/find-app.d.ts.map +1 -0
  172. package/dist/handlers/find-app.js +28 -0
  173. package/dist/handlers/find-app.js.map +1 -0
  174. package/dist/handlers/find-app.test.d.ts +2 -0
  175. package/dist/handlers/find-app.test.d.ts.map +1 -0
  176. package/dist/handlers/find-app.test.js +75 -0
  177. package/dist/handlers/find-app.test.js.map +1 -0
  178. package/dist/handlers/import-people-from-urls.d.ts +10 -0
  179. package/dist/handlers/import-people-from-urls.d.ts.map +1 -0
  180. package/dist/handlers/import-people-from-urls.js +96 -0
  181. package/dist/handlers/import-people-from-urls.js.map +1 -0
  182. package/dist/handlers/import-people-from-urls.test.d.ts +2 -0
  183. package/dist/handlers/import-people-from-urls.test.d.ts.map +1 -0
  184. package/dist/handlers/import-people-from-urls.test.js +166 -0
  185. package/dist/handlers/import-people-from-urls.test.js.map +1 -0
  186. package/dist/handlers/index.d.ts +26 -1
  187. package/dist/handlers/index.d.ts.map +1 -1
  188. package/dist/handlers/index.js +28 -1
  189. package/dist/handlers/index.js.map +1 -1
  190. package/dist/handlers/launch-app.d.ts +2 -3
  191. package/dist/handlers/launch-app.d.ts.map +1 -1
  192. package/dist/handlers/launch-app.js +7 -4
  193. package/dist/handlers/launch-app.js.map +1 -1
  194. package/dist/handlers/launch-app.test.js +8 -6
  195. package/dist/handlers/launch-app.test.js.map +1 -1
  196. package/dist/handlers/list-accounts.d.ts +3 -0
  197. package/dist/handlers/list-accounts.d.ts.map +1 -1
  198. package/dist/handlers/list-accounts.js +10 -4
  199. package/dist/handlers/list-accounts.js.map +1 -1
  200. package/dist/handlers/list-accounts.test.js +4 -13
  201. package/dist/handlers/list-accounts.test.js.map +1 -1
  202. package/dist/handlers/person-ids.d.ts +7 -0
  203. package/dist/handlers/person-ids.d.ts.map +1 -0
  204. package/dist/handlers/person-ids.js +50 -0
  205. package/dist/handlers/person-ids.js.map +1 -0
  206. package/dist/handlers/query-messages.d.ts +10 -0
  207. package/dist/handlers/query-messages.d.ts.map +1 -0
  208. package/dist/handlers/query-messages.integration.test.d.ts +2 -0
  209. package/dist/handlers/query-messages.integration.test.d.ts.map +1 -0
  210. package/dist/handlers/query-messages.integration.test.js +106 -0
  211. package/dist/handlers/query-messages.integration.test.js.map +1 -0
  212. package/dist/handlers/query-messages.js +113 -0
  213. package/dist/handlers/query-messages.js.map +1 -0
  214. package/dist/handlers/query-messages.test.d.ts +2 -0
  215. package/dist/handlers/query-messages.test.d.ts.map +1 -0
  216. package/dist/handlers/query-messages.test.js +231 -0
  217. package/dist/handlers/query-messages.test.js.map +1 -0
  218. package/dist/handlers/query-profile.d.ts +7 -0
  219. package/dist/handlers/query-profile.d.ts.map +1 -0
  220. package/dist/handlers/query-profile.js +79 -0
  221. package/dist/handlers/query-profile.js.map +1 -0
  222. package/dist/handlers/query-profile.test.d.ts +2 -0
  223. package/dist/handlers/query-profile.test.d.ts.map +1 -0
  224. package/dist/handlers/query-profile.test.js +221 -0
  225. package/dist/handlers/query-profile.test.js.map +1 -0
  226. package/dist/handlers/query-profiles.d.ts +9 -0
  227. package/dist/handlers/query-profiles.d.ts.map +1 -0
  228. package/dist/handlers/query-profiles.js +83 -0
  229. package/dist/handlers/query-profiles.js.map +1 -0
  230. package/dist/handlers/query-profiles.test.d.ts +2 -0
  231. package/dist/handlers/query-profiles.test.d.ts.map +1 -0
  232. package/dist/handlers/query-profiles.test.js +286 -0
  233. package/dist/handlers/query-profiles.test.js.map +1 -0
  234. package/dist/handlers/quit-app.d.ts +2 -3
  235. package/dist/handlers/quit-app.d.ts.map +1 -1
  236. package/dist/handlers/quit-app.js +7 -4
  237. package/dist/handlers/quit-app.js.map +1 -1
  238. package/dist/handlers/quit-app.test.js +6 -14
  239. package/dist/handlers/quit-app.test.js.map +1 -1
  240. package/dist/handlers/scrape-messaging-history.d.ts +8 -0
  241. package/dist/handlers/scrape-messaging-history.d.ts.map +1 -0
  242. package/dist/handlers/scrape-messaging-history.js +45 -0
  243. package/dist/handlers/scrape-messaging-history.js.map +1 -0
  244. package/dist/handlers/scrape-messaging-history.test.d.ts +2 -0
  245. package/dist/handlers/scrape-messaging-history.test.d.ts.map +1 -0
  246. package/dist/handlers/scrape-messaging-history.test.js +101 -0
  247. package/dist/handlers/scrape-messaging-history.test.js.map +1 -0
  248. package/dist/handlers/start-instance.d.ts +3 -0
  249. package/dist/handlers/start-instance.d.ts.map +1 -1
  250. package/dist/handlers/start-instance.js +11 -5
  251. package/dist/handlers/start-instance.js.map +1 -1
  252. package/dist/handlers/start-instance.test.js +13 -38
  253. package/dist/handlers/start-instance.test.js.map +1 -1
  254. package/dist/handlers/stop-instance.d.ts +3 -0
  255. package/dist/handlers/stop-instance.d.ts.map +1 -1
  256. package/dist/handlers/stop-instance.js +11 -5
  257. package/dist/handlers/stop-instance.js.map +1 -1
  258. package/dist/handlers/stop-instance.test.js +14 -30
  259. package/dist/handlers/stop-instance.test.js.map +1 -1
  260. package/dist/handlers/testing/mock-helpers.d.ts +56 -0
  261. package/dist/handlers/testing/mock-helpers.d.ts.map +1 -0
  262. package/dist/handlers/testing/mock-helpers.js +95 -0
  263. package/dist/handlers/testing/mock-helpers.js.map +1 -0
  264. package/dist/program.d.ts.map +1 -1
  265. package/dist/program.js +284 -8
  266. package/dist/program.js.map +1 -1
  267. package/dist/program.test.js +74 -12
  268. package/dist/program.test.js.map +1 -1
  269. package/package.json +9 -5
  270. package/dist/handlers/visit-and-extract.d.ts +0 -5
  271. package/dist/handlers/visit-and-extract.d.ts.map +0 -1
  272. package/dist/handlers/visit-and-extract.js +0 -105
  273. package/dist/handlers/visit-and-extract.js.map +0 -1
  274. package/dist/handlers/visit-and-extract.test.d.ts +0 -2
  275. package/dist/handlers/visit-and-extract.test.d.ts.map +0 -1
  276. package/dist/handlers/visit-and-extract.test.js +0 -279
  277. package/dist/handlers/visit-and-extract.test.js.map +0 -1
@@ -1,105 +0,0 @@
1
- import { DatabaseClient, discoverDatabase, discoverInstancePort, InstanceService, LauncherService, ProfileService, } from "@lhremote/core";
2
- export async function handleVisitAndExtract(profileUrl, options) {
3
- if (!isLinkedInProfileUrl(profileUrl)) {
4
- process.stderr.write("Invalid LinkedIn profile URL. Expected: https://www.linkedin.com/in/username\n");
5
- process.exitCode = 1;
6
- return;
7
- }
8
- const cdpPort = options.cdpPort ?? 9222;
9
- // Connect to launcher to find the running account
10
- const launcher = new LauncherService(cdpPort);
11
- let accountId;
12
- try {
13
- await launcher.connect();
14
- const accounts = await launcher.listAccounts();
15
- if (accounts.length === 0) {
16
- process.stderr.write("No accounts found.\n");
17
- process.exitCode = 1;
18
- return;
19
- }
20
- if (accounts.length > 1) {
21
- process.stderr.write("Multiple accounts found. Cannot determine which instance to use.\n");
22
- process.exitCode = 1;
23
- return;
24
- }
25
- accountId = accounts[0].id;
26
- }
27
- catch (error) {
28
- const message = error instanceof Error ? error.message : String(error);
29
- process.stderr.write(`${message}\n`);
30
- process.exitCode = 1;
31
- return;
32
- }
33
- finally {
34
- launcher.disconnect();
35
- }
36
- // Discover instance CDP port
37
- const instancePort = await discoverInstancePort(cdpPort);
38
- if (instancePort === null) {
39
- process.stderr.write("No LinkedHelper instance is running. Use start-instance first.\n");
40
- process.exitCode = 1;
41
- return;
42
- }
43
- // Connect to instance and extract profile
44
- const instance = new InstanceService(instancePort);
45
- let db = null;
46
- try {
47
- await instance.connect();
48
- const dbPath = discoverDatabase(accountId);
49
- db = new DatabaseClient(dbPath);
50
- const profileService = new ProfileService(instance, db);
51
- const profile = await profileService.visitAndExtract(profileUrl);
52
- if (options.json) {
53
- process.stdout.write(JSON.stringify(profile, null, 2) + "\n");
54
- }
55
- else {
56
- const name = [
57
- profile.miniProfile.firstName,
58
- profile.miniProfile.lastName,
59
- ]
60
- .filter(Boolean)
61
- .join(" ");
62
- process.stdout.write(`${name}\n`);
63
- if (profile.miniProfile.headline) {
64
- process.stdout.write(`${profile.miniProfile.headline}\n`);
65
- }
66
- if (profile.currentPosition) {
67
- const parts = [
68
- profile.currentPosition.title,
69
- profile.currentPosition.company,
70
- ].filter(Boolean);
71
- if (parts.length > 0) {
72
- process.stdout.write(`${parts.join(" at ")}\n`);
73
- }
74
- }
75
- if (profile.emails.length > 0) {
76
- process.stdout.write(`Emails: ${profile.emails.join(", ")}\n`);
77
- }
78
- if (profile.skills.length > 0) {
79
- process.stdout.write(`Skills: ${profile.skills.map((s) => s.name).join(", ")}\n`);
80
- }
81
- process.stdout.write(`Positions: ${String(profile.positions.length)}, Education: ${String(profile.education.length)}\n`);
82
- }
83
- }
84
- catch (error) {
85
- const message = error instanceof Error ? error.message : String(error);
86
- process.stderr.write(`${message}\n`);
87
- process.exitCode = 1;
88
- }
89
- finally {
90
- instance.disconnect();
91
- db?.close();
92
- }
93
- }
94
- function isLinkedInProfileUrl(url) {
95
- try {
96
- const parsed = new URL(url);
97
- return ((parsed.hostname === "www.linkedin.com" ||
98
- parsed.hostname === "linkedin.com") &&
99
- parsed.pathname.startsWith("/in/"));
100
- }
101
- catch {
102
- return false;
103
- }
104
- }
105
- //# sourceMappingURL=visit-and-extract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visit-and-extract.js","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=visit-and-extract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visit-and-extract.test.d.ts","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.test.ts"],"names":[],"mappings":""}
@@ -1,279 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- vi.mock("@lhremote/core", async (importOriginal) => {
3
- const actual = await importOriginal();
4
- return {
5
- ...actual,
6
- LauncherService: vi.fn(),
7
- InstanceService: vi.fn(),
8
- DatabaseClient: vi.fn(),
9
- ProfileService: vi.fn(),
10
- discoverInstancePort: vi.fn(),
11
- discoverDatabase: vi.fn(),
12
- };
13
- });
14
- import { DatabaseClient, discoverDatabase, discoverInstancePort, InstanceService, LauncherService, ProfileService, } from "@lhremote/core";
15
- import { handleVisitAndExtract } from "./visit-and-extract.js";
16
- const PROFILE_URL = "https://www.linkedin.com/in/john-doe";
17
- const MOCK_PROFILE = {
18
- id: 1,
19
- miniProfile: {
20
- firstName: "John",
21
- lastName: "Doe",
22
- headline: "Software Engineer",
23
- avatar: null,
24
- },
25
- externalIds: [],
26
- currentPosition: { company: "Acme Corp", title: "Senior Engineer" },
27
- positions: [
28
- {
29
- company: "Acme Corp",
30
- title: "Senior Engineer",
31
- startDate: "2020-01",
32
- endDate: null,
33
- isCurrent: true,
34
- },
35
- ],
36
- education: [
37
- {
38
- school: "MIT",
39
- degree: "BS",
40
- field: "CS",
41
- startDate: "2014",
42
- endDate: "2018",
43
- },
44
- ],
45
- skills: [{ name: "TypeScript" }, { name: "Node.js" }],
46
- emails: ["john@example.com"],
47
- };
48
- function mockLauncher(overrides = {}) {
49
- const disconnect = vi.fn();
50
- vi.mocked(LauncherService).mockImplementation(function () {
51
- return {
52
- connect: vi.fn().mockResolvedValue(undefined),
53
- disconnect,
54
- listAccounts: vi
55
- .fn()
56
- .mockResolvedValue([{ id: 1, liId: 1, name: "Alice" }]),
57
- ...overrides,
58
- };
59
- });
60
- return { disconnect };
61
- }
62
- function mockInstance() {
63
- const disconnect = vi.fn();
64
- vi.mocked(InstanceService).mockImplementation(function () {
65
- return {
66
- connect: vi.fn().mockResolvedValue(undefined),
67
- disconnect,
68
- };
69
- });
70
- return { disconnect };
71
- }
72
- function mockDb() {
73
- const close = vi.fn();
74
- vi.mocked(DatabaseClient).mockImplementation(function () {
75
- return { close, db: {} };
76
- });
77
- return { close };
78
- }
79
- function mockProfileService(profile = MOCK_PROFILE) {
80
- vi.mocked(ProfileService).mockImplementation(function () {
81
- return {
82
- visitAndExtract: vi.fn().mockResolvedValue(profile),
83
- };
84
- });
85
- }
86
- function setupSuccessPath() {
87
- mockLauncher();
88
- mockInstance();
89
- mockDb();
90
- mockProfileService();
91
- vi.mocked(discoverInstancePort).mockResolvedValue(55123);
92
- vi.mocked(discoverDatabase).mockReturnValue("/path/to/db");
93
- }
94
- describe("handleVisitAndExtract", () => {
95
- const originalExitCode = process.exitCode;
96
- beforeEach(() => {
97
- process.exitCode = undefined;
98
- vi.clearAllMocks();
99
- });
100
- afterEach(() => {
101
- process.exitCode = originalExitCode;
102
- vi.restoreAllMocks();
103
- });
104
- it("sets exitCode 1 for invalid LinkedIn URL", async () => {
105
- const stderrSpy = vi
106
- .spyOn(process.stderr, "write")
107
- .mockReturnValue(true);
108
- await handleVisitAndExtract("https://example.com/not-linkedin", {});
109
- expect(process.exitCode).toBe(1);
110
- expect(stderrSpy).toHaveBeenCalledWith("Invalid LinkedIn profile URL. Expected: https://www.linkedin.com/in/username\n");
111
- });
112
- it("prints JSON with --json", async () => {
113
- const stdoutSpy = vi
114
- .spyOn(process.stdout, "write")
115
- .mockReturnValue(true);
116
- setupSuccessPath();
117
- await handleVisitAndExtract(PROFILE_URL, { json: true });
118
- expect(process.exitCode).toBeUndefined();
119
- const output = stdoutSpy.mock.calls
120
- .map((call) => String(call[0]))
121
- .join("");
122
- expect(JSON.parse(output)).toEqual(MOCK_PROFILE);
123
- });
124
- it("prints human-friendly output on success", async () => {
125
- const stdoutSpy = vi
126
- .spyOn(process.stdout, "write")
127
- .mockReturnValue(true);
128
- setupSuccessPath();
129
- await handleVisitAndExtract(PROFILE_URL, {});
130
- expect(process.exitCode).toBeUndefined();
131
- expect(stdoutSpy).toHaveBeenCalledWith("John Doe\n");
132
- expect(stdoutSpy).toHaveBeenCalledWith("Software Engineer\n");
133
- expect(stdoutSpy).toHaveBeenCalledWith("Senior Engineer at Acme Corp\n");
134
- expect(stdoutSpy).toHaveBeenCalledWith("Emails: john@example.com\n");
135
- expect(stdoutSpy).toHaveBeenCalledWith("Skills: TypeScript, Node.js\n");
136
- expect(stdoutSpy).toHaveBeenCalledWith("Positions: 1, Education: 1\n");
137
- });
138
- it("handles profile with no headline or current position", async () => {
139
- const stdoutSpy = vi
140
- .spyOn(process.stdout, "write")
141
- .mockReturnValue(true);
142
- const minimalProfile = {
143
- id: 2,
144
- miniProfile: {
145
- firstName: "Jane",
146
- lastName: null,
147
- headline: null,
148
- avatar: null,
149
- },
150
- externalIds: [],
151
- currentPosition: null,
152
- positions: [],
153
- education: [],
154
- skills: [],
155
- emails: [],
156
- };
157
- mockLauncher();
158
- mockInstance();
159
- mockDb();
160
- mockProfileService(minimalProfile);
161
- vi.mocked(discoverInstancePort).mockResolvedValue(55123);
162
- vi.mocked(discoverDatabase).mockReturnValue("/path/to/db");
163
- await handleVisitAndExtract(PROFILE_URL, {});
164
- expect(process.exitCode).toBeUndefined();
165
- expect(stdoutSpy).toHaveBeenCalledWith("Jane\n");
166
- expect(stdoutSpy).toHaveBeenCalledWith("Positions: 0, Education: 0\n");
167
- // Should not print headline, emails, skills lines
168
- const calls = stdoutSpy.mock.calls.map((c) => String(c[0]));
169
- expect(calls).not.toContainEqual(expect.stringContaining("Emails:"));
170
- expect(calls).not.toContainEqual(expect.stringContaining("Skills:"));
171
- });
172
- it("sets exitCode 1 when no accounts found", async () => {
173
- const stderrSpy = vi
174
- .spyOn(process.stderr, "write")
175
- .mockReturnValue(true);
176
- mockLauncher({
177
- listAccounts: vi.fn().mockResolvedValue([]),
178
- });
179
- await handleVisitAndExtract(PROFILE_URL, {});
180
- expect(process.exitCode).toBe(1);
181
- expect(stderrSpy).toHaveBeenCalledWith("No accounts found.\n");
182
- });
183
- it("sets exitCode 1 when multiple accounts found", async () => {
184
- const stderrSpy = vi
185
- .spyOn(process.stderr, "write")
186
- .mockReturnValue(true);
187
- mockLauncher({
188
- listAccounts: vi.fn().mockResolvedValue([
189
- { id: 1, liId: 1, name: "Alice" },
190
- { id: 2, liId: 2, name: "Bob" },
191
- ]),
192
- });
193
- await handleVisitAndExtract(PROFILE_URL, {});
194
- expect(process.exitCode).toBe(1);
195
- expect(stderrSpy).toHaveBeenCalledWith("Multiple accounts found. Cannot determine which instance to use.\n");
196
- });
197
- it("sets exitCode 1 when launcher connection fails", async () => {
198
- const stderrSpy = vi
199
- .spyOn(process.stderr, "write")
200
- .mockReturnValue(true);
201
- vi.mocked(LauncherService).mockImplementation(function () {
202
- return {
203
- connect: vi.fn().mockRejectedValue(new Error("connection refused")),
204
- disconnect: vi.fn(),
205
- };
206
- });
207
- await handleVisitAndExtract(PROFILE_URL, {});
208
- expect(process.exitCode).toBe(1);
209
- expect(stderrSpy).toHaveBeenCalledWith("connection refused\n");
210
- });
211
- it("sets exitCode 1 when no instance running", async () => {
212
- const stderrSpy = vi
213
- .spyOn(process.stderr, "write")
214
- .mockReturnValue(true);
215
- mockLauncher();
216
- vi.mocked(discoverInstancePort).mockResolvedValue(null);
217
- await handleVisitAndExtract(PROFILE_URL, {});
218
- expect(process.exitCode).toBe(1);
219
- expect(stderrSpy).toHaveBeenCalledWith("No LinkedHelper instance is running. Use start-instance first.\n");
220
- });
221
- it("sets exitCode 1 on extraction error", async () => {
222
- const stderrSpy = vi
223
- .spyOn(process.stderr, "write")
224
- .mockReturnValue(true);
225
- mockLauncher();
226
- mockInstance();
227
- mockDb();
228
- vi.mocked(discoverInstancePort).mockResolvedValue(55123);
229
- vi.mocked(discoverDatabase).mockReturnValue("/path/to/db");
230
- vi.mocked(ProfileService).mockImplementation(function () {
231
- return {
232
- visitAndExtract: vi
233
- .fn()
234
- .mockRejectedValue(new Error("extraction failed")),
235
- };
236
- });
237
- await handleVisitAndExtract(PROFILE_URL, {});
238
- expect(process.exitCode).toBe(1);
239
- expect(stderrSpy).toHaveBeenCalledWith("extraction failed\n");
240
- });
241
- it("disconnects launcher after account lookup", async () => {
242
- vi.spyOn(process.stdout, "write").mockReturnValue(true);
243
- const { disconnect: launcherDisconnect } = mockLauncher();
244
- mockInstance();
245
- mockDb();
246
- mockProfileService();
247
- vi.mocked(discoverInstancePort).mockResolvedValue(55123);
248
- vi.mocked(discoverDatabase).mockReturnValue("/path/to/db");
249
- await handleVisitAndExtract(PROFILE_URL, {});
250
- expect(launcherDisconnect).toHaveBeenCalledOnce();
251
- });
252
- it("disconnects instance and closes db after success", async () => {
253
- vi.spyOn(process.stdout, "write").mockReturnValue(true);
254
- mockLauncher();
255
- const { disconnect: instanceDisconnect } = mockInstance();
256
- const { close: dbClose } = mockDb();
257
- mockProfileService();
258
- vi.mocked(discoverInstancePort).mockResolvedValue(55123);
259
- vi.mocked(discoverDatabase).mockReturnValue("/path/to/db");
260
- await handleVisitAndExtract(PROFILE_URL, {});
261
- expect(instanceDisconnect).toHaveBeenCalledOnce();
262
- expect(dbClose).toHaveBeenCalledOnce();
263
- });
264
- it("passes cdpPort option to launcher and discovery", async () => {
265
- vi.spyOn(process.stdout, "write").mockReturnValue(true);
266
- setupSuccessPath();
267
- await handleVisitAndExtract(PROFILE_URL, { cdpPort: 4567 });
268
- expect(LauncherService).toHaveBeenCalledWith(4567);
269
- expect(discoverInstancePort).toHaveBeenCalledWith(4567);
270
- });
271
- it("uses default cdpPort 9222 when not specified", async () => {
272
- vi.spyOn(process.stdout, "write").mockReturnValue(true);
273
- setupSuccessPath();
274
- await handleVisitAndExtract(PROFILE_URL, {});
275
- expect(LauncherService).toHaveBeenCalledWith(9222);
276
- expect(discoverInstancePort).toHaveBeenCalledWith(9222);
277
- });
278
- });
279
- //# sourceMappingURL=visit-and-extract.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visit-and-extract.test.js","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.test.ts"],"names":[],"mappings":"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"}