@lhremote/cli 0.0.0 → 0.1.0

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 (72) hide show
  1. package/LICENSE +661 -0
  2. package/dist/cli.js +2 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/handlers/check-status.d.ts +5 -0
  5. package/dist/handlers/check-status.d.ts.map +1 -0
  6. package/dist/handlers/check-status.js +44 -0
  7. package/dist/handlers/check-status.js.map +1 -0
  8. package/dist/handlers/check-status.test.d.ts +2 -0
  9. package/dist/handlers/check-status.test.d.ts.map +1 -0
  10. package/dist/handlers/check-status.test.js +110 -0
  11. package/dist/handlers/check-status.test.js.map +1 -0
  12. package/dist/handlers/index.d.ts +8 -0
  13. package/dist/handlers/index.d.ts.map +1 -0
  14. package/dist/handlers/index.js +8 -0
  15. package/dist/handlers/index.js.map +1 -0
  16. package/dist/handlers/launch-app.d.ts +4 -0
  17. package/dist/handlers/launch-app.d.ts.map +1 -0
  18. package/dist/handlers/launch-app.js +15 -0
  19. package/dist/handlers/launch-app.js.map +1 -0
  20. package/dist/handlers/launch-app.test.d.ts +2 -0
  21. package/dist/handlers/launch-app.test.d.ts.map +1 -0
  22. package/dist/handlers/launch-app.test.js +62 -0
  23. package/dist/handlers/launch-app.test.js.map +1 -0
  24. package/dist/handlers/list-accounts.d.ts +5 -0
  25. package/dist/handlers/list-accounts.d.ts.map +1 -0
  26. package/dist/handlers/list-accounts.js +37 -0
  27. package/dist/handlers/list-accounts.js.map +1 -0
  28. package/dist/handlers/list-accounts.test.d.ts +2 -0
  29. package/dist/handlers/list-accounts.test.d.ts.map +1 -0
  30. package/dist/handlers/list-accounts.test.js +96 -0
  31. package/dist/handlers/list-accounts.test.js.map +1 -0
  32. package/dist/handlers/quit-app.d.ts +4 -0
  33. package/dist/handlers/quit-app.d.ts.map +1 -0
  34. package/dist/handlers/quit-app.js +15 -0
  35. package/dist/handlers/quit-app.js.map +1 -0
  36. package/dist/handlers/quit-app.test.d.ts +2 -0
  37. package/dist/handlers/quit-app.test.d.ts.map +1 -0
  38. package/dist/handlers/quit-app.test.js +68 -0
  39. package/dist/handlers/quit-app.test.js.map +1 -0
  40. package/dist/handlers/start-instance.d.ts +4 -0
  41. package/dist/handlers/start-instance.d.ts.map +1 -0
  42. package/dist/handlers/start-instance.js +36 -0
  43. package/dist/handlers/start-instance.js.map +1 -0
  44. package/dist/handlers/start-instance.test.d.ts +2 -0
  45. package/dist/handlers/start-instance.test.d.ts.map +1 -0
  46. package/dist/handlers/start-instance.test.js +122 -0
  47. package/dist/handlers/start-instance.test.js.map +1 -0
  48. package/dist/handlers/stop-instance.d.ts +4 -0
  49. package/dist/handlers/stop-instance.d.ts.map +1 -0
  50. package/dist/handlers/stop-instance.js +28 -0
  51. package/dist/handlers/stop-instance.js.map +1 -0
  52. package/dist/handlers/stop-instance.test.d.ts +2 -0
  53. package/dist/handlers/stop-instance.test.d.ts.map +1 -0
  54. package/dist/handlers/stop-instance.test.js +82 -0
  55. package/dist/handlers/stop-instance.test.js.map +1 -0
  56. package/dist/handlers/visit-and-extract.d.ts +5 -0
  57. package/dist/handlers/visit-and-extract.d.ts.map +1 -0
  58. package/dist/handlers/visit-and-extract.js +105 -0
  59. package/dist/handlers/visit-and-extract.js.map +1 -0
  60. package/dist/handlers/visit-and-extract.test.d.ts +2 -0
  61. package/dist/handlers/visit-and-extract.test.d.ts.map +1 -0
  62. package/dist/handlers/visit-and-extract.test.js +279 -0
  63. package/dist/handlers/visit-and-extract.test.js.map +1 -0
  64. package/dist/program.d.ts +6 -0
  65. package/dist/program.d.ts.map +1 -0
  66. package/dist/program.js +65 -0
  67. package/dist/program.js.map +1 -0
  68. package/dist/program.test.d.ts +2 -0
  69. package/dist/program.test.d.ts.map +1 -0
  70. package/dist/program.test.js +92 -0
  71. package/dist/program.test.js.map +1 -0
  72. package/package.json +22 -12
