@curviate/cli 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.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/account-YOW2MCZS.js +639 -0
- package/dist/chunk-2NCPJJPC.js +140 -0
- package/dist/chunk-6JNCLLNY.js +195 -0
- package/dist/chunk-BNUTM6KD.js +33 -0
- package/dist/chunk-Q43HZUN3.js +29 -0
- package/dist/chunk-R3VLWLVV.js +23 -0
- package/dist/chunk-SND3NHCT.js +46 -0
- package/dist/chunk-UWO2D4HW.js +34 -0
- package/dist/cli.js +159 -0
- package/dist/company-IKVDW7MX.js +82 -0
- package/dist/config-4JOXBFYX.js +262 -0
- package/dist/connect-HLDHFBGX.js +348 -0
- package/dist/exit-codes-NFIR57ZA.js +57 -0
- package/dist/inbox-JBLYJMV2.js +294 -0
- package/dist/login-VWJEBBFU.js +122 -0
- package/dist/message-IK7VGB63.js +566 -0
- package/dist/post-EAAGVR5D.js +496 -0
- package/dist/profile-WXA3NC7D.js +352 -0
- package/dist/recruiter-TGCV36EH.js +984 -0
- package/dist/sales-nav-XGFO5I6F.js +488 -0
- package/dist/search-LHPTHPWH.js +354 -0
- package/dist/webhook-QM5LGAUF.js +445 -0
- package/package.json +54 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
streamAll
|
|
4
|
+
} from "./chunk-SND3NHCT.js";
|
|
5
|
+
import {
|
|
6
|
+
createClient,
|
|
7
|
+
renderError,
|
|
8
|
+
renderSuccess,
|
|
9
|
+
renderUnexpectedError,
|
|
10
|
+
resolveEffectiveConfig
|
|
11
|
+
} from "./chunk-2NCPJJPC.js";
|
|
12
|
+
import {
|
|
13
|
+
GLOBAL_FLAGS
|
|
14
|
+
} from "./chunk-6JNCLLNY.js";
|
|
15
|
+
|
|
16
|
+
// src/commands/search.ts
|
|
17
|
+
import { defineCommand } from "citty";
|
|
18
|
+
function buildOutputStreams() {
|
|
19
|
+
return {
|
|
20
|
+
stdout: { write: (s) => process.stdout.write(s) },
|
|
21
|
+
stderr: { write: (s) => process.stderr.write(s) }
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function requireAccount(account, out) {
|
|
25
|
+
if (!account) {
|
|
26
|
+
out.stderr.write("error: --account is required for this command. Set it via --account, CURVIATE_ACCOUNT, or `curviate config set-account`.\n");
|
|
27
|
+
process.exit(2);
|
|
28
|
+
}
|
|
29
|
+
return account;
|
|
30
|
+
}
|
|
31
|
+
function rejectPreviewOnRead(preview, out) {
|
|
32
|
+
if (preview) {
|
|
33
|
+
out.stderr.write("error: --preview is only valid on write commands (mutations). Reads just run.\n");
|
|
34
|
+
process.exit(2);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function rejectAllOnNonPaginated(all, out) {
|
|
38
|
+
if (all) {
|
|
39
|
+
out.stderr.write("error: --all is not supported on non-paginated commands.\n");
|
|
40
|
+
process.exit(2);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function resolveOutputOpts(flags) {
|
|
44
|
+
return {
|
|
45
|
+
json: (flags.json ?? false) || !process.stdout.isTTY,
|
|
46
|
+
isTTY: process.stdout.isTTY ?? false,
|
|
47
|
+
fields: flags.fields
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function buildSearchBody(flags) {
|
|
51
|
+
const body = {};
|
|
52
|
+
if (flags.keywords) body["keywords"] = flags.keywords;
|
|
53
|
+
if (flags.url) body["url"] = flags.url;
|
|
54
|
+
if (flags.cursor) body["cursor"] = flags.cursor;
|
|
55
|
+
if (flags.limit) body["limit"] = parseInt(flags.limit, 10);
|
|
56
|
+
return body;
|
|
57
|
+
}
|
|
58
|
+
async function runSearchPeople(client, flags, out) {
|
|
59
|
+
rejectPreviewOnRead(flags.preview, out);
|
|
60
|
+
const accountId = requireAccount(flags.account, out);
|
|
61
|
+
const ns = client.account(accountId);
|
|
62
|
+
const outOpts = resolveOutputOpts(flags);
|
|
63
|
+
const all = flags.all ?? false;
|
|
64
|
+
const maxPages = flags["max-pages"] ? parseInt(flags["max-pages"], 10) : 100;
|
|
65
|
+
const body = buildSearchBody(flags);
|
|
66
|
+
try {
|
|
67
|
+
if (all) {
|
|
68
|
+
const fn = (p) => ns.search.people(p);
|
|
69
|
+
for await (const item of streamAll(fn, body, {
|
|
70
|
+
maxPages,
|
|
71
|
+
onTruncated: (msg) => out.stderr.write(msg + "\n")
|
|
72
|
+
})) {
|
|
73
|
+
out.stdout.write(JSON.stringify(item) + "\n");
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
const result = await ns.search.people(body);
|
|
77
|
+
renderSuccess(result, outOpts, out);
|
|
78
|
+
}
|
|
79
|
+
} catch (err) {
|
|
80
|
+
const { CurviateError } = await import("@curviate/sdk");
|
|
81
|
+
if (err instanceof CurviateError) {
|
|
82
|
+
const { getExitCode } = await import("./exit-codes-NFIR57ZA.js");
|
|
83
|
+
renderError(err, outOpts, out);
|
|
84
|
+
process.exit(getExitCode(err.code));
|
|
85
|
+
}
|
|
86
|
+
renderUnexpectedError(err, out);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function runSearchCompanies(client, flags, out) {
|
|
91
|
+
rejectPreviewOnRead(flags.preview, out);
|
|
92
|
+
const accountId = requireAccount(flags.account, out);
|
|
93
|
+
const ns = client.account(accountId);
|
|
94
|
+
const outOpts = resolveOutputOpts(flags);
|
|
95
|
+
const all = flags.all ?? false;
|
|
96
|
+
const maxPages = flags["max-pages"] ? parseInt(flags["max-pages"], 10) : 100;
|
|
97
|
+
const body = buildSearchBody(flags);
|
|
98
|
+
try {
|
|
99
|
+
if (all) {
|
|
100
|
+
const fn = (p) => ns.search.companies(p);
|
|
101
|
+
for await (const item of streamAll(fn, body, {
|
|
102
|
+
maxPages,
|
|
103
|
+
onTruncated: (msg) => out.stderr.write(msg + "\n")
|
|
104
|
+
})) {
|
|
105
|
+
out.stdout.write(JSON.stringify(item) + "\n");
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
const result = await ns.search.companies(body);
|
|
109
|
+
renderSuccess(result, outOpts, out);
|
|
110
|
+
}
|
|
111
|
+
} catch (err) {
|
|
112
|
+
const { CurviateError } = await import("@curviate/sdk");
|
|
113
|
+
if (err instanceof CurviateError) {
|
|
114
|
+
const { getExitCode } = await import("./exit-codes-NFIR57ZA.js");
|
|
115
|
+
renderError(err, outOpts, out);
|
|
116
|
+
process.exit(getExitCode(err.code));
|
|
117
|
+
}
|
|
118
|
+
renderUnexpectedError(err, out);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function runSearchPosts(client, flags, out) {
|
|
123
|
+
rejectPreviewOnRead(flags.preview, out);
|
|
124
|
+
const accountId = requireAccount(flags.account, out);
|
|
125
|
+
const ns = client.account(accountId);
|
|
126
|
+
const outOpts = resolveOutputOpts(flags);
|
|
127
|
+
const all = flags.all ?? false;
|
|
128
|
+
const maxPages = flags["max-pages"] ? parseInt(flags["max-pages"], 10) : 100;
|
|
129
|
+
const body = buildSearchBody(flags);
|
|
130
|
+
try {
|
|
131
|
+
if (all) {
|
|
132
|
+
const fn = (p) => ns.search.posts(p);
|
|
133
|
+
for await (const item of streamAll(fn, body, {
|
|
134
|
+
maxPages,
|
|
135
|
+
onTruncated: (msg) => out.stderr.write(msg + "\n")
|
|
136
|
+
})) {
|
|
137
|
+
out.stdout.write(JSON.stringify(item) + "\n");
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
const result = await ns.search.posts(body);
|
|
141
|
+
renderSuccess(result, outOpts, out);
|
|
142
|
+
}
|
|
143
|
+
} catch (err) {
|
|
144
|
+
const { CurviateError } = await import("@curviate/sdk");
|
|
145
|
+
if (err instanceof CurviateError) {
|
|
146
|
+
const { getExitCode } = await import("./exit-codes-NFIR57ZA.js");
|
|
147
|
+
renderError(err, outOpts, out);
|
|
148
|
+
process.exit(getExitCode(err.code));
|
|
149
|
+
}
|
|
150
|
+
renderUnexpectedError(err, out);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function runSearchJobs(client, flags, out) {
|
|
155
|
+
rejectPreviewOnRead(flags.preview, out);
|
|
156
|
+
const accountId = requireAccount(flags.account, out);
|
|
157
|
+
const ns = client.account(accountId);
|
|
158
|
+
const outOpts = resolveOutputOpts(flags);
|
|
159
|
+
const all = flags.all ?? false;
|
|
160
|
+
const maxPages = flags["max-pages"] ? parseInt(flags["max-pages"], 10) : 100;
|
|
161
|
+
const body = buildSearchBody(flags);
|
|
162
|
+
try {
|
|
163
|
+
if (all) {
|
|
164
|
+
const fn = (p) => ns.search.jobs(p);
|
|
165
|
+
for await (const item of streamAll(fn, body, {
|
|
166
|
+
maxPages,
|
|
167
|
+
onTruncated: (msg) => out.stderr.write(msg + "\n")
|
|
168
|
+
})) {
|
|
169
|
+
out.stdout.write(JSON.stringify(item) + "\n");
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
const result = await ns.search.jobs(body);
|
|
173
|
+
renderSuccess(result, outOpts, out);
|
|
174
|
+
}
|
|
175
|
+
} catch (err) {
|
|
176
|
+
const { CurviateError } = await import("@curviate/sdk");
|
|
177
|
+
if (err instanceof CurviateError) {
|
|
178
|
+
const { getExitCode } = await import("./exit-codes-NFIR57ZA.js");
|
|
179
|
+
renderError(err, outOpts, out);
|
|
180
|
+
process.exit(getExitCode(err.code));
|
|
181
|
+
}
|
|
182
|
+
renderUnexpectedError(err, out);
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async function runSearchParameters(client, flags, out) {
|
|
187
|
+
rejectPreviewOnRead(flags.preview, out);
|
|
188
|
+
rejectAllOnNonPaginated(flags.all, out);
|
|
189
|
+
const accountId = requireAccount(flags.account, out);
|
|
190
|
+
const ns = client.account(accountId);
|
|
191
|
+
const outOpts = resolveOutputOpts(flags);
|
|
192
|
+
const query = {};
|
|
193
|
+
if (flags.type) query["type"] = flags.type;
|
|
194
|
+
if (flags.keywords) query["keywords"] = flags.keywords;
|
|
195
|
+
if (flags.limit) query["limit"] = parseInt(flags.limit, 10);
|
|
196
|
+
try {
|
|
197
|
+
const result = await ns.search.getParameters(query);
|
|
198
|
+
renderSuccess(result, outOpts, out);
|
|
199
|
+
} catch (err) {
|
|
200
|
+
const { CurviateError } = await import("@curviate/sdk");
|
|
201
|
+
if (err instanceof CurviateError) {
|
|
202
|
+
const { getExitCode } = await import("./exit-codes-NFIR57ZA.js");
|
|
203
|
+
renderError(err, outOpts, out);
|
|
204
|
+
process.exit(getExitCode(err.code));
|
|
205
|
+
}
|
|
206
|
+
renderUnexpectedError(err, out);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
var searchPeopleCommand = defineCommand({
|
|
211
|
+
meta: { name: "people", description: "Search LinkedIn members with structured filters." },
|
|
212
|
+
args: {
|
|
213
|
+
...GLOBAL_FLAGS,
|
|
214
|
+
keywords: { type: "string", description: "Full-text keyword search." },
|
|
215
|
+
url: { type: "string", description: "Pasted LinkedIn search URL (mutually exclusive with filters)." }
|
|
216
|
+
},
|
|
217
|
+
async run({ args }) {
|
|
218
|
+
const flags = args;
|
|
219
|
+
const cfg = await resolveEffectiveConfig({
|
|
220
|
+
apiKey: flags["api-key"],
|
|
221
|
+
baseUrl: flags["base-url"],
|
|
222
|
+
timeout: flags.timeout,
|
|
223
|
+
account: flags.account,
|
|
224
|
+
profile: flags.profile
|
|
225
|
+
});
|
|
226
|
+
if (!cfg.apiKey) {
|
|
227
|
+
process.stderr.write("error: no API key \u2014 run `curviate login` or pass --api-key.\n");
|
|
228
|
+
process.exit(3);
|
|
229
|
+
}
|
|
230
|
+
const client = createClient({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl, timeout: cfg.timeout });
|
|
231
|
+
const out = buildOutputStreams();
|
|
232
|
+
await runSearchPeople(client, { ...flags, account: flags.account ?? cfg.account }, out);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
var searchCompaniesCommand = defineCommand({
|
|
236
|
+
meta: { name: "companies", description: "Search LinkedIn companies." },
|
|
237
|
+
args: {
|
|
238
|
+
...GLOBAL_FLAGS,
|
|
239
|
+
keywords: { type: "string", description: "Full-text keyword search." }
|
|
240
|
+
},
|
|
241
|
+
async run({ args }) {
|
|
242
|
+
const flags = args;
|
|
243
|
+
const cfg = await resolveEffectiveConfig({
|
|
244
|
+
apiKey: flags["api-key"],
|
|
245
|
+
baseUrl: flags["base-url"],
|
|
246
|
+
timeout: flags.timeout,
|
|
247
|
+
account: flags.account,
|
|
248
|
+
profile: flags.profile
|
|
249
|
+
});
|
|
250
|
+
if (!cfg.apiKey) {
|
|
251
|
+
process.stderr.write("error: no API key \u2014 run `curviate login` or pass --api-key.\n");
|
|
252
|
+
process.exit(3);
|
|
253
|
+
}
|
|
254
|
+
const client = createClient({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl, timeout: cfg.timeout });
|
|
255
|
+
const out = buildOutputStreams();
|
|
256
|
+
await runSearchCompanies(client, { ...flags, account: flags.account ?? cfg.account }, out);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
var searchPostsCommand = defineCommand({
|
|
260
|
+
meta: { name: "posts", description: "Search LinkedIn posts." },
|
|
261
|
+
args: {
|
|
262
|
+
...GLOBAL_FLAGS,
|
|
263
|
+
keywords: { type: "string", description: "Full-text keyword search." }
|
|
264
|
+
},
|
|
265
|
+
async run({ args }) {
|
|
266
|
+
const flags = args;
|
|
267
|
+
const cfg = await resolveEffectiveConfig({
|
|
268
|
+
apiKey: flags["api-key"],
|
|
269
|
+
baseUrl: flags["base-url"],
|
|
270
|
+
timeout: flags.timeout,
|
|
271
|
+
account: flags.account,
|
|
272
|
+
profile: flags.profile
|
|
273
|
+
});
|
|
274
|
+
if (!cfg.apiKey) {
|
|
275
|
+
process.stderr.write("error: no API key \u2014 run `curviate login` or pass --api-key.\n");
|
|
276
|
+
process.exit(3);
|
|
277
|
+
}
|
|
278
|
+
const client = createClient({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl, timeout: cfg.timeout });
|
|
279
|
+
const out = buildOutputStreams();
|
|
280
|
+
await runSearchPosts(client, { ...flags, account: flags.account ?? cfg.account }, out);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
var searchJobsCommand = defineCommand({
|
|
284
|
+
meta: { name: "jobs", description: "Search LinkedIn jobs." },
|
|
285
|
+
args: {
|
|
286
|
+
...GLOBAL_FLAGS,
|
|
287
|
+
keywords: { type: "string", description: "Full-text keyword search." }
|
|
288
|
+
},
|
|
289
|
+
async run({ args }) {
|
|
290
|
+
const flags = args;
|
|
291
|
+
const cfg = await resolveEffectiveConfig({
|
|
292
|
+
apiKey: flags["api-key"],
|
|
293
|
+
baseUrl: flags["base-url"],
|
|
294
|
+
timeout: flags.timeout,
|
|
295
|
+
account: flags.account,
|
|
296
|
+
profile: flags.profile
|
|
297
|
+
});
|
|
298
|
+
if (!cfg.apiKey) {
|
|
299
|
+
process.stderr.write("error: no API key \u2014 run `curviate login` or pass --api-key.\n");
|
|
300
|
+
process.exit(3);
|
|
301
|
+
}
|
|
302
|
+
const client = createClient({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl, timeout: cfg.timeout });
|
|
303
|
+
const out = buildOutputStreams();
|
|
304
|
+
await runSearchJobs(client, { ...flags, account: flags.account ?? cfg.account }, out);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
var searchParametersCommand = defineCommand({
|
|
308
|
+
meta: { name: "parameters", description: "Resolve human-readable terms to opaque filter IDs." },
|
|
309
|
+
args: {
|
|
310
|
+
...GLOBAL_FLAGS,
|
|
311
|
+
type: { type: "string", description: "Parameter type (e.g. LOCATION, COMPANY, INDUSTRY).", required: true },
|
|
312
|
+
keywords: { type: "string", description: "Human term to resolve (not required for EMPLOYMENT_TYPE)." }
|
|
313
|
+
},
|
|
314
|
+
async run({ args }) {
|
|
315
|
+
const flags = args;
|
|
316
|
+
const cfg = await resolveEffectiveConfig({
|
|
317
|
+
apiKey: flags["api-key"],
|
|
318
|
+
baseUrl: flags["base-url"],
|
|
319
|
+
timeout: flags.timeout,
|
|
320
|
+
account: flags.account,
|
|
321
|
+
profile: flags.profile
|
|
322
|
+
});
|
|
323
|
+
if (!cfg.apiKey) {
|
|
324
|
+
process.stderr.write("error: no API key \u2014 run `curviate login` or pass --api-key.\n");
|
|
325
|
+
process.exit(3);
|
|
326
|
+
}
|
|
327
|
+
const client = createClient({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl, timeout: cfg.timeout });
|
|
328
|
+
const out = buildOutputStreams();
|
|
329
|
+
await runSearchParameters(client, { ...flags, account: flags.account ?? cfg.account }, out);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
var searchCommand = defineCommand({
|
|
333
|
+
meta: { name: "search", description: "Search LinkedIn members, companies, posts, and jobs." },
|
|
334
|
+
subCommands: {
|
|
335
|
+
people: searchPeopleCommand,
|
|
336
|
+
companies: searchCompaniesCommand,
|
|
337
|
+
posts: searchPostsCommand,
|
|
338
|
+
jobs: searchJobsCommand,
|
|
339
|
+
parameters: searchParametersCommand
|
|
340
|
+
},
|
|
341
|
+
async run() {
|
|
342
|
+
process.stderr.write(
|
|
343
|
+
"Usage: curviate search <subcommand>\n people [--url <u>] [--keywords <k>]\n companies [--keywords <k>]\n posts [--keywords <k>]\n jobs [--keywords <k>]\n parameters --type <t> [--keywords <k>]\n"
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
export {
|
|
348
|
+
runSearchCompanies,
|
|
349
|
+
runSearchJobs,
|
|
350
|
+
runSearchParameters,
|
|
351
|
+
runSearchPeople,
|
|
352
|
+
runSearchPosts,
|
|
353
|
+
searchCommand
|
|
354
|
+
};
|