@invinite-org/invinite-data-cli 2.0.0 → 4.0.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 (129) hide show
  1. package/README.md +341 -374
  2. package/claude-plugin/.claude-plugin/plugin.json +1 -1
  3. package/claude-plugin/agents/invinite-data.md +59 -28
  4. package/claude-plugin/commands/analyze-earnings-call.md +15 -14
  5. package/claude-plugin/commands/analyze-filing.md +8 -7
  6. package/claude-plugin/commands/compare-companies.md +5 -5
  7. package/claude-plugin/commands/financial-research.md +9 -9
  8. package/claude-plugin/commands/ownership-review.md +6 -6
  9. package/claude-plugin/skills/invinite-data-cli/SKILL.md +466 -570
  10. package/dist/bin/invd.js +11 -2
  11. package/dist/bin/invd.js.map +1 -1
  12. package/dist/src/cli.d.ts +2 -0
  13. package/dist/src/cli.js +48 -29
  14. package/dist/src/cli.js.map +1 -1
  15. package/dist/src/client/api-client.d.ts +24 -24
  16. package/dist/src/client/api-client.js +52 -70
  17. package/dist/src/client/api-client.js.map +1 -1
  18. package/dist/src/client/pagination.d.ts +12 -11
  19. package/dist/src/client/pagination.js +47 -56
  20. package/dist/src/client/pagination.js.map +1 -1
  21. package/dist/src/commands/agent-setup.d.ts +21 -0
  22. package/dist/src/commands/agent-setup.js +112 -0
  23. package/dist/src/commands/agent-setup.js.map +1 -0
  24. package/dist/src/commands/api.d.ts +27 -0
  25. package/dist/src/commands/api.js +180 -0
  26. package/dist/src/commands/api.js.map +1 -0
  27. package/dist/src/commands/auth.d.ts +37 -0
  28. package/dist/src/commands/auth.js +336 -0
  29. package/dist/src/commands/auth.js.map +1 -0
  30. package/dist/src/commands/completion.d.ts +7 -0
  31. package/dist/src/commands/completion.js +115 -0
  32. package/dist/src/commands/completion.js.map +1 -0
  33. package/dist/src/commands/config.d.ts +4 -0
  34. package/dist/src/commands/config.js +85 -48
  35. package/dist/src/commands/config.js.map +1 -1
  36. package/dist/src/commands/plugin.d.ts +8 -0
  37. package/dist/src/commands/plugin.js +8 -10
  38. package/dist/src/commands/plugin.js.map +1 -1
  39. package/dist/src/config/auth.d.ts +17 -1
  40. package/dist/src/config/auth.js +50 -36
  41. package/dist/src/config/auth.js.map +1 -1
  42. package/dist/src/config/config-manager.d.ts +56 -4
  43. package/dist/src/config/config-manager.js +173 -29
  44. package/dist/src/config/config-manager.js.map +1 -1
  45. package/dist/src/config/toml.d.ts +7 -0
  46. package/dist/src/config/toml.js +79 -0
  47. package/dist/src/config/toml.js.map +1 -0
  48. package/dist/src/examples.d.ts +22 -0
  49. package/dist/src/examples.js +56 -0
  50. package/dist/src/examples.js.map +1 -0
  51. package/dist/src/generated/cli-manifest.json +5583 -4916
  52. package/dist/src/hand-written-commands.d.ts +11 -41
  53. package/dist/src/hand-written-commands.js +7 -17
  54. package/dist/src/hand-written-commands.js.map +1 -1
  55. package/dist/src/output/jq.d.ts +15 -0
  56. package/dist/src/output/jq.js +234 -0
  57. package/dist/src/output/jq.js.map +1 -0
  58. package/dist/src/output/options.d.ts +29 -0
  59. package/dist/src/output/options.js +72 -0
  60. package/dist/src/output/options.js.map +1 -0
  61. package/dist/src/output/render.d.ts +54 -0
  62. package/dist/src/output/render.js +160 -0
  63. package/dist/src/output/render.js.map +1 -0
  64. package/dist/src/shared/errors.d.ts +59 -15
  65. package/dist/src/shared/errors.js +126 -38
  66. package/dist/src/shared/errors.js.map +1 -1
  67. package/dist/src/shared/prompt.d.ts +10 -0
  68. package/dist/src/shared/prompt.js +24 -0
  69. package/dist/src/shared/prompt.js.map +1 -0
  70. package/dist/src/shared/spinner.js +2 -1
  71. package/dist/src/shared/spinner.js.map +1 -1
  72. package/dist/src/spec-commands.d.ts +14 -6
  73. package/dist/src/spec-commands.js +454 -174
  74. package/dist/src/spec-commands.js.map +1 -1
  75. package/dist/src/spec-flags.d.ts +11 -6
  76. package/dist/src/spec-flags.js +14 -7
  77. package/dist/src/spec-flags.js.map +1 -1
  78. package/dist/src/spec-manifest.d.ts +416 -116
  79. package/dist/src/spec-manifest.js +44 -13
  80. package/dist/src/spec-manifest.js.map +1 -1
  81. package/dist/src/update-notifier.d.ts +9 -0
  82. package/dist/src/update-notifier.js +63 -0
  83. package/dist/src/update-notifier.js.map +1 -0
  84. package/package.json +2 -3
  85. package/dist/src/client/earnings-live.d.ts +0 -194
  86. package/dist/src/client/earnings-live.js +0 -300
  87. package/dist/src/client/earnings-live.js.map +0 -1
  88. package/dist/src/client/news-live.d.ts +0 -72
  89. package/dist/src/client/news-live.js +0 -120
  90. package/dist/src/client/news-live.js.map +0 -1
  91. package/dist/src/client/pdf.d.ts +0 -15
  92. package/dist/src/client/pdf.js +0 -15
  93. package/dist/src/client/pdf.js.map +0 -1
  94. package/dist/src/client/websocket-client.d.ts +0 -19
  95. package/dist/src/client/websocket-client.js +0 -174
  96. package/dist/src/client/websocket-client.js.map +0 -1
  97. package/dist/src/commands/earnings.d.ts +0 -16
  98. package/dist/src/commands/earnings.js +0 -464
  99. package/dist/src/commands/earnings.js.map +0 -1
  100. package/dist/src/commands/login.d.ts +0 -15
  101. package/dist/src/commands/login.js +0 -249
  102. package/dist/src/commands/login.js.map +0 -1
  103. package/dist/src/commands/news.d.ts +0 -2
  104. package/dist/src/commands/news.js +0 -69
  105. package/dist/src/commands/news.js.map +0 -1
  106. package/dist/src/commands/sec.d.ts +0 -47
  107. package/dist/src/commands/sec.js +0 -191
  108. package/dist/src/commands/sec.js.map +0 -1
  109. package/dist/src/commands/ws.d.ts +0 -33
  110. package/dist/src/commands/ws.js +0 -116
  111. package/dist/src/commands/ws.js.map +0 -1
  112. package/dist/src/formatters/json-formatter.d.ts +0 -1
  113. package/dist/src/formatters/json-formatter.js +0 -4
  114. package/dist/src/formatters/json-formatter.js.map +0 -1
  115. package/dist/src/formatters/table-formatter.d.ts +0 -4
  116. package/dist/src/formatters/table-formatter.js +0 -73
  117. package/dist/src/formatters/table-formatter.js.map +0 -1
  118. package/dist/src/formatters/time.d.ts +0 -2
  119. package/dist/src/formatters/time.js +0 -14
  120. package/dist/src/formatters/time.js.map +0 -1
  121. package/dist/src/shared/output.d.ts +0 -3
  122. package/dist/src/shared/output.js +0 -13
  123. package/dist/src/shared/output.js.map +0 -1
  124. package/dist/src/shared/readiness.d.ts +0 -4
  125. package/dist/src/shared/readiness.js +0 -60
  126. package/dist/src/shared/readiness.js.map +0 -1
  127. package/dist/src/shared/types.d.ts +0 -11
  128. package/dist/src/shared/types.js +0 -2
  129. package/dist/src/shared/types.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ /** The runtimes `agent-setup` wires both the MCP connector and the skill for. */