@@ -0,0 +1,279 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visit-and-extract.test.js","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Create the CLI program with all subcommands registered.
4
+ */
5
+ export declare function createProgram(): Command;
6
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAwB1D;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAuDvC"}
@@ -0,0 +1,65 @@
1
+ import { createRequire } from "node:module";
2
+ import { Command, InvalidArgumentError } from "commander";
3
+ import { handleCheckStatus, handleLaunchApp, handleListAccounts, handleQuitApp, handleStartInstance, handleStopInstance, handleVisitAndExtract, } from "./handlers/index.js";
4
+ const require = createRequire(import.meta.url);
5
+ const { version } = require("../package.json");
6
+ /** Parse a string as a positive integer, throwing on invalid input. */
7
+ function parsePositiveInt(value) {
8
+ const n = Number(value);
9
+ if (!Number.isInteger(n) || n <= 0) {
10
+ throw new InvalidArgumentError(`Expected a positive integer, got "${value}".`);
11
+ }
12
+ return n;
13
+ }
14
+ /**
15
+ * Create the CLI program with all subcommands registered.
16
+ */
17
+ export function createProgram() {
18
+ const program = new Command()
19
+ .name("lhremote")
20
+ .description("CLI for LinkedHelper automation")
21
+ .version(version);
22
+ program
23
+ .command("launch-app")
24
+ .description("Launch the LinkedHelper application")
25
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
26
+ .action(handleLaunchApp);
27
+ program
28
+ .command("quit-app")
29
+ .description("Quit the LinkedHelper application")
30
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
31
+ .action(handleQuitApp);
32
+ program
33
+ .command("list-accounts")
34
+ .description("List LinkedHelper accounts")
35
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
36
+ .option("--json", "Output as JSON")
37
+ .action(handleListAccounts);
38
+ program
39
+ .command("start-instance")
40
+ .description("Start a LinkedHelper instance")
41
+ .argument("<accountId>", "Account ID to start", parsePositiveInt)
42
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
43
+ .action(handleStartInstance);
44
+ program
45
+ .command("stop-instance")
46
+ .description("Stop a LinkedHelper instance")
47
+ .argument("<accountId>", "Account ID to stop", parsePositiveInt)
48
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
49
+ .action(handleStopInstance);
50
+ program
51
+ .command("visit-and-extract")
52
+ .description("Visit a LinkedIn profile and extract data")
53
+ .argument("<profileUrl>", "LinkedIn profile URL")
54
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
55
+ .option("--json", "Output as JSON")
56
+ .action(handleVisitAndExtract);
57
+ program
58
+ .command("check-status")
59
+ .description("Check LinkedHelper status")
60
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
61
+ .option("--json", "Output as JSON")
62
+ .action(handleCheckStatus);
63
+ return program;
64
+ }
65
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=program.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.test.d.ts","sourceRoot":"","sources":["../src/program.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { createRequire } from "node:module";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { createProgram } from "./program.js";
4
+ const require = createRequire(import.meta.url);
5
+ const { version } = require("../package.json");
6
+ describe("createProgram", () => {
7
+ const originalExitCode = process.exitCode;
8
+ beforeEach(() => {
9
+ process.exitCode = undefined;
10
+ });
11
+ afterEach(() => {
12
+ process.exitCode = originalExitCode;
13
+ vi.restoreAllMocks();
14
+ });
15
+ it("creates a program named lhremote", () => {
16
+ const program = createProgram();
17
+ expect(program.name()).toBe("lhremote");
18
+ });
19
+ it("reads version from package.json", () => {
20
+ const program = createProgram();
21
+ expect(program.version()).toBe(version);
22
+ });
23
+ it("registers all expected subcommands", () => {
24
+ const program = createProgram();
25
+ const commandNames = program.commands.map((c) => c.name());
26
+ expect(commandNames).toContain("launch-app");
27
+ expect(commandNames).toContain("quit-app");
28
+ expect(commandNames).toContain("list-accounts");
29
+ expect(commandNames).toContain("start-instance");
30
+ expect(commandNames).toContain("stop-instance");
31
+ expect(commandNames).toContain("visit-and-extract");
32
+ expect(commandNames).toContain("check-status");
33
+ expect(commandNames).toHaveLength(7);
34
+ });
35
+ describe("launch-app", () => {
36
+ it("accepts --cdp-port option", () => {
37
+ const program = createProgram();
38
+ const cmd = program.commands.find((c) => c.name() === "launch-app");
39
+ const portOption = cmd?.options.find((o) => o.long === "--cdp-port");
40
+ expect(portOption).toBeDefined();
41
+ });
42
+ });
43
+ describe("list-accounts", () => {
44
+ it("accepts --json option", () => {
45
+ const program = createProgram();
46
+ const cmd = program.commands.find((c) => c.name() === "list-accounts");
47
+ const jsonOption = cmd?.options.find((o) => o.long === "--json");
48
+ expect(jsonOption).toBeDefined();
49
+ });
50
+ });
51
+ describe("start-instance", () => {
52
+ it("requires accountId argument", () => {
53
+ const program = createProgram();
54
+ const cmd = program.commands.find((c) => c.name() === "start-instance");
55
+ const args = cmd?.registeredArguments;
56
+ expect(args).toHaveLength(1);
57
+ expect(args?.[0]?.required).toBe(true);
58
+ });
59
+ it("rejects non-numeric accountId", async () => {
60
+ vi.spyOn(process.stderr, "write").mockReturnValue(true);
61
+ const program = createProgram();
62
+ program.exitOverride().configureOutput({ writeErr: () => { } });
63
+ await expect(program.parseAsync(["node", "lhremote", "start-instance", "abc"])).rejects.toThrow();
64
+ });
65
+ });
66
+ describe("visit-and-extract", () => {
67
+ it("requires profileUrl argument and accepts --json", () => {
68
+ const program = createProgram();
69
+ const cmd = program.commands.find((c) => c.name() === "visit-and-extract");
70
+ const args = cmd?.registeredArguments;
71
+ const jsonOption = cmd?.options.find((o) => o.long === "--json");
72
+ expect(args).toHaveLength(1);
73
+ expect(args?.[0]?.required).toBe(true);
74
+ expect(jsonOption).toBeDefined();
75
+ });
76
+ });
77
+ describe("check-status", () => {
78
+ it("accepts --json option", () => {
79
+ const program = createProgram();
80
+ const cmd = program.commands.find((c) => c.name() === "check-status");
81
+ const jsonOption = cmd?.options.find((o) => o.long === "--json");
82
+ expect(jsonOption).toBeDefined();
83
+ });
84
+ it("accepts --cdp-port option", () => {
85
+ const program = createProgram();
86
+ const cmd = program.commands.find((c) => c.name() === "check-status");
87
+ const portOption = cmd?.options.find((o) => o.long === "--cdp-port");
88
+ expect(portOption).toBeDefined();
89
+ });
90
+ });
91
+ });
92
+ //# sourceMappingURL=program.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.test.js","sourceRoot":"","sources":["../src/program.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lhremote/cli",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
4
  "description": "CLI for LinkedHelper automation",
5
5
  "type": "module",
6
6
  "engines": {
@@ -15,23 +15,33 @@
15
15
  "url": "https://github.com/alexey-pelykh/lhremote.git",
16
16
  "directory": "packages/cli"
17
17
  },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/program.d.ts",
21
+ "import": "./dist/program.js"
22
+ }
23
+ },
18
24
  "bin": {
19
- "lhremote": "./dist/cli.js"
25
+ "lhremote-cli": "./dist/cli.js"
20
26
  },
21
27
  "files": [
22
28
  "dist"
23
29
  ],
24
- "scripts": {
25
- "build": "tsc",
26
- "test": "echo 'No tests configured'",
27
- "lint": "echo 'No linter configured'",
28
- "dev": "tsc --watch"
29
- },
30
30
  "dependencies": {
31
- "@lhremote/core": "workspace:^"
31
+ "commander": "^14.0.3",
32
+ "@lhremote/core": "^0.1.0"
32
33
  },
33
34
  "devDependencies": {
34
- "@types/node": "catalog:",
35
- "typescript": "catalog:"
35
+ "@types/node": "^22",
36
+ "eslint": "^9.39.2",
37
+ "typescript": "^5.7.3",
38
+ "vitest": "^4.0.18"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc",
42
+ "test": "vitest run",
43
+ "test:e2e": "vitest run --config ../../vitest.e2e.config.ts",
44
+ "lint": "eslint src/",
45
+ "dev": "tsc --watch"
36
46
  }
37
- }
47
+ }