3
+ export declare const AGENT_RUNTIMES: readonly ["claude", "codex"];
4
+ export type AgentRuntime = (typeof AGENT_RUNTIMES)[number];
5
+ export interface Connector {
6
+ name: string;
7
+ url: string;
8
+ }
9
+ /** The plugin's one MCP connector (`claude-plugin/.mcp.json`): the name and URL every runtime is given. */
10
+ export declare function bundledConnector(sourceDir?: string): Connector;
11
+ /** Where a runtime reads its MCP servers: Claude Code `./.mcp.json` / `~/.claude.json`, Codex `config.toml`. */
12
+ export declare function mcpConfigPath(runtime: AgentRuntime, scope: 'global' | 'local', cwd?: string, home?: string): string;
13
+ /** The JSON config with the connector set under `mcpServers` (every other key kept as it was). */
14
+ export declare function mergeClaudeMcp(current: string | undefined, connector: Connector): string;
15
+ /** The Codex TOML with a `[mcp_servers.<name>]` table for the connector (an existing table is replaced). */
16
+ export declare function mergeCodexMcp(current: string | undefined, connector: Connector): string;
17
+ /**
18
+ * `invd agent-setup`: one step for an agent — the MCP connector in the runtime's config (Claude Code, Codex) and the
19
+ * skill / agent / commands the plugin installs. The connector signs in with OAuth on first use; no key is written.
20
+ */
21
+ export declare function registerAgentSetupCommand(program: Command): void;
@@ -0,0 +1,112 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { UsageError, withErrorHandling } from '../shared/errors.js';
6
+ import { getSourceDir, promptInteractive, RUNTIMES, resolveScope } from './plugin.js';
7
+ /** The runtimes `agent-setup` wires both the MCP connector and the skill for. */
8
+ export const AGENT_RUNTIMES = ['claude', 'codex'];
9
+ /** The plugin's one MCP connector (`claude-plugin/.mcp.json`): the name and URL every runtime is given. */
10
+ export function bundledConnector(sourceDir = getSourceDir()) {
11
+ const raw = JSON.parse(fs.readFileSync(path.join(sourceDir, '.mcp.json'), 'utf8'));
12
+ const [entry] = Object.entries(raw.mcpServers ?? {});
13
+ if (!entry?.[1]?.url)
14
+ throw new Error('claude-plugin/.mcp.json names no MCP connector');
15
+ return { name: entry[0], url: entry[1].url };
16
+ }
17
+ /** Where a runtime reads its MCP servers: Claude Code `./.mcp.json` / `~/.claude.json`, Codex `config.toml`. */
18
+ export function mcpConfigPath(runtime, scope, cwd = process.cwd(), home = os.homedir()) {
19
+ if (runtime === 'claude')
20
+ return scope === 'local' ? path.join(cwd, '.mcp.json') : path.join(home, '.claude.json');
21
+ return scope === 'local' ? path.join(cwd, '.codex', 'config.toml') : path.join(home, '.codex', 'config.toml');
22
+ }
23
+ /** The JSON config with the connector set under `mcpServers` (every other key kept as it was). */
24
+ export function mergeClaudeMcp(current, connector) {
25
+ let config = {};
26
+ if (current?.trim()) {
27
+ const parsed = JSON.parse(current);
28
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
29
+ throw new Error('not a JSON object');
30
+ config = parsed;
31
+ }
32
+ const servers = typeof config.mcpServers === 'object' && config.mcpServers !== null ? config.mcpServers : {};
33
+ return `${JSON.stringify({ ...config, mcpServers: { ...servers, [connector.name]: { type: 'http', url: connector.url } } }, null, 2)}\n`;
34
+ }
35
+ /** The Codex TOML with a `[mcp_servers.<name>]` table for the connector (an existing table is replaced). */
36
+ export function mergeCodexMcp(current, connector) {
37
+ const header = `[mcp_servers.${connector.name}]`;
38
+ const lines = (current ?? '').split('\n');
39
+ const start = lines.findIndex(line => line.trim() === header);
40
+ if (start >= 0) {
41
+ let end = start + 1;
42
+ while (end < lines.length && !(lines[end] ?? '').trim().startsWith('['))
43
+ end += 1;
44
+ lines.splice(start, end - start);
45
+ }
46
+ const body = lines.join('\n').replace(/\n+$/, '');
47
+ return `${body ? `${body}\n\n` : ''}${header}\nurl = "${connector.url}"\n`;
48
+ }
49
+ function writeMcp(runtime, scope, connector, dryRun) {
50
+ const target = mcpConfigPath(runtime, scope);
51
+ const current = fs.existsSync(target) ? fs.readFileSync(target, 'utf8') : undefined;
52
+ let next;
53
+ try {
54
+ next = runtime === 'claude' ? mergeClaudeMcp(current, connector) : mergeCodexMcp(current, connector);
55
+ }
56
+ catch (error) {
57
+ throw new Error(`${target}: ${error instanceof Error ? error.message : String(error)} — fix the file or add the connector by hand`);
58
+ }
59
+ if (!dryRun) {
60
+ fs.mkdirSync(path.dirname(target), { recursive: true });
61
+ fs.writeFileSync(target, next);
62
+ }
63
+ return target;
64
+ }
65
+ /**
66
+ * `invd agent-setup`: one step for an agent — the MCP connector in the runtime's config (Claude Code, Codex) and the
67
+ * skill / agent / commands the plugin installs. The connector signs in with OAuth on first use; no key is written.
68
+ */
69
+ export function registerAgentSetupCommand(program) {
70
+ program
71
+ .command('agent-setup')
72
+ .description('Connect an AI agent: the Invinite MCP connector plus the invd skill, in one step')
73
+ .option('--claude', 'Claude Code (.mcp.json / ~/.claude.json + .claude/)')
74
+ .option('--codex', 'Codex (config.toml [mcp_servers] + .codex/skills)')
75
+ .option('--all', 'Both')
76
+ .option('-g, --global', 'User-wide (home directory)')
77
+ .option('-l, --local', 'This project (current directory)')
78
+ .option('--dry-run', 'Print what would be written; write nothing')
79
+ .addHelpText('before', 'Examples:\n $ invd agent-setup --claude --local\n $ invd agent-setup --all --global --dry-run\n')
80
+ .action(withErrorHandling(async (opts) => {
81
+ let runtimes = opts.all ? [...AGENT_RUNTIMES] : AGENT_RUNTIMES.filter(runtime => opts[runtime]);
82
+ if (runtimes.length === 0)
83
+ runtimes = null;
84
+ let scope = resolveScope(opts);
85
+ if (!runtimes || !scope) {
86
+ if (!process.stdin.isTTY)
87
+ throw new UsageError('Name the agent (--claude, --codex, --all) and the scope (--global or --local)');
88
+ const answers = await promptInteractive(runtimes, scope);
89
+ runtimes = answers.runtimes;
90
+ scope = answers.scope;
91
+ }
92
+ const chosen = runtimes.filter((runtime) => AGENT_RUNTIMES.includes(runtime));
93
+ if (chosen.length === 0)
94
+ throw new UsageError('agent-setup supports --claude and --codex (invd plugin install covers the others)');
95
+ const sourceDir = getSourceDir();
96
+ const connector = bundledConnector(sourceDir);
97
+ const dryRun = opts.dryRun === true;
98
+ for (const runtime of chosen) {
99
+ const config = RUNTIMES[runtime];
100
+ const mcp = writeMcp(runtime, scope, connector, dryRun);
101
+ const skillRoot = scope === 'global' ? config.globalDir : config.localDir ? path.resolve(process.cwd(), config.localDir) : null;
102
+ if (skillRoot && !dryRun)
103
+ config.install(sourceDir, skillRoot);
104
+ const verb = dryRun ? 'would write' : 'wrote';
105
+ console.log(chalk.green(` ✓ ${config.label}`) + chalk.dim(` — ${verb} MCP ${connector.name} → ${mcp}${skillRoot ? `; skill → ${skillRoot}` : ''}`));
106
+ }
107
+ console.log(dryRun
108
+ ? chalk.bold('\nDry run: nothing was written.')
109
+ : chalk.bold(`\nDone. Restart the agent; it asks you to sign in to ${connector.url} the first time it uses a tool.`));
110
+ }));
111
+ }
112
+ //# sourceMappingURL=agent-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-setup.js","sourceRoot":"","sources":["../../../src/commands/agent-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Command } from 'commander';
2
+ import { type RequestOptions } from '../client/api-client.js';
3
+ /**
4
+ * The path (+ query) `invd api` sends to the configured API. An absolute URL is accepted only on the API's own
5
+ * origin (its path is used); any other host is refused — the request carries the API key.
6
+ */
7
+ export declare function apiPathOf(rawPath: string, baseUrl?: string): string;
8
+ interface ApiOpts {
9
+ field?: string[];
10
+ rawField?: string[];
11
+ header?: string[];
12
+ input?: string;
13
+ paginate?: boolean;
14
+ jq?: string;
15
+ dryRun?: boolean;
16
+ yes?: boolean;
17
+ showCost?: boolean;
18
+ }
19
+ /** The request `invd api [METHOD] <path> [-F k=v] [-f k=v] [-H 'Name: value'] [--input file]` describes. */
20
+ export declare function apiRequestFrom(first: string, second: string | undefined, opts: ApiOpts): Promise<RequestOptions>;
21
+ /**
22
+ * `invd api`: any operation of the spec, raw. `--paginate` follows `next_cursor` / `Link rel="next"` and prints
23
+ * every page (each through `--jq`), so `invd api /v2/filings?company=AAPL --paginate --jq '.data[].accession'`
24
+ * streams accessions.
25
+ */
26
+ export declare function registerApiCommand(program: Command): void;
27
+ export {};
@@ -0,0 +1,180 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import chalk from 'chalk';
3
+ import { apiCall, buildUrl } from '../client/api-client.js';
4
+ import { getBaseUrl } from '../config/config-manager.js';
5
+ import { nextCursorOf, rowsOf, walkPages } from '../client/pagination.js';
6
+ import { runJq } from '../output/jq.js';
7
+ import { emit } from '../output/render.js';
8
+ import { PartialResultError, UsageError, withErrorHandling } from '../shared/errors.js';
9
+ import { confirmOrRefuse, readStdin } from '../shared/prompt.js';
10
+ import { setJsonMode } from '../shared/spinner.js';
11
+ const METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
12
+ /** `-F key=value`: `true` / `false` / `null` and numbers typed, `@file` read from a file, anything else a string. */
13
+ async function typedValue(raw) {
14
+ if (raw === 'true' || raw === 'false')
15
+ return raw === 'true';
16
+ if (raw === 'null')
17
+ return null;
18
+ if (/^-?\d+(\.\d+)?$/.test(raw))
19
+ return Number(raw);
20
+ if (raw.startsWith('@'))
21
+ return (await readFile(raw.slice(1), 'utf8')).replace(/\n$/, '');
22
+ return raw;
23
+ }
24
+ /** A scheme (`https:`) or a protocol-relative `//host`: an absolute URL, not a path. */
25
+ const ABSOLUTE_URL = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
26
+ /**
27
+ * The path (+ query) `invd api` sends to the configured API. An absolute URL is accepted only on the API's own
28
+ * origin (its path is used); any other host is refused — the request carries the API key.
29
+ */
30
+ export function apiPathOf(rawPath, baseUrl = getBaseUrl()) {
31
+ if (!ABSOLUTE_URL.test(rawPath))
32
+ return rawPath.startsWith('/') ? rawPath : `/${rawPath}`;
33
+ const base = new URL(baseUrl);
34
+ let target;
35
+ try {
36
+ target = new URL(rawPath, base);
37
+ }
38
+ catch {
39
+ throw new UsageError(`${rawPath} is not a URL or an API path`);
40
+ }
41
+ if (target.origin !== base.origin) {
42
+ throw new UsageError(`invd api only calls ${base.origin} (the request carries your API key); refusing ${target.origin}. Pass a path such as /v2/companies/AAPL`);
43
+ }
44
+ const prefix = base.pathname.replace(/\/+$/, '');
45
+ const path = prefix && target.pathname.startsWith(`${prefix}/`) ? target.pathname.slice(prefix.length) : target.pathname;
46
+ return `${path}${target.search}`;
47
+ }
48
+ function splitPair(pair, separator, flag) {
49
+ const index = pair.indexOf(separator);
50
+ if (index <= 0)
51
+ throw new UsageError(`${flag} expects key${separator}value (got ${pair})`);
52
+ return [pair.slice(0, index).trim(), pair.slice(index + 1).trim()];
53
+ }
54
+ /** The request `invd api [METHOD] <path> [-F k=v] [-f k=v] [-H 'Name: value'] [--input file]` describes. */
55
+ export async function apiRequestFrom(first, second, opts) {
56
+ const upper = first.toUpperCase();
57
+ const [method, rawPath] = second !== undefined
58
+ ? [upper, second]
59
+ : METHODS.includes(upper) ? [upper, ''] : ['GET', first];
60
+ if (!METHODS.includes(method))
61
+ throw new UsageError(`${first} is not an HTTP method (${METHODS.join(', ')})`);
62
+ if (!rawPath)
63
+ throw new UsageError('invd api needs a path, e.g. invd api /v2/companies/AAPL');
64
+ const url = new URL(apiPathOf(rawPath), 'http://placeholder');
65
+ const query = {};
66
+ url.searchParams.forEach((value, key) => { (query[key] ??= []).push(value); });
67
+ const fields = [];
68
+ for (const pair of opts.field ?? []) {
69
+ const [key, value] = splitPair(pair, '=', '-F');
70
+ fields.push([key, await typedValue(value)]);
71
+ }
72
+ for (const pair of opts.rawField ?? [])
73
+ fields.push(splitPair(pair, '=', '-f'));
74
+ const headers = {};
75
+ for (const pair of opts.header ?? []) {
76
+ const [name, value] = splitPair(pair, ':', '-H');
77
+ headers[name] = value;
78
+ }
79
+ let body;
80
+ if (opts.input !== undefined) {
81
+ const text = opts.input === '-' ? await readStdin() : await readFile(opts.input, 'utf8');
82
+ try {
83
+ body = JSON.parse(text);
84
+ }
85
+ catch (error) {
86
+ throw new UsageError(`--input is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ }
89
+ if (method === 'GET' || method === 'DELETE') {
90
+ for (const [key, value] of fields)
91
+ (query[key] ??= []).push(String(value));
92
+ }
93
+ else if (fields.length > 0) {
94
+ if (body !== undefined && (typeof body !== 'object' || body === null || Array.isArray(body))) {
95
+ throw new UsageError('--input must hold a JSON object to combine with -F / -f');
96
+ }
97
+ body = { ...body, ...Object.fromEntries(fields) };
98
+ }
99
+ return {
100
+ path: url.pathname,
101
+ method,
102
+ query,
103
+ ...(Object.keys(headers).length ? { headers } : {}),
104
+ ...(body !== undefined ? { body } : {}),
105
+ };
106
+ }
107
+ function print(body, jq) {
108
+ if (body === undefined)
109
+ return;
110
+ emit(jq ? runJq(jq, body).join('\n') : typeof body === 'string' ? body : JSON.stringify(body, null, 2));
111
+ }
112
+ /**
113
+ * `invd api`: any operation of the spec, raw. `--paginate` follows `next_cursor` / `Link rel="next"` and prints
114
+ * every page (each through `--jq`), so `invd api /v2/filings?company=AAPL --paginate --jq '.data[].accession'`
115
+ * streams accessions.
116
+ */
117
+ export function registerApiCommand(program) {
118
+ program
119
+ .command('api')
120
+ .description('Call any API path directly (the escape hatch for anything the command tree lacks)')
121
+ .argument('<method-or-path>', 'GET (default), POST, PATCH, DELETE … or the path')
122
+ .argument('[path]', 'The path when a method is given, e.g. /v2/filings?company=AAPL')
123
+ .option('-F, --field <key=value>', 'A parameter (query on GET / DELETE, JSON body field otherwise); typed: numbers, true / false, null, @file', collect, [])
124
+ .option('-f, --raw-field <key=value>', 'Like -F, always a string', collect, [])
125
+ .option('-H, --header <name:value>', 'An extra request header', collect, [])
126
+ .option('--input <file>', 'The JSON request body from a file (- = stdin)')
127
+ .option('--paginate', 'Follow next_cursor / Link rel="next" and print every page')
128
+ .option('--jq <expr>', 'Filter each response with a jq expression (strings print raw)')
129
+ .option('--dry-run', 'Print the request; send nothing')
130
+ .option('--yes', 'Do not ask before a DELETE')
131
+ .option('--no-input', 'Never prompt')
132
+ .option('--show-cost', 'Print the credits this command cost to stderr')
133
+ .addHelpText('before', [
134
+ 'Examples:',
135
+ ' $ invd api /v2/companies/AAPL',
136
+ " $ invd api GET /v2/filings?company=AAPL --paginate --jq '.data[].accession'",
137
+ '',
138
+ ].join('\n'))
139
+ .addHelpText('after', '\nPaths: invd completion <shell> completes every /v2 path of the spec after `invd api`.\n')
140
+ .action(withErrorHandling(async (first, second, _raw, command) => {
141
+ const opts = command.opts();
142
+ // commander keeps --input <file> and --no-input in one attribute: a string is the file, false the switch.
143
+ const input = typeof opts.input === 'string' ? opts.input : undefined;
144
+ const request = await apiRequestFrom(first, second, { ...opts, input });
145
+ if (opts.jq)
146
+ setJsonMode(true);
147
+ if (opts.dryRun) {
148
+ emit(`${request.method} ${buildUrl(request.path, request.query)}${request.body !== undefined ? `\nbody: ${JSON.stringify(request.body)}` : ''}\ndry run: no request was sent`);
149
+ return;
150
+ }
151
+ if (request.method === 'DELETE') {
152
+ await confirmOrRefuse(`${request.method} ${request.path} deletes this resource.`, { yes: opts.yes, input: opts.input !== false });
153
+ }
154
+ const first_ = await apiCall(request);
155
+ if (!opts.paginate) {
156
+ print(first_.body, opts.jq);
157
+ if (first_.body === undefined)
158
+ console.error(chalk.green(`${first_.status} (no body)`));
159
+ return;
160
+ }
161
+ let written = 0;
162
+ let cursor;
163
+ try {
164
+ for await (const page of walkPages(request, first_)) {
165
+ print(page.body, opts.jq);
166
+ written += rowsOf(page.body).length || 1;
167
+ cursor = nextCursorOf(page.body);
168
+ }
169
+ }
170
+ catch (error) {
171
+ if (written > 0)
172
+ throw new PartialResultError(error, written, cursor);
173
+ throw error;
174
+ }
175
+ }));
176
+ }
177
+ function collect(value, previous) {
178
+ return [...previous, value];
179
+ }
180
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Command } from 'commander';
2
+ type ExchangeData = {
3
+ key: string;
4
+ keyHint: string;
5
+ label: string;
6
+ };
7
+ export type LoginDependencies = {
8
+ fetch: typeof fetch;
9
+ openBrowser: (url: string) => Promise<void>;
10
+ timeoutMs: number;
11
+ /**
12
+ * `--no-browser`: the redirect URL (or code) the person pastes; resolves with the pasted text. `signal` aborts the
13
+ * read once the login settled another way (the loopback callback won), so a waiting prompt never holds the process.
14
+ */
15
+ readPasted?: (prompt: string, signal: AbortSignal) => Promise<string>;
16
+ };
17
+ /** The exchange code and state of a pasted redirect URL (`http://127.0.0.1:…/callback?code=…&state=…`), or a bare code. */
18
+ export declare function parsePastedCallback(text: string): {
19
+ code?: string;
20
+ state?: string;
21
+ };
22
+ /**
23
+ * Browser sign-in: a loopback callback server receives the exchange code. With `noBrowser` (SSH sessions) the URL
24
+ * is printed instead and the person pastes the address their browser was sent to (the page itself may not load —
25
+ * the code is in its URL); whichever arrives first wins.
26
+ */
27
+ export declare function login(dependencies?: LoginDependencies, opts?: {
28
+ noBrowser?: boolean;
29
+ }): Promise<ExchangeData>;
30
+ export declare function logout(dependencies?: Pick<LoginDependencies, 'fetch'>): Promise<void>;
31
+ /** `invd auth status`: where the key comes from and, unless `offline`, what `GET /v2/me` says about it (free). */
32
+ export declare function status(opts?: {
33
+ offline?: boolean;
34
+ json?: boolean;
35
+ }): Promise<void>;
36
+ export declare function registerAuthCommands(program: Command): void;
37
+ export {};