market-feed 0.5.0 → 0.5.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.
- package/CHANGELOG.md +20 -0
- package/dist/cli.js +117 -0
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# market-feed Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.1 — 2026-03-12
|
|
4
|
+
|
|
5
|
+
### CLI additions
|
|
6
|
+
|
|
7
|
+
Three new commands expose the v0.5.0 corporate-action data from the terminal:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
market-feed earnings AAPL --limit 8
|
|
11
|
+
market-feed dividends AAPL --from 2020-01-01
|
|
12
|
+
market-feed splits AAPL --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
New flags `--from <date>` and `--to <date>` scope the dividend/split history by date range (ISO 8601). `--limit` and `--json` work on all three commands.
|
|
16
|
+
|
|
17
|
+
### Breaking changes
|
|
18
|
+
|
|
19
|
+
None.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
3
23
|
## 0.5.0 — 2026-03-11
|
|
4
24
|
|
|
5
25
|
### New modules
|
package/dist/cli.js
CHANGED
|
@@ -1595,6 +1595,9 @@ Commands:
|
|
|
1595
1595
|
search <query> Search for symbols
|
|
1596
1596
|
company <symbol> Fetch company profile
|
|
1597
1597
|
news <symbol> Fetch recent news
|
|
1598
|
+
earnings <symbol> Fetch EPS history (actuals vs. estimates)
|
|
1599
|
+
dividends <symbol> Fetch cash dividend history
|
|
1600
|
+
splits <symbol> Fetch stock split history
|
|
1598
1601
|
|
|
1599
1602
|
Options:
|
|
1600
1603
|
--av-key <key> Alpha Vantage API key
|
|
@@ -1605,6 +1608,8 @@ Options:
|
|
|
1605
1608
|
--interval <i> Historical interval: 1m 5m 15m 30m 1h 1d 1wk 1mo (default: 1d)
|
|
1606
1609
|
--period1 <date> Historical start date (ISO 8601)
|
|
1607
1610
|
--period2 <date> Historical end date (ISO 8601)
|
|
1611
|
+
--from <date> Dividends/splits start date (ISO 8601)
|
|
1612
|
+
--to <date> Dividends/splits end date (ISO 8601)
|
|
1608
1613
|
-h, --help Show this help message
|
|
1609
1614
|
|
|
1610
1615
|
Examples:
|
|
@@ -1613,6 +1618,9 @@ Examples:
|
|
|
1613
1618
|
market-feed search "apple inc"
|
|
1614
1619
|
market-feed company AAPL --json
|
|
1615
1620
|
market-feed news AAPL --limit 5
|
|
1621
|
+
market-feed earnings AAPL --limit 8
|
|
1622
|
+
market-feed dividends AAPL --from 2020-01-01
|
|
1623
|
+
market-feed splits AAPL --json
|
|
1616
1624
|
`.trim();
|
|
1617
1625
|
function parseArgs(argv) {
|
|
1618
1626
|
const args = argv.slice(2);
|
|
@@ -1653,6 +1661,12 @@ function parseArgs(argv) {
|
|
|
1653
1661
|
} else if (arg === "--period2") {
|
|
1654
1662
|
result.period2 = args[++i];
|
|
1655
1663
|
i++;
|
|
1664
|
+
} else if (arg === "--from") {
|
|
1665
|
+
result.from = args[++i];
|
|
1666
|
+
i++;
|
|
1667
|
+
} else if (arg === "--to") {
|
|
1668
|
+
result.to = args[++i];
|
|
1669
|
+
i++;
|
|
1656
1670
|
} else if (!arg.startsWith("-") && !result.command) {
|
|
1657
1671
|
result.command = arg;
|
|
1658
1672
|
i++;
|
|
@@ -1771,6 +1785,82 @@ async function runNews(feed, symbol, args) {
|
|
|
1771
1785
|
console.log("");
|
|
1772
1786
|
}
|
|
1773
1787
|
}
|
|
1788
|
+
async function runEarnings(feed, symbol, args) {
|
|
1789
|
+
const events = await feed.earnings(symbol, { limit: args.limit });
|
|
1790
|
+
if (args.json) {
|
|
1791
|
+
console.log(JSON.stringify(events, null, 2));
|
|
1792
|
+
return;
|
|
1793
|
+
}
|
|
1794
|
+
if (events.length === 0) {
|
|
1795
|
+
console.log("No earnings data found.");
|
|
1796
|
+
return;
|
|
1797
|
+
}
|
|
1798
|
+
console.log(
|
|
1799
|
+
`${pad("Date", 12)} ${pad("Period", 12)} ${pad("Actual", 9)} ${pad("Estimate", 9)} ${pad("Surprise%", 10)} Provider`
|
|
1800
|
+
);
|
|
1801
|
+
console.log("-".repeat(70));
|
|
1802
|
+
for (const e of events) {
|
|
1803
|
+
const date = e.date.toISOString().slice(0, 10);
|
|
1804
|
+
const period = e.period ?? "-";
|
|
1805
|
+
const actual = e.epsActual !== void 0 ? fmtNum(e.epsActual, 2) : "-";
|
|
1806
|
+
const estimate = e.epsEstimate !== void 0 ? fmtNum(e.epsEstimate, 2) : "-";
|
|
1807
|
+
const surprise = e.epsSurprisePct !== void 0 ? `${e.epsSurprisePct >= 0 ? "+" : ""}${fmtNum(e.epsSurprisePct, 2)}%` : "-";
|
|
1808
|
+
console.log(
|
|
1809
|
+
`${pad(date, 12)} ${pad(period, 12)} ${pad(actual, 9)} ${pad(estimate, 9)} ${pad(surprise, 10)} ${e.provider}`
|
|
1810
|
+
);
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
async function runDividends(feed, symbol, args) {
|
|
1814
|
+
const events = await feed.dividends(symbol, {
|
|
1815
|
+
limit: args.limit,
|
|
1816
|
+
...args.from ? { from: args.from } : {},
|
|
1817
|
+
...args.to ? { to: args.to } : {}
|
|
1818
|
+
});
|
|
1819
|
+
if (args.json) {
|
|
1820
|
+
console.log(JSON.stringify(events, null, 2));
|
|
1821
|
+
return;
|
|
1822
|
+
}
|
|
1823
|
+
if (events.length === 0) {
|
|
1824
|
+
console.log("No dividend data found.");
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
console.log(
|
|
1828
|
+
`${pad("Ex Date", 12)} ${pad("Amount", 9)} ${pad("Frequency", 14)} ${pad("Pay Date", 12)} Provider`
|
|
1829
|
+
);
|
|
1830
|
+
console.log("-".repeat(66));
|
|
1831
|
+
for (const e of events) {
|
|
1832
|
+
const exDate = e.exDate.toISOString().slice(0, 10);
|
|
1833
|
+
const amount = `$${fmtNum(e.amount, 4)}`;
|
|
1834
|
+
const freq = e.frequency ?? "-";
|
|
1835
|
+
const payDate = e.payDate ? e.payDate.toISOString().slice(0, 10) : "-";
|
|
1836
|
+
console.log(
|
|
1837
|
+
`${pad(exDate, 12)} ${pad(amount, 9)} ${pad(freq, 14)} ${pad(payDate, 12)} ${e.provider}`
|
|
1838
|
+
);
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
async function runSplits(feed, symbol, args) {
|
|
1842
|
+
const events = await feed.splits(symbol, {
|
|
1843
|
+
limit: args.limit,
|
|
1844
|
+
...args.from ? { from: args.from } : {},
|
|
1845
|
+
...args.to ? { to: args.to } : {}
|
|
1846
|
+
});
|
|
1847
|
+
if (args.json) {
|
|
1848
|
+
console.log(JSON.stringify(events, null, 2));
|
|
1849
|
+
return;
|
|
1850
|
+
}
|
|
1851
|
+
if (events.length === 0) {
|
|
1852
|
+
console.log("No split data found.");
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
console.log(`${pad("Date", 12)} ${pad("Ratio", 8)} ${pad("Description", 14)} Provider`);
|
|
1856
|
+
console.log("-".repeat(50));
|
|
1857
|
+
for (const e of events) {
|
|
1858
|
+
const date = e.date.toISOString().slice(0, 10);
|
|
1859
|
+
const ratio = fmtNum(e.ratio, 4);
|
|
1860
|
+
const desc = e.description ?? "-";
|
|
1861
|
+
console.log(`${pad(date, 12)} ${pad(ratio, 8)} ${pad(desc, 14)} ${e.provider}`);
|
|
1862
|
+
}
|
|
1863
|
+
}
|
|
1774
1864
|
async function main() {
|
|
1775
1865
|
const args = parseArgs(process.argv);
|
|
1776
1866
|
if (!args.command || args.command === "help") {
|
|
@@ -1825,6 +1915,33 @@ async function main() {
|
|
|
1825
1915
|
await runNews(feed, symbol, args);
|
|
1826
1916
|
break;
|
|
1827
1917
|
}
|
|
1918
|
+
case "earnings": {
|
|
1919
|
+
const [symbol] = args.positionals;
|
|
1920
|
+
if (!symbol) {
|
|
1921
|
+
console.error("Error: earnings requires a symbol\n");
|
|
1922
|
+
process.exit(1);
|
|
1923
|
+
}
|
|
1924
|
+
await runEarnings(feed, symbol, args);
|
|
1925
|
+
break;
|
|
1926
|
+
}
|
|
1927
|
+
case "dividends": {
|
|
1928
|
+
const [symbol] = args.positionals;
|
|
1929
|
+
if (!symbol) {
|
|
1930
|
+
console.error("Error: dividends requires a symbol\n");
|
|
1931
|
+
process.exit(1);
|
|
1932
|
+
}
|
|
1933
|
+
await runDividends(feed, symbol, args);
|
|
1934
|
+
break;
|
|
1935
|
+
}
|
|
1936
|
+
case "splits": {
|
|
1937
|
+
const [symbol] = args.positionals;
|
|
1938
|
+
if (!symbol) {
|
|
1939
|
+
console.error("Error: splits requires a symbol\n");
|
|
1940
|
+
process.exit(1);
|
|
1941
|
+
}
|
|
1942
|
+
await runSplits(feed, symbol, args);
|
|
1943
|
+
break;
|
|
1944
|
+
}
|
|
1828
1945
|
default: {
|
|
1829
1946
|
console.error(`Unknown command: "${args.command}"
|
|
1830
1947
|
`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/memory.ts","../src/errors.ts","../src/http/client.ts","../src/utils/symbol.ts","../src/providers/yahoo/transform.ts","../src/providers/yahoo/index.ts","../src/client.ts","../src/utils/rate-limiter.ts","../src/providers/alpha-vantage/transform.ts","../src/providers/alpha-vantage/index.ts","../src/providers/finnhub/transform.ts","../src/providers/finnhub/index.ts","../src/providers/polygon/transform.ts","../src/providers/polygon/index.ts","../src/cli/index.ts"],"names":["PROVIDER","transformQuote","transformSearch","transformCompany","transformHistorical","transformEarnings","toEpoch","subtractOneYear","transformNews","toDateString","s"],"mappings":"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","file":"cli.js","sourcesContent":["import type { CacheDriver } from \"./types.js\";\n\ninterface Entry<T> {\n value: T;\n expiresAt: number; // epoch ms, 0 = no expiry\n}\n\n/**\n * A simple LRU (Least-Recently-Used) in-memory cache with TTL support.\n * No dependencies — uses a Map for O(1) access and insertion-order eviction.\n */\nexport class MemoryCacheDriver implements CacheDriver {\n private readonly store = new Map<string, Entry<unknown>>();\n private readonly maxSize: number;\n\n constructor(maxSize = 500) {\n this.maxSize = maxSize;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key) as Entry<T> | undefined;\n if (!entry) return undefined;\n\n // Evict expired entries on read\n if (entry.expiresAt !== 0 && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n\n // LRU: move to end (most recently used)\n this.store.delete(key);\n this.store.set(key, entry);\n\n return entry.value;\n }\n\n async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {\n // Evict the oldest entry if at capacity\n if (this.store.size >= this.maxSize && !this.store.has(key)) {\n const oldest = this.store.keys().next().value;\n if (oldest !== undefined) {\n this.store.delete(oldest);\n }\n }\n\n const expiresAt =\n ttlSeconds !== undefined && ttlSeconds > 0 ? Date.now() + ttlSeconds * 1_000 : 0;\n\n this.store.set(key, { value, expiresAt });\n }\n\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n /** Current number of cached entries (including potentially expired ones). */\n get size(): number {\n return this.store.size;\n }\n}\n","/**\n * Base error class for all market-feed errors.\n * Includes the provider name so callers can identify the source.\n */\nexport class MarketFeedError extends Error {\n constructor(\n message: string,\n public readonly provider: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"MarketFeedError\";\n // Maintain correct prototype chain in transpiled output\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when an upstream provider returns an HTTP error or unexpected payload.\n */\nexport class ProviderError extends MarketFeedError {\n constructor(\n message: string,\n provider: string,\n public readonly statusCode?: number,\n cause?: unknown,\n ) {\n super(message, provider, cause);\n this.name = \"ProviderError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a provider's rate limit is reached.\n * Contains the earliest time the caller may retry.\n */\nexport class RateLimitError extends MarketFeedError {\n constructor(\n provider: string,\n public readonly retryAfter?: Date,\n ) {\n const when = retryAfter ? ` Retry after ${retryAfter.toISOString()}.` : \"\";\n super(`Rate limit reached for provider \"${provider}\".${when}`, provider);\n this.name = \"RateLimitError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when all configured providers have failed for a given operation.\n */\nexport class AllProvidersFailedError extends Error {\n constructor(\n public readonly errors: MarketFeedError[],\n operation: string,\n ) {\n const summary = errors.map((e) => `[${e.provider}] ${e.message}`).join(\"; \");\n super(`All providers failed for \"${operation}\": ${summary}`);\n this.name = \"AllProvidersFailedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a required feature is not supported by the active provider.\n */\nexport class UnsupportedOperationError extends MarketFeedError {\n constructor(provider: string, operation: string) {\n super(`Provider \"${provider}\" does not support \"${operation}\".`, provider);\n this.name = \"UnsupportedOperationError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { ProviderError } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n /** Base URL prepended to every request path */\n baseUrl?: string;\n /** Default headers merged into every request */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Number of retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /** Initial backoff in milliseconds for exponential retry. Defaults to 300. */\n retryDelayMs?: number;\n}\n\nexport interface RequestOptions {\n params?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n timeoutMs?: number;\n}\n\n/** HTTP status codes that are safe to retry */\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction buildUrl(\n base: string,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n): string {\n const url = new URL(path, base.endsWith(\"/\") ? base : `${base}/`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly retryDelayMs: number;\n\n constructor(\n private readonly providerName: string,\n options: HttpClientOptions = {},\n ) {\n this.baseUrl = options.baseUrl ?? \"\";\n this.defaultHeaders = {\n Accept: \"application/json\",\n \"User-Agent\": \"market-feed/0.1.0 (+https://github.com/piyushgupta344/market-feed)\",\n ...options.headers,\n };\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.retries = options.retries ?? 2;\n this.retryDelayMs = options.retryDelayMs ?? 300;\n }\n\n async get<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = buildUrl(this.baseUrl, path, options.params);\n const headers = { ...this.defaultHeaders, ...options.headers };\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n // Exponential backoff: 300ms, 600ms, 1200ms...\n await sleep(this.retryDelayMs * 2 ** (attempt - 1));\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n if (RETRYABLE_STATUSES.has(response.status) && attempt < this.retries) {\n lastError = new ProviderError(\n `HTTP ${response.status} from ${url}`,\n this.providerName,\n response.status,\n );\n continue;\n }\n throw new ProviderError(\n `HTTP ${response.status} ${response.statusText} from ${url}`,\n this.providerName,\n response.status,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\") && !contentType.includes(\"text/plain\")) {\n // Some financial APIs return JSON with a non-standard content-type\n }\n\n return (await response.json()) as T;\n } catch (err) {\n clearTimeout(timer);\n\n if (err instanceof ProviderError) {\n throw err;\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ProviderError(\n `Request to ${url} timed out after ${timeoutMs}ms`,\n this.providerName,\n );\n }\n\n if (attempt < this.retries) {\n lastError = err;\n continue;\n }\n\n throw new ProviderError(\n `Network error fetching ${url}: ${err instanceof Error ? err.message : String(err)}`,\n this.providerName,\n undefined,\n err,\n );\n }\n }\n\n throw new ProviderError(\n `Failed after ${this.retries + 1} attempts`,\n this.providerName,\n undefined,\n lastError,\n );\n }\n}\n","/**\n * Normalise a ticker symbol for use with a specific provider.\n *\n * Different providers use slightly different conventions:\n * - Yahoo Finance: \"BRK-B\", \"BTC-USD\"\n * - Alpha Vantage: \"BRKB\", \"BTCUSD\" (no separator for crypto pairs)\n * - Polygon.io: \"BRK/B\", \"X:BTCUSD\"\n */\n\n/** Strip exchange suffixes like \".NASDAQ\" or \".NYSE\" */\nexport function stripExchange(symbol: string): string {\n return symbol.split(\".\")[0] ?? symbol;\n}\n\n/** Upper-case and trim a symbol */\nexport function normalise(symbol: string): string {\n return symbol.trim().toUpperCase();\n}\n\n/** Convert \"BTC/USD\" or \"BTCUSD\" → \"BTC-USD\" (Yahoo style) */\nexport function toYahooSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n // \"BTC/USD\" → \"BTC-USD\"\n if (s.includes(\"/\")) return s.replace(\"/\", \"-\");\n return s;\n}\n\n/** Convert \"BTC-USD\" → \"BTCUSD\" (Alpha Vantage style for some endpoints) */\nexport function toAlphaVantageSymbol(symbol: string): string {\n return normalise(stripExchange(symbol)).replace(/[-/]/g, \"\");\n}\n\n/** Convert \"BTC-USD\" → \"X:BTCUSD\" for Polygon crypto, else leave as-is */\nexport function toPolygonSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n if (s.includes(\"-\")) {\n const [base, quote] = s.split(\"-\");\n if (base && quote && quote.length === 3) {\n // Likely a crypto pair\n return `X:${base}${quote}`;\n }\n }\n return s;\n}\n\n/** Deduplicate and normalise an array of symbols */\nexport function dedupeSymbols(symbols: string[]): string[] {\n return [...new Set(symbols.map(normalise))];\n}\n\n// ---------------------------------------------------------------------------\n// Asset-class detection\n// ---------------------------------------------------------------------------\n\n/**\n * Well-known crypto base currencies.\n * Used to distinguish BTC/USD (crypto) from EUR/USD (forex) in slash-separated pairs.\n */\nconst KNOWN_CRYPTO_BASES = new Set([\n \"BTC\", \"ETH\", \"ADA\", \"SOL\", \"XRP\", \"DOGE\", \"DOT\", \"AVAX\", \"MATIC\", \"LINK\",\n \"LTC\", \"BCH\", \"UNI\", \"ATOM\", \"BNB\", \"TRX\", \"SHIB\", \"NEAR\", \"APT\", \"ARB\",\n]);\n\n/** Quote currencies that, combined with a known crypto base, confirm a crypto pair */\nconst CRYPTO_QUOTE_CURRENCIES = new Set([\n \"USD\", \"EUR\", \"BTC\", \"ETH\", \"USDT\", \"USDC\", \"GBP\", \"BUSD\",\n]);\n\n/**\n * Returns `true` if the symbol looks like a cryptocurrency pair.\n *\n * Handles:\n * - Yahoo-style: \"BTC-USD\", \"ETH-USD\"\n * - Slash-style: \"BTC/USD\", \"ETH/BTC\"\n * - Polygon-style: \"X:BTCUSD\"\n */\nexport function isCrypto(symbol: string): boolean {\n const s = normalise(symbol);\n if (s.startsWith(\"X:\")) return true; // Polygon crypto prefix\n if (s.includes(\"/\")) {\n const [base, quote] = s.split(\"/\");\n return (\n KNOWN_CRYPTO_BASES.has(base ?? \"\") && CRYPTO_QUOTE_CURRENCIES.has(quote ?? \"\")\n );\n }\n if (s.includes(\"-\") && !s.endsWith(\"=X\")) {\n const [base, quote] = s.split(\"-\");\n return (\n (KNOWN_CRYPTO_BASES.has(base ?? \"\") || (quote?.length === 3 && KNOWN_CRYPTO_BASES.has(base ?? \"\"))) &&\n CRYPTO_QUOTE_CURRENCIES.has(quote ?? \"\")\n );\n }\n return false;\n}\n\n/**\n * Returns `true` if the symbol looks like a forex pair.\n *\n * Handles:\n * - Yahoo-style: \"EURUSD=X\", \"GBPUSD=X\"\n * - Polygon-style: \"C:EURUSD\"\n * - OANDA-style: \"OANDA:EUR_USD\"\n * - Standard: \"EUR/USD\", \"GBP/JPY\" (when not also a crypto pair)\n */\nexport function isForex(symbol: string): boolean {\n const s = normalise(symbol);\n if (s.startsWith(\"C:\")) return true; // Polygon forex prefix\n if (s.startsWith(\"OANDA:\")) return true; // OANDA format\n if (/^[A-Z]{6}=X$/.test(s)) return true; // Yahoo forex (e.g. \"EURUSD=X\")\n // Standard three-letter pair — only if not already classified as crypto\n if (/^[A-Z]{3}\\/[A-Z]{3}$/.test(s) && !isCrypto(s)) return true;\n return false;\n}\n\n/**\n * Convert a symbol to Finnhub format.\n * Finnhub uses plain uppercase tickers for US stocks (e.g. \"AAPL\").\n */\nexport function toFinnhubSymbol(symbol: string): string {\n return normalise(stripExchange(symbol));\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent } from \"../../types/dividends.js\";\nimport type { EarningsEvent } from \"../../types/earnings.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { SearchResult } from \"../../types/search.js\";\nimport type { AssetType } from \"../../types/search.js\";\nimport type { SplitEvent } from \"../../types/splits.js\";\nimport type { YahooChartResult, YahooQuoteSummaryResult, YahooSearchQuote } from \"./types.js\";\n\nconst PROVIDER = \"yahoo\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(result: YahooChartResult, raw?: unknown): Quote {\n const meta = result.meta;\n\n return {\n symbol: meta.symbol,\n name: meta.symbol, // Yahoo chart API doesn't return company name — enriched separately\n price: meta.regularMarketPrice,\n change: meta.regularMarketPrice - meta.regularMarketPreviousClose,\n changePercent:\n ((meta.regularMarketPrice - meta.regularMarketPreviousClose) /\n meta.regularMarketPreviousClose) *\n 100,\n open: meta.regularMarketDayHigh, // chart meta has dayHigh/Low not open — see below\n high: meta.regularMarketDayHigh,\n low: meta.regularMarketDayLow,\n close: meta.regularMarketPrice,\n previousClose: meta.regularMarketPreviousClose,\n volume: meta.regularMarketVolume,\n ...(meta.fiftyTwoWeekHigh !== undefined ? { fiftyTwoWeekHigh: meta.fiftyTwoWeekHigh } : {}),\n ...(meta.fiftyTwoWeekLow !== undefined ? { fiftyTwoWeekLow: meta.fiftyTwoWeekLow } : {}),\n currency: meta.currency,\n exchange: meta.fullExchangeName ?? meta.exchangeName,\n timestamp: new Date(meta.regularMarketTime * 1_000),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistorical(result: YahooChartResult, raw?: unknown): HistoricalBar[] {\n const timestamps = result.timestamp ?? [];\n const quoteIndicators = result.indicators.quote[0];\n const adjCloseIndicators = result.indicators.adjclose?.[0];\n\n if (!quoteIndicators) return [];\n\n return timestamps\n .map((ts, i) => {\n const open = quoteIndicators.open[i];\n const high = quoteIndicators.high[i];\n const low = quoteIndicators.low[i];\n const close = quoteIndicators.close[i];\n const volume = quoteIndicators.volume[i];\n const adjClose = adjCloseIndicators?.adjclose[i];\n\n // Skip bars with null/undefined OHLCV (Yahoo returns nulls for non-trading days)\n // Using == null to catch both null and undefined (noUncheckedIndexedAccess)\n if (open == null || high == null || low == null || close == null || volume == null) {\n return null;\n }\n\n const bar: HistoricalBar = {\n date: new Date(ts * 1_000),\n open,\n high,\n low,\n close,\n volume,\n ...(adjClose !== null && adjClose !== undefined ? { adjClose } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n\n return bar;\n })\n .filter((bar): bar is HistoricalBar => bar !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(\n symbol: string,\n result: YahooQuoteSummaryResult,\n raw?: unknown,\n): CompanyProfile {\n const profile = result.assetProfile;\n const summary = result.summaryDetail;\n const price = result.price;\n\n const officers = profile?.companyOfficers ?? [];\n const ceo = officers.find((o) => (o.title ?? \"\").toLowerCase().includes(\"chief executive\"))?.name;\n\n return {\n symbol,\n name: price?.longName ?? price?.shortName ?? symbol,\n ...(profile?.longBusinessSummary !== undefined\n ? { description: profile.longBusinessSummary }\n : {}),\n ...(profile?.sector !== undefined ? { sector: profile.sector } : {}),\n ...(profile?.industry !== undefined ? { industry: profile.industry } : {}),\n ...(profile?.country !== undefined ? { country: profile.country } : {}),\n ...(profile?.fullTimeEmployees !== undefined ? { employees: profile.fullTimeEmployees } : {}),\n ...(profile?.website !== undefined ? { website: profile.website } : {}),\n ...(ceo !== undefined ? { ceo } : {}),\n ...(summary?.marketCap?.raw !== undefined ? { marketCap: summary.marketCap.raw } : {}),\n ...(summary?.trailingPE?.raw !== undefined ? { peRatio: summary.trailingPE.raw } : {}),\n ...(summary?.forwardPE?.raw !== undefined ? { forwardPE: summary.forwardPE.raw } : {}),\n ...(summary?.priceToBook?.raw !== undefined ? { priceToBook: summary.priceToBook.raw } : {}),\n ...(summary?.dividendYield?.raw !== undefined\n ? { dividendYield: summary.dividendYield.raw }\n : {}),\n ...(summary?.beta?.raw !== undefined ? { beta: summary.beta.raw } : {}),\n ...(price?.exchangeName !== undefined ? { exchange: price.exchangeName } : {}),\n ...(price?.currency !== undefined\n ? { currency: price.currency }\n : summary?.currency !== undefined\n ? { currency: summary.currency }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Earnings\n// ---------------------------------------------------------------------------\nexport function transformEarnings(\n symbol: string,\n result: YahooQuoteSummaryResult,\n raw?: unknown,\n): EarningsEvent[] {\n const history = result.earningsHistory?.history;\n if (!history || history.length === 0) return [];\n\n return history\n .map((entry) => {\n const ts = entry.quarter?.raw;\n if (ts == null) return null;\n\n const event: EarningsEvent = {\n symbol,\n date: new Date(ts * 1_000),\n ...(entry.quarter?.fmt !== undefined ? { period: entry.quarter.fmt } : {}),\n ...(entry.epsActual?.raw !== undefined ? { epsActual: entry.epsActual.raw } : {}),\n ...(entry.epsEstimate?.raw !== undefined ? { epsEstimate: entry.epsEstimate.raw } : {}),\n ...(entry.surprisePercent?.raw !== undefined\n ? { epsSurprisePct: entry.surprisePercent.raw }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n return event;\n })\n .filter((e): e is EarningsEvent => e !== null)\n .sort((a, b) => b.date.getTime() - a.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Dividends\n// ---------------------------------------------------------------------------\nexport function transformDividends(\n symbol: string,\n result: YahooChartResult,\n raw?: unknown,\n): DividendEvent[] {\n const dividends = result.events?.dividends;\n if (!dividends) return [];\n\n return Object.values(dividends)\n .map((d) => ({\n symbol,\n exDate: new Date(d.date * 1_000),\n amount: d.amount,\n currency: result.meta.currency,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n }))\n .sort((a, b) => b.exDate.getTime() - a.exDate.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Splits\n// ---------------------------------------------------------------------------\nexport function transformSplits(\n symbol: string,\n result: YahooChartResult,\n raw?: unknown,\n): SplitEvent[] {\n const splits = result.events?.splits;\n if (!splits) return [];\n\n return Object.values(splits)\n .map((s) => ({\n symbol,\n date: new Date(s.date * 1_000),\n ratio: s.denominator > 0 ? s.numerator / s.denominator : s.numerator,\n description: s.splitRatio,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n }))\n .sort((a, b) => b.date.getTime() - a.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst YAHOO_TYPE_MAP: Record<string, AssetType> = {\n EQUITY: \"stock\",\n ETF: \"etf\",\n CRYPTOCURRENCY: \"crypto\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MUTUALFUND: \"mutual-fund\",\n FUTURE: \"future\",\n};\n\nexport function transformSearch(quote: YahooSearchQuote, raw?: unknown): SearchResult {\n const exchange = quote.exchDisp ?? quote.exchange;\n return {\n symbol: quote.symbol,\n name: quote.longname ?? quote.shortname ?? quote.symbol,\n type: YAHOO_TYPE_MAP[quote.quoteType?.toUpperCase() ?? \"\"] ?? \"unknown\",\n ...(exchange !== undefined ? { exchange } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"../../types/dividends.js\";\nimport type { EarningsEvent, EarningsOptions } from \"../../types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"../../types/splits.js\";\nimport { toYahooSymbol } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformDividends,\n transformEarnings,\n transformHistorical,\n transformQuote,\n transformSearch,\n transformSplits,\n} from \"./transform.js\";\nimport type {\n YahooChartResponse,\n YahooQuoteSummaryResponse,\n YahooSearchResponse,\n} from \"./types.js\";\n\nexport interface YahooProviderOptions {\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n}\n\n/**\n * Yahoo Finance provider — no API key required.\n *\n * Uses the unofficial Yahoo Finance v8 chart API, which is free and publicly\n * accessible but not officially supported. Use respectfully.\n */\nexport class YahooProvider implements MarketProvider {\n readonly name = \"yahoo\";\n\n private readonly http1: HttpClient;\n private readonly http2: HttpClient;\n\n constructor(options: YahooProviderOptions = {}) {\n const shared = {\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: {\n Accept: \"application/json\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n },\n };\n this.http1 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query1.finance.yahoo.com\",\n });\n this.http2 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query2.finance.yahoo.com\",\n });\n }\n\n // ---------------------------------------------------------------------------\n // Quote\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n const results = await Promise.all(\n symbols.map((symbol) => this.fetchSingleQuote(symbol, options)),\n );\n return results;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = toYahooSymbol(symbol);\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval: \"1d\",\n range: \"1d\",\n includePrePost: false,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(err?.description ?? `No data returned for symbol \"${s}\"`, this.name);\n }\n\n return transformQuote(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const s = toYahooSymbol(symbol);\n const interval = options?.interval ?? \"1d\";\n\n const period1 = toEpoch(options?.period1 ?? subtractOneYear());\n const period2 = toEpoch(options?.period2 ?? new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval,\n period1,\n period2,\n events: \"div,splits\",\n includeAdjustedClose: true,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No historical data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformHistorical(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const limit = options?.limit ?? 10;\n\n const data = await this.http1.get<YahooSearchResponse>(\"/v1/finance/search\", {\n params: {\n q: query,\n quotesCount: limit,\n newsCount: 0,\n enableFuzzyQuery: false,\n enableEnhancedTrivialQuery: true,\n },\n });\n\n return (data.quotes ?? [])\n .slice(0, limit)\n .map((q) => transformSearch(q, options?.raw ? q : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const s = toYahooSymbol(symbol);\n\n const data = await this.http2.get<YahooQuoteSummaryResponse>(`/v10/finance/quoteSummary/${s}`, {\n params: {\n modules: \"assetProfile,summaryDetail,price\",\n },\n });\n\n const result = data.quoteSummary.result?.[0];\n if (!result) {\n const err = data.quoteSummary.error;\n throw new ProviderError(err?.description ?? `No company data for symbol \"${s}\"`, this.name);\n }\n\n return transformCompany(symbol, result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Earnings\n // ---------------------------------------------------------------------------\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http2.get<YahooQuoteSummaryResponse>(`/v10/finance/quoteSummary/${s}`, {\n params: { modules: \"earningsHistory\" },\n });\n\n const result = data.quoteSummary.result?.[0];\n if (!result) {\n const err = data.quoteSummary.error;\n throw new ProviderError(\n err?.description ?? `No earnings data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformEarnings(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n\n // ---------------------------------------------------------------------------\n // Dividends\n // ---------------------------------------------------------------------------\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 50;\n\n const period1 = options?.from ? toEpoch(options.from) : toEpoch(subtractYears(10));\n const period2 = options?.to ? toEpoch(options.to) : toEpoch(new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: { interval: \"1d\", period1, period2, events: \"div\" },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No dividend data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformDividends(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n\n // ---------------------------------------------------------------------------\n // Splits\n // ---------------------------------------------------------------------------\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 50;\n\n const period1 = options?.from ? toEpoch(options.from) : toEpoch(subtractYears(10));\n const period2 = options?.to ? toEpoch(options.to) : toEpoch(new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: { interval: \"1d\", period1, period2, events: \"split\" },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No split data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformSplits(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction toEpoch(date: string | Date): number {\n const d = date instanceof Date ? date : new Date(date);\n return Math.floor(d.getTime() / 1_000);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n\nfunction subtractYears(n: number): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - n);\n return d;\n}\n","import { MemoryCacheDriver } from \"./cache/memory.js\";\nimport type { CacheConfig, CacheDriver, CacheMethod } from \"./cache/types.js\";\nimport { AllProvidersFailedError, MarketFeedError, UnsupportedOperationError } from \"./errors.js\";\nimport { YahooProvider } from \"./providers/yahoo/index.js\";\nimport type { CompanyOptions, CompanyProfile } from \"./types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"./types/dividends.js\";\nimport type { EarningsEvent, EarningsOptions } from \"./types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"./types/historical.js\";\nimport type { MarketStatus, MarketStatusOptions } from \"./types/market.js\";\nimport type { NewsItem, NewsOptions } from \"./types/news.js\";\nimport type { MarketProvider } from \"./types/provider.js\";\nimport type { Quote, QuoteOptions } from \"./types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"./types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"./types/splits.js\";\n\nexport interface MarketFeedOptions {\n /**\n * Ordered list of provider adapters.\n * When `fallback: true`, each is tried in order until one succeeds.\n * Defaults to `[new YahooProvider()]`.\n */\n providers?: MarketProvider[];\n /**\n * Cache configuration. Pass `false` to disable caching entirely.\n * Defaults to an in-memory LRU cache with 60s TTL.\n */\n cache?: CacheConfig | false;\n /**\n * When `true`, automatically tries the next provider if the current one fails.\n * Defaults to `true`.\n */\n fallback?: boolean;\n}\n\n// Default TTLs per method (seconds)\nconst DEFAULT_TTLS: Record<CacheMethod, number> = {\n quote: 60,\n historical: 3600,\n company: 86400,\n news: 300,\n search: 600,\n marketStatus: 60,\n earnings: 3600,\n dividends: 86400,\n splits: 86400,\n};\n\n/**\n * The unified MarketFeed client.\n *\n * Wraps one or more provider adapters under a single consistent API.\n * Handles caching, fallback, and error aggregation transparently.\n *\n * @example\n * ```ts\n * import { MarketFeed } from 'market-feed';\n *\n * const feed = new MarketFeed();\n * const quote = await feed.quote('AAPL');\n * console.log(quote.price); // 189.84\n * ```\n */\nexport class MarketFeed {\n private readonly _providers: MarketProvider[];\n private readonly cache: CacheDriver | null;\n private readonly fallback: boolean;\n private readonly ttls: Record<CacheMethod, number>;\n\n /** Read-only view of the configured provider adapters. */\n get providers(): readonly MarketProvider[] {\n return this._providers;\n }\n\n constructor(options: MarketFeedOptions = {}) {\n this._providers =\n options.providers && options.providers.length > 0 ? options.providers : [new YahooProvider()];\n\n this.fallback = options.fallback ?? true;\n\n if (options.cache === false) {\n this.cache = null;\n } else {\n const cfg = options.cache ?? {};\n this.cache = cfg.driver ?? new MemoryCacheDriver(cfg.maxSize ?? 500);\n }\n\n const overrides = options.cache !== false ? (options.cache?.ttlOverrides ?? {}) : {};\n this.ttls = { ...DEFAULT_TTLS, ...overrides };\n }\n\n // ---------------------------------------------------------------------------\n // quote\n // ---------------------------------------------------------------------------\n\n /** Fetch a quote for a single symbol. */\n async quote(symbol: string, options?: QuoteOptions): Promise<Quote>;\n /** Fetch quotes for multiple symbols in parallel. */\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]>;\n async quote(\n symbolOrSymbols: string | string[],\n options?: QuoteOptions,\n ): Promise<Quote | Quote[]> {\n const isSingle = typeof symbolOrSymbols === \"string\";\n const symbols = isSingle ? [symbolOrSymbols] : symbolOrSymbols;\n\n const cacheKey = `quote:${symbols.join(\",\")}`;\n const cached = await this.getCache<Quote[]>(cacheKey);\n if (cached) return isSingle ? (cached[0] as Quote) : cached;\n\n const result = await this.withFallback(\"quote\", (provider) => provider.quote(symbols, options));\n\n await this.setCache(cacheKey, result, \"quote\");\n return isSingle ? (result[0] as Quote) : result;\n }\n\n // ---------------------------------------------------------------------------\n // historical\n // ---------------------------------------------------------------------------\n\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const interval = options?.interval ?? \"1d\";\n const p1 = normaliseDate(options?.period1);\n const p2 = normaliseDate(options?.period2 ?? new Date());\n const cacheKey = `historical:${symbol}:${interval}:${p1}:${p2}`;\n\n const cached = await this.getCache<HistoricalBar[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"historical\", (provider) =>\n provider.historical(symbol, options),\n );\n\n await this.setCache(cacheKey, result, \"historical\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // search\n // ---------------------------------------------------------------------------\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${options?.limit ?? 10}`;\n const cached = await this.getCache<SearchResult[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"search\", (provider) => provider.search(query, options));\n\n await this.setCache(cacheKey, result, \"search\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // company\n // ---------------------------------------------------------------------------\n\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const cacheKey = `company:${symbol}`;\n const cached = await this.getCache<CompanyProfile>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"company\", (provider) => {\n if (!provider.company) throw new UnsupportedOperationError(provider.name, \"company\");\n return provider.company(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"company\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // news\n // ---------------------------------------------------------------------------\n\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n const cacheKey = `news:${symbol}:${options?.limit ?? 10}`;\n const cached = await this.getCache<NewsItem[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"news\", (provider) => {\n if (!provider.news) throw new UnsupportedOperationError(provider.name, \"news\");\n return provider.news(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"news\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // marketStatus\n // ---------------------------------------------------------------------------\n\n async marketStatus(market?: string, options?: MarketStatusOptions): Promise<MarketStatus> {\n const cacheKey = `marketStatus:${market ?? \"default\"}`;\n const cached = await this.getCache<MarketStatus>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"marketStatus\", (provider) => {\n if (!provider.marketStatus) {\n throw new UnsupportedOperationError(provider.name, \"marketStatus\");\n }\n return provider.marketStatus(market, options);\n });\n\n await this.setCache(cacheKey, result, \"marketStatus\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // earnings\n // ---------------------------------------------------------------------------\n\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n const limit = options?.limit ?? 10;\n const cacheKey = `earnings:${symbol}:${limit}`;\n const cached = await this.getCache<EarningsEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"earnings\", (provider) => {\n if (!provider.earnings) throw new UnsupportedOperationError(provider.name, \"earnings\");\n return provider.earnings(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"earnings\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // dividends\n // ---------------------------------------------------------------------------\n\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n const from = normaliseDate(options?.from);\n const to = normaliseDate(options?.to ?? new Date());\n const cacheKey = `dividends:${symbol}:${from}:${to}`;\n const cached = await this.getCache<DividendEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"dividends\", (provider) => {\n if (!provider.dividends) throw new UnsupportedOperationError(provider.name, \"dividends\");\n return provider.dividends(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"dividends\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // splits\n // ---------------------------------------------------------------------------\n\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n const from = normaliseDate(options?.from);\n const to = normaliseDate(options?.to ?? new Date());\n const cacheKey = `splits:${symbol}:${from}:${to}`;\n const cached = await this.getCache<SplitEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"splits\", (provider) => {\n if (!provider.splits) throw new UnsupportedOperationError(provider.name, \"splits\");\n return provider.splits(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"splits\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // Cache management\n // ---------------------------------------------------------------------------\n\n /** Invalidate all cached entries. */\n async clearCache(): Promise<void> {\n await this.cache?.clear();\n }\n\n /** Invalidate a specific cache key (exact match). */\n async invalidate(key: string): Promise<void> {\n await this.cache?.delete(key);\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private async withFallback<T>(\n operation: string,\n fn: (provider: MarketProvider) => Promise<T>,\n ): Promise<T> {\n const errors: MarketFeedError[] = [];\n\n for (const provider of this._providers) {\n try {\n return await fn(provider);\n } catch (err) {\n if (err instanceof UnsupportedOperationError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n if (err instanceof MarketFeedError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n // Unknown error — wrap and rethrow\n throw err;\n }\n }\n\n throw new AllProvidersFailedError(errors, operation);\n }\n\n private async getCache<T>(key: string): Promise<T | undefined> {\n if (!this.cache) return undefined;\n return this.cache.get<T>(key);\n }\n\n private async setCache<T>(key: string, value: T, method: CacheMethod): Promise<void> {\n if (!this.cache) return;\n await this.cache.set(key, value, this.ttls[method]);\n }\n}\n\nfunction normaliseDate(d?: string | Date): string {\n if (!d) return \"\";\n const date = d instanceof Date ? d : new Date(d);\n return date.toISOString().slice(0, 10);\n}\n","import { RateLimitError } from \"../errors.js\";\n\n/**\n * Token-bucket rate limiter.\n *\n * Tokens refill at `refillRate` tokens per second up to `capacity`.\n * Call `consume()` before each API request; it throws `RateLimitError`\n * if the bucket is empty.\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number; // epoch ms\n\n /**\n * @param providerName Used in error messages\n * @param capacity Maximum tokens in the bucket (= burst limit)\n * @param refillRate Tokens added per second\n */\n constructor(\n private readonly providerName: string,\n private readonly capacity: number,\n private readonly refillRate: number,\n ) {\n this.tokens = capacity;\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume `count` tokens.\n * Throws `RateLimitError` if insufficient tokens are available.\n */\n consume(count = 1): void {\n this.refill();\n\n if (this.tokens < count) {\n // Calculate when enough tokens will be available\n const deficit = count - this.tokens;\n const waitSeconds = deficit / this.refillRate;\n const retryAfter = new Date(Date.now() + waitSeconds * 1_000);\n throw new RateLimitError(this.providerName, retryAfter);\n }\n\n this.tokens -= count;\n }\n\n /**\n * Returns true if at least `count` tokens are available without consuming them.\n */\n canConsume(count = 1): boolean {\n this.refill();\n return this.tokens >= count;\n }\n\n /** Milliseconds until the bucket has at least `count` tokens. 0 if already available. */\n waitTimeMs(count = 1): number {\n this.refill();\n if (this.tokens >= count) return 0;\n const deficit = count - this.tokens;\n return Math.ceil((deficit / this.refillRate) * 1_000);\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1_000; // seconds\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type { AVDailyAdjBar, AVGlobalQuote, AVOverviewResponse, AVSearchMatch } from \"./types.js\";\n\nconst PROVIDER = \"alpha-vantage\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(raw: AVGlobalQuote, includeRaw?: unknown): Quote {\n const price = Number.parseFloat(raw[\"05. price\"]);\n const open = Number.parseFloat(raw[\"02. open\"]);\n const high = Number.parseFloat(raw[\"03. high\"]);\n const low = Number.parseFloat(raw[\"04. low\"]);\n const previousClose = Number.parseFloat(raw[\"08. previous close\"]);\n const change = Number.parseFloat(raw[\"09. change\"]);\n const changePercent = Number.parseFloat(raw[\"10. change percent\"].replace(\"%\", \"\"));\n const volume = Number.parseInt(raw[\"06. volume\"], 10);\n const latestDay = raw[\"07. latest trading day\"];\n\n return {\n symbol: raw[\"01. symbol\"],\n name: raw[\"01. symbol\"],\n price,\n change,\n changePercent,\n open,\n high,\n low,\n close: price,\n previousClose,\n volume,\n currency: \"USD\", // AV free tier is USD only\n exchange: \"\",\n timestamp: new Date(`${latestDay}T16:00:00-05:00`),\n provider: PROVIDER,\n raw: includeRaw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBars(\n timeSeries: Record<string, AVDailyAdjBar>,\n period1?: Date,\n period2?: Date,\n raw?: unknown,\n): HistoricalBar[] {\n return Object.entries(timeSeries)\n .filter(([dateStr]) => {\n const d = new Date(dateStr);\n if (period1 && d < period1) return false;\n if (period2 && d > period2) return false;\n return true;\n })\n .map(\n ([dateStr, bar]): HistoricalBar => ({\n date: new Date(dateStr),\n open: Number.parseFloat(bar[\"1. open\"]),\n high: Number.parseFloat(bar[\"2. high\"]),\n low: Number.parseFloat(bar[\"3. low\"]),\n close: Number.parseFloat(bar[\"4. close\"]),\n adjClose: Number.parseFloat(bar[\"5. adjusted close\"]),\n volume: Number.parseInt(bar[\"6. volume\"], 10),\n ...(raw !== undefined ? { raw } : {}),\n }),\n )\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst AV_TYPE_MAP: Record<string, AssetType> = {\n equity: \"stock\",\n etf: \"etf\",\n \"mutual fund\": \"mutual-fund\",\n crypto: \"crypto\",\n forex: \"forex\",\n index: \"index\",\n};\n\nexport function transformSearch(match: AVSearchMatch, raw?: unknown): SearchResult {\n const rawType = match[\"3. type\"].toLowerCase();\n return {\n symbol: match[\"1. symbol\"],\n name: match[\"2. name\"],\n type: AV_TYPE_MAP[rawType] ?? \"unknown\",\n exchange: match[\"4. region\"],\n currency: match[\"8. currency\"],\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(data: AVOverviewResponse, raw?: unknown): CompanyProfile {\n return {\n symbol: data.Symbol ?? \"\",\n name: data.Name ?? data.Symbol ?? \"\",\n ...(data.Description ? { description: data.Description } : {}),\n ...(data.Sector ? { sector: data.Sector } : {}),\n ...(data.Industry ? { industry: data.Industry } : {}),\n ...(data.Country ? { country: data.Country } : {}),\n ...(data.FullTimeEmployees ? { employees: Number.parseInt(data.FullTimeEmployees, 10) } : {}),\n ...(data.OfficialSite ? { website: data.OfficialSite } : {}),\n ...(data.MarketCapitalization\n ? { marketCap: Number.parseFloat(data.MarketCapitalization) }\n : {}),\n ...(data.TrailingPE ? { peRatio: Number.parseFloat(data.TrailingPE) } : {}),\n ...(data.ForwardPE ? { forwardPE: Number.parseFloat(data.ForwardPE) } : {}),\n ...(data.PriceToBookRatio ? { priceToBook: Number.parseFloat(data.PriceToBookRatio) } : {}),\n ...(data.DividendYield ? { dividendYield: Number.parseFloat(data.DividendYield) } : {}),\n ...(data.Beta ? { beta: Number.parseFloat(data.Beta) } : {}),\n ...(data.Exchange ? { exchange: data.Exchange } : {}),\n ...(data.Currency ? { currency: data.Currency } : {}),\n ...(data.IPODate ? { ipoDate: new Date(data.IPODate) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError, RateLimitError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformHistoricalBars,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\nimport type {\n AVDailyAdjBar,\n AVGlobalQuoteResponse,\n AVOverviewResponse,\n AVSearchResponse,\n AVTimeSeriesDailyResponse,\n} from \"./types.js\";\n\nexport interface AlphaVantageProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute, 25 calls/day.\n * Premium tier: higher — set refillRate accordingly.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Alpha Vantage provider.\n *\n * Free tier: 25 API calls/day, 5 calls/minute.\n * The rate limiter is enforced client-side to avoid burning your daily quota.\n */\nexport class AlphaVantageProvider implements MarketProvider {\n readonly name = \"alpha-vantage\";\n\n private readonly http: HttpClient;\n private readonly apiKey: string;\n private readonly limiter: RateLimiter;\n\n constructor(options: AlphaVantageProviderOptions) {\n this.apiKey = options.apiKey;\n this.http = new HttpClient(\"alpha-vantage\", {\n baseUrl: \"https://www.alphavantage.co\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n });\n // Default: 5 requests/minute burst capacity\n this.limiter = options.rateLimiter ?? new RateLimiter(\"alpha-vantage\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — uses GLOBAL_QUOTE function\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n // AV only supports single-symbol quote; batch sequentially\n const quotes: Quote[] = [];\n for (const symbol of symbols) {\n this.limiter.consume();\n quotes.push(await this.fetchSingleQuote(symbol, options));\n }\n return quotes;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = normalise(symbol);\n const data = await this.http.get<AVGlobalQuoteResponse>(\"/query\", {\n params: { function: \"GLOBAL_QUOTE\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const gq = data[\"Global Quote\"];\n if (!gq || !gq[\"01. symbol\"]) {\n throw new ProviderError(`No quote data returned for \"${s}\"`, this.name);\n }\n\n return transformQuote(gq, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical — uses TIME_SERIES_DAILY_ADJUSTED\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const outputsize = \"full\"; // always fetch full; filter client-side\n\n const data = await this.http.get<AVTimeSeriesDailyResponse>(\"/query\", {\n params: {\n function: \"TIME_SERIES_DAILY_ADJUSTED\",\n symbol: s,\n outputsize,\n apikey: this.apiKey,\n },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const timeSeries = data[\"Time Series (Daily Adjusted)\"] ?? data[\"Time Series (Daily)\"];\n if (!timeSeries) {\n throw new ProviderError(`No historical data returned for \"${s}\"`, this.name);\n }\n\n const period1 = options?.period1\n ? new Date(options.period1)\n : (() => {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n })();\n const period2 = options?.period2 ? new Date(options.period2) : new Date();\n\n return transformHistoricalBars(\n timeSeries as Record<string, AVDailyAdjBar>,\n period1,\n period2,\n options?.raw ? data : undefined,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — uses SYMBOL_SEARCH\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const data = await this.http.get<AVSearchResponse>(\"/query\", {\n params: { function: \"SYMBOL_SEARCH\", keywords: query, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const limit = options?.limit ?? 10;\n return (data.bestMatches ?? [])\n .slice(0, limit)\n .map((m) => transformSearch(m, options?.raw ? m : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — uses OVERVIEW\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<AVOverviewResponse>(\"/query\", {\n params: { function: \"OVERVIEW\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n if (!data.Symbol) {\n throw new ProviderError(`No company overview returned for \"${s}\"`, this.name);\n }\n\n return transformCompany(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private checkRateLimit(data: Record<string, unknown>): void {\n const info = data[\"Information\"] as string | undefined;\n const note = data[\"Note\"] as string | undefined;\n const msg = info ?? note ?? \"\";\n if (msg.toLowerCase().includes(\"rate limit\") || msg.toLowerCase().includes(\"api call\")) {\n throw new RateLimitError(this.name);\n }\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { EarningsEvent } from \"../../types/earnings.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { NewsItem } from \"../../types/news.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type {\n FinnhubCandlesResponse,\n FinnhubEarningsEntry,\n FinnhubNewsArticle,\n FinnhubProfileResponse,\n FinnhubQuoteResponse,\n FinnhubSearchResult,\n} from \"./types.js\";\n\nconst PROVIDER = \"finnhub\";\n\nexport function transformQuote(\n symbol: string,\n data: FinnhubQuoteResponse,\n raw?: unknown,\n): Quote {\n return {\n symbol: symbol.toUpperCase(),\n name: symbol.toUpperCase(),\n price: data.c,\n change: data.d,\n changePercent: data.dp,\n open: data.o,\n high: data.h,\n low: data.l,\n close: data.c,\n previousClose: data.pc,\n volume: 0,\n currency: \"USD\",\n exchange: \"\",\n timestamp: new Date(data.t * 1000),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformHistorical(\n data: FinnhubCandlesResponse,\n raw?: unknown,\n): HistoricalBar[] {\n if (data.s !== \"ok\") return [];\n\n return data.t.map((timestamp, i) => ({\n date: new Date(timestamp * 1000),\n open: data.o[i] ?? 0,\n high: data.h[i] ?? 0,\n low: data.l[i] ?? 0,\n close: data.c[i] ?? 0,\n volume: data.v[i] ?? 0,\n ...(raw !== undefined ? { raw } : {}),\n }));\n}\n\nexport function transformSearch(result: FinnhubSearchResult, raw?: unknown): SearchResult {\n return {\n symbol: result.displaySymbol,\n name: result.description,\n type: mapType(result.type),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformCompany(data: FinnhubProfileResponse, raw?: unknown): CompanyProfile {\n return {\n symbol: data.ticker,\n name: data.name,\n description: undefined,\n sector: data.gsector || data.finnhubIndustry || undefined,\n industry: data.gind || undefined,\n country: data.country || undefined,\n website: data.weburl || undefined,\n currency: data.currency || undefined,\n exchange: data.exchange || undefined,\n // Finnhub reports marketCap in millions USD\n marketCap: data.marketCapitalization ? data.marketCapitalization * 1_000_000 : undefined,\n ipoDate: data.ipo ? new Date(data.ipo) : undefined,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformNews(article: FinnhubNewsArticle, raw?: unknown): NewsItem {\n return {\n id: String(article.id),\n title: article.headline,\n summary: article.summary || undefined,\n url: article.url,\n source: article.source,\n publishedAt: new Date(article.datetime * 1000),\n symbols: article.related\n ? article.related\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [],\n thumbnail: article.image || undefined,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformEarnings(entry: FinnhubEarningsEntry, raw?: unknown): EarningsEvent {\n return {\n symbol: entry.symbol,\n date: new Date(entry.period),\n period: entry.period,\n ...(entry.actual !== null && entry.actual !== undefined ? { epsActual: entry.actual } : {}),\n ...(entry.estimate !== null && entry.estimate !== undefined\n ? { epsEstimate: entry.estimate }\n : {}),\n ...(entry.surprisePercent !== null && entry.surprisePercent !== undefined\n ? { epsSurprisePct: entry.surprisePercent }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nfunction mapType(type: string): AssetType {\n const t = type.toLowerCase();\n if (t === \"common stock\" || t === \"cs\") return \"stock\";\n if (t === \"etp\" || t.includes(\"etf\")) return \"etf\";\n if (t.includes(\"crypto\")) return \"crypto\";\n if (t.includes(\"forex\") || t.includes(\"currency\")) return \"forex\";\n if (t.includes(\"mutual fund\") || t.includes(\"fund\")) return \"mutual-fund\";\n if (t.includes(\"future\")) return \"future\";\n if (t.includes(\"index\")) return \"index\";\n return \"unknown\";\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { EarningsEvent, EarningsOptions } from \"../../types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { NewsItem, NewsOptions } from \"../../types/news.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformEarnings,\n transformHistorical,\n transformNews,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\nimport type {\n FinnhubCandlesResponse,\n FinnhubEarningsResponse,\n FinnhubNewsArticle,\n FinnhubProfileResponse,\n FinnhubQuoteResponse,\n FinnhubSearchResponse,\n} from \"./types.js\";\n\nexport interface FinnhubProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the default rate limiter.\n * Free tier: 60 API calls/minute.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Finnhub.io provider.\n *\n * Free tier provides real-time US stock market data with a 60 calls/minute limit.\n * API key is required — get one free at https://finnhub.io\n */\nexport class FinnhubProvider implements MarketProvider {\n readonly name = \"finnhub\";\n\n private readonly http: HttpClient;\n private readonly limiter: RateLimiter;\n\n /** API key exposed for WebSocket authentication in `market-feed/ws`. */\n get wsApiKey(): string {\n return this.options.apiKey;\n }\n\n constructor(private readonly options: FinnhubProviderOptions) {\n this.http = new HttpClient(\"finnhub\", {\n baseUrl: \"https://finnhub.io\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: {\n \"X-Finnhub-Token\": options.apiKey,\n Accept: \"application/json\",\n },\n });\n // Free tier: 60 calls/minute = 1 call/second\n this.limiter = options.rateLimiter ?? new RateLimiter(\"finnhub\", 60, 1);\n }\n\n // ---------------------------------------------------------------------------\n // Quote\n // ---------------------------------------------------------------------------\n\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n return Promise.all(symbols.map((s) => this.fetchSingleQuote(s, options)));\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n this.limiter.consume();\n const s = normalise(symbol);\n\n const data = await this.http.get<FinnhubQuoteResponse>(\"/api/v1/quote\", {\n params: { symbol: s },\n });\n\n // c === 0 means no data for this symbol on Finnhub\n if (!data.c) {\n throw new ProviderError(`No quote data for symbol \"${s}\"`, this.name);\n }\n\n return transformQuote(s, data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical (candles)\n // ---------------------------------------------------------------------------\n\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const resolution = toResolution(options?.interval ?? \"1d\");\n const from = toEpoch(options?.period1 ?? subtractOneYear());\n const to = toEpoch(options?.period2 ?? new Date());\n\n const data = await this.http.get<FinnhubCandlesResponse>(\"/api/v1/stock/candle\", {\n params: { symbol: s, resolution, from, to },\n });\n\n if (data.s === \"no_data\") {\n throw new ProviderError(`No historical data for symbol \"${s}\"`, this.name);\n }\n\n return transformHistorical(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<FinnhubSearchResponse>(\"/api/v1/search\", {\n params: { q: query },\n });\n\n return (data.result ?? [])\n .slice(0, limit)\n .map((r) => transformSearch(r, options?.raw ? r : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company\n // ---------------------------------------------------------------------------\n\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n const s = normalise(symbol);\n\n const data = await this.http.get<FinnhubProfileResponse>(\"/api/v1/stock/profile2\", {\n params: { symbol: s },\n });\n\n if (!data.name) {\n throw new ProviderError(`No company data for symbol \"${s}\"`, this.name);\n }\n\n return transformCompany(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // News\n // ---------------------------------------------------------------------------\n\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const to = toDateString(new Date());\n const from = toDateString(subtractDays(new Date(), 30));\n\n const data = await this.http.get<FinnhubNewsArticle[]>(\"/api/v1/company-news\", {\n params: { symbol: s, from, to },\n });\n\n if (!Array.isArray(data)) {\n throw new ProviderError(`Unexpected response for news \"${s}\"`, this.name);\n }\n\n return data\n .slice(0, limit)\n .map((article) => transformNews(article, options?.raw ? article : undefined));\n }\n // ---------------------------------------------------------------------------\n // Earnings\n // ---------------------------------------------------------------------------\n\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<FinnhubEarningsResponse>(\"/api/v1/stock/earnings\", {\n params: { symbol: s, limit },\n });\n\n if (!Array.isArray(data)) {\n throw new ProviderError(`Unexpected earnings response for \"${s}\"`, this.name);\n }\n\n return data.map((entry) => transformEarnings(entry, options?.raw ? entry : undefined));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toResolution(interval: string): string {\n const map: Record<string, string> = {\n \"1m\": \"1\",\n \"2m\": \"1\",\n \"5m\": \"5\",\n \"15m\": \"15\",\n \"30m\": \"30\",\n \"60m\": \"60\",\n \"90m\": \"60\",\n \"1h\": \"60\",\n \"1d\": \"D\",\n \"5d\": \"D\",\n \"1wk\": \"W\",\n \"1mo\": \"M\",\n \"3mo\": \"M\",\n };\n return map[interval] ?? \"D\";\n}\n\nfunction toEpoch(date: string | Date): number {\n const d = date instanceof Date ? date : new Date(date);\n return Math.floor(d.getTime() / 1_000);\n}\n\nfunction toDateString(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n\nfunction subtractDays(date: Date, days: number): Date {\n const d = new Date(date);\n d.setDate(d.getDate() - days);\n return d;\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendFrequency } from \"../../types/dividends.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { NewsItem } from \"../../types/news.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent } from \"../../types/splits.js\";\nimport type {\n PolygonAggBar,\n PolygonDividend,\n PolygonNewsArticle,\n PolygonSnapshotTicker,\n PolygonSplit,\n PolygonTicker,\n PolygonTickerDetails,\n} from \"./types.js\";\n\nconst PROVIDER = \"polygon\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(ticker: PolygonSnapshotTicker, raw?: unknown): Quote {\n const day = ticker.day;\n const prev = ticker.prevDay;\n const price = ticker.lastTrade?.p ?? day.c;\n\n return {\n symbol: ticker.ticker,\n name: ticker.ticker,\n price,\n change: ticker.todaysChange,\n changePercent: ticker.todaysChangePerc,\n open: day.o,\n high: day.h,\n low: day.l,\n close: day.c,\n previousClose: prev.c,\n volume: day.v,\n currency: \"USD\",\n exchange: \"\",\n timestamp: new Date(ticker.updated / 1_000_000), // nanoseconds → ms\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBar(bar: PolygonAggBar, raw?: unknown): HistoricalBar {\n return {\n date: new Date(bar.t),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst POLYGON_TYPE_MAP: Record<string, AssetType> = {\n CS: \"stock\",\n ETF: \"etf\",\n ETN: \"etf\",\n ETP: \"etf\",\n CRYPTO: \"crypto\",\n FX: \"forex\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MF: \"mutual-fund\",\n FUND: \"mutual-fund\",\n WARRANT: \"unknown\",\n RIGHT: \"unknown\",\n ADRC: \"stock\",\n PFD: \"stock\",\n};\n\nexport function transformSearch(ticker: PolygonTicker, raw?: unknown): SearchResult {\n const type = ticker.type ? (POLYGON_TYPE_MAP[ticker.type.toUpperCase()] ?? \"unknown\") : \"unknown\";\n return {\n symbol: ticker.ticker,\n name: ticker.name,\n type,\n ...(ticker.primary_exchange ? { exchange: ticker.primary_exchange } : {}),\n ...(ticker.currency_name ? { currency: ticker.currency_name.toUpperCase() } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(details: PolygonTickerDetails, raw?: unknown): CompanyProfile {\n return {\n symbol: details.ticker,\n name: details.name,\n ...(details.description ? { description: details.description } : {}),\n ...(details.sic_description ? { sector: details.sic_description } : {}),\n ...(details.address?.country ? { country: details.address.country } : {}),\n ...(details.total_employees !== undefined ? { employees: details.total_employees } : {}),\n ...(details.homepage_url ? { website: details.homepage_url } : {}),\n ...(details.market_cap !== undefined ? { marketCap: details.market_cap } : {}),\n ...(details.primary_exchange ? { exchange: details.primary_exchange } : {}),\n ...(details.list_date ? { ipoDate: new Date(details.list_date) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Dividends\n// ---------------------------------------------------------------------------\nfunction toFrequency(n?: number): DividendFrequency | undefined {\n switch (n) {\n case 1:\n return \"annual\";\n case 2:\n return \"semi-annual\";\n case 4:\n return \"quarterly\";\n case 12:\n return \"monthly\";\n default:\n return n !== undefined ? \"irregular\" : undefined;\n }\n}\n\nexport function transformDividend(dividend: PolygonDividend, raw?: unknown): DividendEvent {\n const freq = toFrequency(dividend.frequency);\n return {\n symbol: dividend.ticker,\n exDate: new Date(dividend.ex_dividend_date),\n ...(dividend.pay_date !== undefined ? { payDate: new Date(dividend.pay_date) } : {}),\n ...(dividend.declaration_date !== undefined\n ? { declaredDate: new Date(dividend.declaration_date) }\n : {}),\n amount: dividend.cash_amount,\n currency: dividend.currency ?? \"USD\",\n ...(freq !== undefined ? { frequency: freq } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Splits\n// ---------------------------------------------------------------------------\nexport function transformSplit(split: PolygonSplit, raw?: unknown): SplitEvent {\n return {\n symbol: split.ticker,\n date: new Date(split.execution_date),\n ratio: split.split_from > 0 ? split.split_to / split.split_from : split.split_to,\n description: `${split.split_to}:${split.split_from}`,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// News\n// ---------------------------------------------------------------------------\nexport function transformNews(article: PolygonNewsArticle, raw?: unknown): NewsItem {\n return {\n id: article.id,\n title: article.title,\n ...(article.description ? { summary: article.description } : {}),\n url: article.article_url,\n source: article.publisher?.name ?? \"unknown\",\n publishedAt: new Date(article.published_utc),\n symbols: article.tickers ?? [],\n ...(article.image_url ? { thumbnail: article.image_url } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"../../types/dividends.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { NewsItem, NewsOptions } from \"../../types/news.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"../../types/splits.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformDividend,\n transformHistoricalBar,\n transformNews,\n transformQuote,\n transformSearch,\n transformSplit,\n} from \"./transform.js\";\nimport type {\n PolygonAggregatesResponse,\n PolygonDividendsResponse,\n PolygonNewsResponse,\n PolygonSnapshotResponse,\n PolygonSplitsResponse,\n PolygonTickerDetailsResponse,\n PolygonTickersResponse,\n} from \"./types.js\";\n\nexport interface PolygonProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute. Unlimited for paid plans.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Polygon.io provider.\n *\n * Free tier provides 15-minute delayed data with 5 API calls per minute.\n * Paid plans unlock real-time data and higher rate limits.\n */\nexport class PolygonProvider implements MarketProvider {\n readonly name = \"polygon\";\n\n private readonly http: HttpClient;\n private readonly limiter: RateLimiter;\n\n /** API key exposed for WebSocket authentication in `market-feed/ws`. */\n get wsApiKey(): string {\n return this.options.apiKey;\n }\n\n constructor(private readonly options: PolygonProviderOptions) {\n this.http = new HttpClient(\"polygon\", {\n baseUrl: \"https://api.polygon.io\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: { Authorization: `Bearer ${options.apiKey}` },\n });\n // Free tier: 5 calls/minute\n this.limiter = options.rateLimiter ?? new RateLimiter(\"polygon\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — snapshot endpoint\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n this.limiter.consume();\n\n const tickers = symbols.map(normalise).join(\",\");\n const data = await this.http.get<PolygonSnapshotResponse>(\n `/v2/snapshot/locale/us/markets/stocks/tickers`,\n { params: { tickers, apiKey: this.options.apiKey } },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n const tickerList = data.tickers ?? (data.ticker ? [data.ticker] : []);\n if (tickerList.length === 0) {\n throw new ProviderError(`No snapshot data for \"${tickers}\"`, this.name);\n }\n\n return tickerList.map((t) => transformQuote(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Historical — aggregates endpoint\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const interval = options?.interval ?? \"1d\";\n const { multiplier, timespan } = parseInterval(interval);\n\n const period1 = toDateString(options?.period1 ?? subtractOneYear());\n const period2 = toDateString(options?.period2 ?? new Date());\n\n const data = await this.http.get<PolygonAggregatesResponse>(\n `/v2/aggs/ticker/${s}/range/${multiplier}/${timespan}/${period1}/${period2}`,\n {\n params: {\n adjusted: true,\n sort: \"asc\",\n limit: 50000,\n apiKey: this.options.apiKey,\n },\n },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((bar) =>\n transformHistoricalBar(bar, options?.raw ? bar : undefined),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — reference tickers endpoint\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const limit = options?.limit ?? 10;\n const data = await this.http.get<PolygonTickersResponse>(\"/v3/reference/tickers\", {\n params: {\n search: query,\n active: true,\n limit,\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((t) => transformSearch(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — ticker details v3\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<PolygonTickerDetailsResponse>(`/v3/reference/tickers/${s}`, {\n params: { apiKey: this.options.apiKey },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n if (!data.results) {\n throw new ProviderError(`No company data for \"${s}\"`, this.name);\n }\n\n return transformCompany(data.results, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // News — ticker news endpoint\n // ---------------------------------------------------------------------------\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<PolygonNewsResponse>(\"/v2/reference/news\", {\n params: {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"published_utc\",\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((a) => transformNews(a, options?.raw ? a : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Dividends\n // ---------------------------------------------------------------------------\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 50;\n const params: Record<string, string | number | boolean> = {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"ex_dividend_date\",\n apiKey: this.options.apiKey,\n };\n if (options?.from) params[\"ex_dividend_date.gte\"] = toDateString(new Date(options.from as string));\n if (options?.to) params[\"ex_dividend_date.lte\"] = toDateString(new Date(options.to as string));\n\n const data = await this.http.get<PolygonDividendsResponse>(\"/v3/reference/dividends\", {\n params,\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((d) => transformDividend(d, options?.raw ? d : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Splits\n // ---------------------------------------------------------------------------\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 50;\n const params: Record<string, string | number | boolean> = {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"execution_date\",\n apiKey: this.options.apiKey,\n };\n if (options?.from) params[\"execution_date.gte\"] = toDateString(new Date(options.from as string));\n if (options?.to) params[\"execution_date.lte\"] = toDateString(new Date(options.to as string));\n\n const data = await this.http.get<PolygonSplitsResponse>(\"/v3/reference/splits\", {\n params,\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((s) => transformSplit(s, options?.raw ? s : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private assertSuccess(response: { status: string; error?: string }): void {\n if (response.status === \"ERROR\" || response.error) {\n throw new ProviderError(\n response.error ?? `Polygon returned status \"${response.status}\"`,\n this.name,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interval parsing helpers\n// ---------------------------------------------------------------------------\nfunction parseInterval(interval: string): { multiplier: number; timespan: string } {\n const map: Record<string, { multiplier: number; timespan: string }> = {\n \"1m\": { multiplier: 1, timespan: \"minute\" },\n \"2m\": { multiplier: 2, timespan: \"minute\" },\n \"5m\": { multiplier: 5, timespan: \"minute\" },\n \"15m\": { multiplier: 15, timespan: \"minute\" },\n \"30m\": { multiplier: 30, timespan: \"minute\" },\n \"60m\": { multiplier: 60, timespan: \"minute\" },\n \"1h\": { multiplier: 1, timespan: \"hour\" },\n \"1d\": { multiplier: 1, timespan: \"day\" },\n \"5d\": { multiplier: 5, timespan: \"day\" },\n \"1wk\": { multiplier: 1, timespan: \"week\" },\n \"1mo\": { multiplier: 1, timespan: \"month\" },\n \"3mo\": { multiplier: 3, timespan: \"month\" },\n };\n return map[interval] ?? { multiplier: 1, timespan: \"day\" };\n}\n\nfunction toDateString(date: string | Date): string {\n const d = date instanceof Date ? date : new Date(date);\n return d.toISOString().slice(0, 10);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n","/**\n * market-feed CLI\n *\n * Usage: market-feed <command> [options]\n * Run `market-feed --help` for full usage.\n */\nimport { MarketFeed } from \"../client.js\";\nimport { AlphaVantageProvider } from \"../providers/alpha-vantage/index.js\";\nimport { FinnhubProvider } from \"../providers/finnhub/index.js\";\nimport { PolygonProvider } from \"../providers/polygon/index.js\";\nimport { YahooProvider } from \"../providers/yahoo/index.js\";\n\nconst HELP = `\nUsage: market-feed <command> [options]\n\nCommands:\n quote <symbol...> Fetch real-time quote(s)\n historical <symbol> Fetch OHLCV history\n search <query> Search for symbols\n company <symbol> Fetch company profile\n news <symbol> Fetch recent news\n\nOptions:\n --av-key <key> Alpha Vantage API key\n --polygon-key <key> Polygon.io API key\n --finnhub-key <key> Finnhub API key\n --json Output raw JSON\n --limit <n> Limit results (default: 10)\n --interval <i> Historical interval: 1m 5m 15m 30m 1h 1d 1wk 1mo (default: 1d)\n --period1 <date> Historical start date (ISO 8601)\n --period2 <date> Historical end date (ISO 8601)\n -h, --help Show this help message\n\nExamples:\n market-feed quote AAPL MSFT GOOGL\n market-feed historical AAPL --interval 1wk --period1 2024-01-01\n market-feed search \"apple inc\"\n market-feed company AAPL --json\n market-feed news AAPL --limit 5\n`.trim();\n\ninterface CliArgs {\n command: string;\n positionals: string[];\n json: boolean;\n avKey?: string;\n polygonKey?: string;\n finnhubKey?: string;\n limit: number;\n interval: string;\n period1?: string;\n period2?: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args = argv.slice(2);\n const result: CliArgs = {\n command: \"\",\n positionals: [],\n json: false,\n limit: 10,\n interval: \"1d\",\n };\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i]!;\n if (arg === \"--json\") {\n result.json = true;\n i++;\n } else if (arg === \"-h\" || arg === \"--help\") {\n result.command = \"help\";\n i++;\n } else if (arg === \"--av-key\") {\n result.avKey = args[++i];\n i++;\n } else if (arg === \"--polygon-key\") {\n result.polygonKey = args[++i];\n i++;\n } else if (arg === \"--finnhub-key\") {\n result.finnhubKey = args[++i];\n i++;\n } else if (arg === \"--limit\") {\n result.limit = Number(args[++i]) || 10;\n i++;\n } else if (arg === \"--interval\") {\n result.interval = args[++i] ?? \"1d\";\n i++;\n } else if (arg === \"--period1\") {\n result.period1 = args[++i];\n i++;\n } else if (arg === \"--period2\") {\n result.period2 = args[++i];\n i++;\n } else if (!arg.startsWith(\"-\") && !result.command) {\n result.command = arg;\n i++;\n } else if (!arg.startsWith(\"-\")) {\n result.positionals.push(arg);\n i++;\n } else {\n i++;\n }\n }\n return result;\n}\n\nfunction buildFeed(args: CliArgs): MarketFeed {\n const providers: InstanceType<typeof YahooProvider | typeof AlphaVantageProvider | typeof PolygonProvider | typeof FinnhubProvider>[] = [\n new YahooProvider(),\n ];\n if (args.avKey) providers.push(new AlphaVantageProvider({ apiKey: args.avKey }));\n if (args.polygonKey) providers.push(new PolygonProvider({ apiKey: args.polygonKey }));\n if (args.finnhubKey) providers.push(new FinnhubProvider({ apiKey: args.finnhubKey }));\n return new MarketFeed({ providers });\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction pad(s: string, n: number): string {\n const str = String(s);\n return str.length >= n ? str.slice(0, n) : str + \" \".repeat(n - str.length);\n}\n\nfunction fmtNum(n: number, decimals = 2): string {\n return n.toFixed(decimals);\n}\n\nfunction fmtChange(change: number, changePct: number): string {\n const sign = change >= 0 ? \"+\" : \"\";\n return `${sign}${fmtNum(change)} (${sign}${fmtNum(changePct)}%)`;\n}\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nasync function runQuote(feed: MarketFeed, symbols: string[], asJson: boolean): Promise<void> {\n const quotes = await feed.quote(symbols);\n if (asJson) {\n console.log(JSON.stringify(quotes, null, 2));\n return;\n }\n console.log(\n `${pad(\"Symbol\", 8)} ${pad(\"Price\", 10)} ${pad(\"Change\", 24)} ${pad(\"Volume\", 14)} Provider`,\n );\n console.log(\"-\".repeat(72));\n for (const q of quotes) {\n console.log(\n `${pad(q.symbol, 8)} ${pad(fmtNum(q.price), 10)} ${pad(fmtChange(q.change, q.changePercent), 24)} ${pad(q.volume.toLocaleString(), 14)} ${q.provider}`,\n );\n }\n}\n\nasync function runHistorical(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const bars = await feed.historical(symbol, {\n interval: args.interval as \"1d\",\n ...(args.period1 ? { period1: args.period1 } : {}),\n ...(args.period2 ? { period2: args.period2 } : {}),\n });\n if (args.json) {\n console.log(JSON.stringify(bars, null, 2));\n return;\n }\n console.log(\n `${pad(\"Date\", 12)} ${pad(\"Open\", 10)} ${pad(\"High\", 10)} ${pad(\"Low\", 10)} ${pad(\"Close\", 10)} Volume`,\n );\n console.log(\"-\".repeat(68));\n for (const b of bars.slice(-args.limit)) {\n console.log(\n `${pad(b.date.toISOString().slice(0, 10), 12)} ${pad(fmtNum(b.open), 10)} ${pad(fmtNum(b.high), 10)} ${pad(fmtNum(b.low), 10)} ${pad(fmtNum(b.close), 10)} ${b.volume.toLocaleString()}`,\n );\n }\n}\n\nasync function runSearch(feed: MarketFeed, query: string, args: CliArgs): Promise<void> {\n const results = await feed.search(query, { limit: args.limit });\n if (args.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n console.log(`${pad(\"Symbol\", 10)} ${pad(\"Name\", 36)} ${pad(\"Type\", 12)} Exchange`);\n console.log(\"-\".repeat(72));\n for (const r of results) {\n console.log(\n `${pad(r.symbol, 10)} ${pad(r.name, 36)} ${pad(r.type, 12)} ${r.exchange ?? \"\"}`,\n );\n }\n}\n\nasync function runCompany(feed: MarketFeed, symbol: string, asJson: boolean): Promise<void> {\n const profile = await feed.company(symbol);\n if (asJson) {\n console.log(JSON.stringify(profile, null, 2));\n return;\n }\n console.log(`\\n ${profile.name} (${profile.symbol})`);\n if (profile.sector) console.log(` Sector: ${profile.sector}`);\n if (profile.industry) console.log(` Industry: ${profile.industry}`);\n if (profile.country) console.log(` Country: ${profile.country}`);\n if (profile.employees) console.log(` Employees: ${profile.employees.toLocaleString()}`);\n if (profile.marketCap) console.log(` Mkt Cap: $${(profile.marketCap / 1e9).toFixed(2)}B`);\n if (profile.peRatio) console.log(` P/E: ${profile.peRatio.toFixed(2)}`);\n if (profile.website) console.log(` Website: ${profile.website}`);\n console.log(` Provider: ${profile.provider}\\n`);\n}\n\nasync function runNews(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const news = await feed.news(symbol, { limit: args.limit });\n if (args.json) {\n console.log(JSON.stringify(news, null, 2));\n return;\n }\n console.log(\"\");\n for (const item of news) {\n const date = item.publishedAt.toISOString().slice(0, 10);\n console.log(` [${date}] ${item.title}`);\n console.log(` ${item.source} — ${item.url}`);\n if (item.summary) {\n const excerpt = item.summary.length > 100 ? `${item.summary.slice(0, 100)}…` : item.summary;\n console.log(` ${excerpt}`);\n }\n console.log(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (!args.command || args.command === \"help\") {\n console.log(HELP);\n process.exit(0);\n }\n\n const feed = buildFeed(args);\n\n try {\n switch (args.command) {\n case \"quote\": {\n const symbols = args.positionals;\n if (symbols.length === 0) {\n console.error(\"Error: quote requires at least one symbol\\n\");\n process.exit(1);\n }\n await runQuote(feed, symbols, args.json);\n break;\n }\n case \"historical\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: historical requires a symbol\\n\");\n process.exit(1);\n }\n await runHistorical(feed, symbol, args);\n break;\n }\n case \"search\": {\n const query = args.positionals.join(\" \");\n if (!query) {\n console.error(\"Error: search requires a query string\\n\");\n process.exit(1);\n }\n await runSearch(feed, query, args);\n break;\n }\n case \"company\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: company requires a symbol\\n\");\n process.exit(1);\n }\n await runCompany(feed, symbol, args.json);\n break;\n }\n case \"news\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: news requires a symbol\\n\");\n process.exit(1);\n }\n await runNews(feed, symbol, args);\n break;\n }\n default: {\n console.error(`Unknown command: \"${args.command}\"\\n`);\n console.log(HELP);\n process.exit(1);\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n}\n\n// Guard against running when imported in tests\nif (!process.env[\"VITEST\"]) {\n main().catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n });\n}\n\n// Export parseArgs for unit testing\nexport { parseArgs };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache/memory.ts","../src/errors.ts","../src/http/client.ts","../src/utils/symbol.ts","../src/providers/yahoo/transform.ts","../src/providers/yahoo/index.ts","../src/client.ts","../src/utils/rate-limiter.ts","../src/providers/alpha-vantage/transform.ts","../src/providers/alpha-vantage/index.ts","../src/providers/finnhub/transform.ts","../src/providers/finnhub/index.ts","../src/providers/polygon/transform.ts","../src/providers/polygon/index.ts","../src/cli/index.ts"],"names":["PROVIDER","transformQuote","transformSearch","transformCompany","transformHistorical","transformEarnings","toEpoch","subtractOneYear","transformNews","toDateString","s"],"mappings":"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","file":"cli.js","sourcesContent":["import type { CacheDriver } from \"./types.js\";\n\ninterface Entry<T> {\n value: T;\n expiresAt: number; // epoch ms, 0 = no expiry\n}\n\n/**\n * A simple LRU (Least-Recently-Used) in-memory cache with TTL support.\n * No dependencies — uses a Map for O(1) access and insertion-order eviction.\n */\nexport class MemoryCacheDriver implements CacheDriver {\n private readonly store = new Map<string, Entry<unknown>>();\n private readonly maxSize: number;\n\n constructor(maxSize = 500) {\n this.maxSize = maxSize;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key) as Entry<T> | undefined;\n if (!entry) return undefined;\n\n // Evict expired entries on read\n if (entry.expiresAt !== 0 && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n\n // LRU: move to end (most recently used)\n this.store.delete(key);\n this.store.set(key, entry);\n\n return entry.value;\n }\n\n async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {\n // Evict the oldest entry if at capacity\n if (this.store.size >= this.maxSize && !this.store.has(key)) {\n const oldest = this.store.keys().next().value;\n if (oldest !== undefined) {\n this.store.delete(oldest);\n }\n }\n\n const expiresAt =\n ttlSeconds !== undefined && ttlSeconds > 0 ? Date.now() + ttlSeconds * 1_000 : 0;\n\n this.store.set(key, { value, expiresAt });\n }\n\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n /** Current number of cached entries (including potentially expired ones). */\n get size(): number {\n return this.store.size;\n }\n}\n","/**\n * Base error class for all market-feed errors.\n * Includes the provider name so callers can identify the source.\n */\nexport class MarketFeedError extends Error {\n constructor(\n message: string,\n public readonly provider: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"MarketFeedError\";\n // Maintain correct prototype chain in transpiled output\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when an upstream provider returns an HTTP error or unexpected payload.\n */\nexport class ProviderError extends MarketFeedError {\n constructor(\n message: string,\n provider: string,\n public readonly statusCode?: number,\n cause?: unknown,\n ) {\n super(message, provider, cause);\n this.name = \"ProviderError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a provider's rate limit is reached.\n * Contains the earliest time the caller may retry.\n */\nexport class RateLimitError extends MarketFeedError {\n constructor(\n provider: string,\n public readonly retryAfter?: Date,\n ) {\n const when = retryAfter ? ` Retry after ${retryAfter.toISOString()}.` : \"\";\n super(`Rate limit reached for provider \"${provider}\".${when}`, provider);\n this.name = \"RateLimitError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when all configured providers have failed for a given operation.\n */\nexport class AllProvidersFailedError extends Error {\n constructor(\n public readonly errors: MarketFeedError[],\n operation: string,\n ) {\n const summary = errors.map((e) => `[${e.provider}] ${e.message}`).join(\"; \");\n super(`All providers failed for \"${operation}\": ${summary}`);\n this.name = \"AllProvidersFailedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a required feature is not supported by the active provider.\n */\nexport class UnsupportedOperationError extends MarketFeedError {\n constructor(provider: string, operation: string) {\n super(`Provider \"${provider}\" does not support \"${operation}\".`, provider);\n this.name = \"UnsupportedOperationError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { ProviderError } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n /** Base URL prepended to every request path */\n baseUrl?: string;\n /** Default headers merged into every request */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Number of retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /** Initial backoff in milliseconds for exponential retry. Defaults to 300. */\n retryDelayMs?: number;\n}\n\nexport interface RequestOptions {\n params?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n timeoutMs?: number;\n}\n\n/** HTTP status codes that are safe to retry */\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction buildUrl(\n base: string,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n): string {\n const url = new URL(path, base.endsWith(\"/\") ? base : `${base}/`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly retryDelayMs: number;\n\n constructor(\n private readonly providerName: string,\n options: HttpClientOptions = {},\n ) {\n this.baseUrl = options.baseUrl ?? \"\";\n this.defaultHeaders = {\n Accept: \"application/json\",\n \"User-Agent\": \"market-feed/0.1.0 (+https://github.com/piyushgupta344/market-feed)\",\n ...options.headers,\n };\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.retries = options.retries ?? 2;\n this.retryDelayMs = options.retryDelayMs ?? 300;\n }\n\n async get<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = buildUrl(this.baseUrl, path, options.params);\n const headers = { ...this.defaultHeaders, ...options.headers };\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n // Exponential backoff: 300ms, 600ms, 1200ms...\n await sleep(this.retryDelayMs * 2 ** (attempt - 1));\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n if (RETRYABLE_STATUSES.has(response.status) && attempt < this.retries) {\n lastError = new ProviderError(\n `HTTP ${response.status} from ${url}`,\n this.providerName,\n response.status,\n );\n continue;\n }\n throw new ProviderError(\n `HTTP ${response.status} ${response.statusText} from ${url}`,\n this.providerName,\n response.status,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\") && !contentType.includes(\"text/plain\")) {\n // Some financial APIs return JSON with a non-standard content-type\n }\n\n return (await response.json()) as T;\n } catch (err) {\n clearTimeout(timer);\n\n if (err instanceof ProviderError) {\n throw err;\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ProviderError(\n `Request to ${url} timed out after ${timeoutMs}ms`,\n this.providerName,\n );\n }\n\n if (attempt < this.retries) {\n lastError = err;\n continue;\n }\n\n throw new ProviderError(\n `Network error fetching ${url}: ${err instanceof Error ? err.message : String(err)}`,\n this.providerName,\n undefined,\n err,\n );\n }\n }\n\n throw new ProviderError(\n `Failed after ${this.retries + 1} attempts`,\n this.providerName,\n undefined,\n lastError,\n );\n }\n}\n","/**\n * Normalise a ticker symbol for use with a specific provider.\n *\n * Different providers use slightly different conventions:\n * - Yahoo Finance: \"BRK-B\", \"BTC-USD\"\n * - Alpha Vantage: \"BRKB\", \"BTCUSD\" (no separator for crypto pairs)\n * - Polygon.io: \"BRK/B\", \"X:BTCUSD\"\n */\n\n/** Strip exchange suffixes like \".NASDAQ\" or \".NYSE\" */\nexport function stripExchange(symbol: string): string {\n return symbol.split(\".\")[0] ?? symbol;\n}\n\n/** Upper-case and trim a symbol */\nexport function normalise(symbol: string): string {\n return symbol.trim().toUpperCase();\n}\n\n/** Convert \"BTC/USD\" or \"BTCUSD\" → \"BTC-USD\" (Yahoo style) */\nexport function toYahooSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n // \"BTC/USD\" → \"BTC-USD\"\n if (s.includes(\"/\")) return s.replace(\"/\", \"-\");\n return s;\n}\n\n/** Convert \"BTC-USD\" → \"BTCUSD\" (Alpha Vantage style for some endpoints) */\nexport function toAlphaVantageSymbol(symbol: string): string {\n return normalise(stripExchange(symbol)).replace(/[-/]/g, \"\");\n}\n\n/** Convert \"BTC-USD\" → \"X:BTCUSD\" for Polygon crypto, else leave as-is */\nexport function toPolygonSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n if (s.includes(\"-\")) {\n const [base, quote] = s.split(\"-\");\n if (base && quote && quote.length === 3) {\n // Likely a crypto pair\n return `X:${base}${quote}`;\n }\n }\n return s;\n}\n\n/** Deduplicate and normalise an array of symbols */\nexport function dedupeSymbols(symbols: string[]): string[] {\n return [...new Set(symbols.map(normalise))];\n}\n\n// ---------------------------------------------------------------------------\n// Asset-class detection\n// ---------------------------------------------------------------------------\n\n/**\n * Well-known crypto base currencies.\n * Used to distinguish BTC/USD (crypto) from EUR/USD (forex) in slash-separated pairs.\n */\nconst KNOWN_CRYPTO_BASES = new Set([\n \"BTC\", \"ETH\", \"ADA\", \"SOL\", \"XRP\", \"DOGE\", \"DOT\", \"AVAX\", \"MATIC\", \"LINK\",\n \"LTC\", \"BCH\", \"UNI\", \"ATOM\", \"BNB\", \"TRX\", \"SHIB\", \"NEAR\", \"APT\", \"ARB\",\n]);\n\n/** Quote currencies that, combined with a known crypto base, confirm a crypto pair */\nconst CRYPTO_QUOTE_CURRENCIES = new Set([\n \"USD\", \"EUR\", \"BTC\", \"ETH\", \"USDT\", \"USDC\", \"GBP\", \"BUSD\",\n]);\n\n/**\n * Returns `true` if the symbol looks like a cryptocurrency pair.\n *\n * Handles:\n * - Yahoo-style: \"BTC-USD\", \"ETH-USD\"\n * - Slash-style: \"BTC/USD\", \"ETH/BTC\"\n * - Polygon-style: \"X:BTCUSD\"\n */\nexport function isCrypto(symbol: string): boolean {\n const s = normalise(symbol);\n if (s.startsWith(\"X:\")) return true; // Polygon crypto prefix\n if (s.includes(\"/\")) {\n const [base, quote] = s.split(\"/\");\n return (\n KNOWN_CRYPTO_BASES.has(base ?? \"\") && CRYPTO_QUOTE_CURRENCIES.has(quote ?? \"\")\n );\n }\n if (s.includes(\"-\") && !s.endsWith(\"=X\")) {\n const [base, quote] = s.split(\"-\");\n return (\n (KNOWN_CRYPTO_BASES.has(base ?? \"\") || (quote?.length === 3 && KNOWN_CRYPTO_BASES.has(base ?? \"\"))) &&\n CRYPTO_QUOTE_CURRENCIES.has(quote ?? \"\")\n );\n }\n return false;\n}\n\n/**\n * Returns `true` if the symbol looks like a forex pair.\n *\n * Handles:\n * - Yahoo-style: \"EURUSD=X\", \"GBPUSD=X\"\n * - Polygon-style: \"C:EURUSD\"\n * - OANDA-style: \"OANDA:EUR_USD\"\n * - Standard: \"EUR/USD\", \"GBP/JPY\" (when not also a crypto pair)\n */\nexport function isForex(symbol: string): boolean {\n const s = normalise(symbol);\n if (s.startsWith(\"C:\")) return true; // Polygon forex prefix\n if (s.startsWith(\"OANDA:\")) return true; // OANDA format\n if (/^[A-Z]{6}=X$/.test(s)) return true; // Yahoo forex (e.g. \"EURUSD=X\")\n // Standard three-letter pair — only if not already classified as crypto\n if (/^[A-Z]{3}\\/[A-Z]{3}$/.test(s) && !isCrypto(s)) return true;\n return false;\n}\n\n/**\n * Convert a symbol to Finnhub format.\n * Finnhub uses plain uppercase tickers for US stocks (e.g. \"AAPL\").\n */\nexport function toFinnhubSymbol(symbol: string): string {\n return normalise(stripExchange(symbol));\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent } from \"../../types/dividends.js\";\nimport type { EarningsEvent } from \"../../types/earnings.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { SearchResult } from \"../../types/search.js\";\nimport type { AssetType } from \"../../types/search.js\";\nimport type { SplitEvent } from \"../../types/splits.js\";\nimport type { YahooChartResult, YahooQuoteSummaryResult, YahooSearchQuote } from \"./types.js\";\n\nconst PROVIDER = \"yahoo\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(result: YahooChartResult, raw?: unknown): Quote {\n const meta = result.meta;\n\n return {\n symbol: meta.symbol,\n name: meta.symbol, // Yahoo chart API doesn't return company name — enriched separately\n price: meta.regularMarketPrice,\n change: meta.regularMarketPrice - meta.regularMarketPreviousClose,\n changePercent:\n ((meta.regularMarketPrice - meta.regularMarketPreviousClose) /\n meta.regularMarketPreviousClose) *\n 100,\n open: meta.regularMarketDayHigh, // chart meta has dayHigh/Low not open — see below\n high: meta.regularMarketDayHigh,\n low: meta.regularMarketDayLow,\n close: meta.regularMarketPrice,\n previousClose: meta.regularMarketPreviousClose,\n volume: meta.regularMarketVolume,\n ...(meta.fiftyTwoWeekHigh !== undefined ? { fiftyTwoWeekHigh: meta.fiftyTwoWeekHigh } : {}),\n ...(meta.fiftyTwoWeekLow !== undefined ? { fiftyTwoWeekLow: meta.fiftyTwoWeekLow } : {}),\n currency: meta.currency,\n exchange: meta.fullExchangeName ?? meta.exchangeName,\n timestamp: new Date(meta.regularMarketTime * 1_000),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistorical(result: YahooChartResult, raw?: unknown): HistoricalBar[] {\n const timestamps = result.timestamp ?? [];\n const quoteIndicators = result.indicators.quote[0];\n const adjCloseIndicators = result.indicators.adjclose?.[0];\n\n if (!quoteIndicators) return [];\n\n return timestamps\n .map((ts, i) => {\n const open = quoteIndicators.open[i];\n const high = quoteIndicators.high[i];\n const low = quoteIndicators.low[i];\n const close = quoteIndicators.close[i];\n const volume = quoteIndicators.volume[i];\n const adjClose = adjCloseIndicators?.adjclose[i];\n\n // Skip bars with null/undefined OHLCV (Yahoo returns nulls for non-trading days)\n // Using == null to catch both null and undefined (noUncheckedIndexedAccess)\n if (open == null || high == null || low == null || close == null || volume == null) {\n return null;\n }\n\n const bar: HistoricalBar = {\n date: new Date(ts * 1_000),\n open,\n high,\n low,\n close,\n volume,\n ...(adjClose !== null && adjClose !== undefined ? { adjClose } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n\n return bar;\n })\n .filter((bar): bar is HistoricalBar => bar !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(\n symbol: string,\n result: YahooQuoteSummaryResult,\n raw?: unknown,\n): CompanyProfile {\n const profile = result.assetProfile;\n const summary = result.summaryDetail;\n const price = result.price;\n\n const officers = profile?.companyOfficers ?? [];\n const ceo = officers.find((o) => (o.title ?? \"\").toLowerCase().includes(\"chief executive\"))?.name;\n\n return {\n symbol,\n name: price?.longName ?? price?.shortName ?? symbol,\n ...(profile?.longBusinessSummary !== undefined\n ? { description: profile.longBusinessSummary }\n : {}),\n ...(profile?.sector !== undefined ? { sector: profile.sector } : {}),\n ...(profile?.industry !== undefined ? { industry: profile.industry } : {}),\n ...(profile?.country !== undefined ? { country: profile.country } : {}),\n ...(profile?.fullTimeEmployees !== undefined ? { employees: profile.fullTimeEmployees } : {}),\n ...(profile?.website !== undefined ? { website: profile.website } : {}),\n ...(ceo !== undefined ? { ceo } : {}),\n ...(summary?.marketCap?.raw !== undefined ? { marketCap: summary.marketCap.raw } : {}),\n ...(summary?.trailingPE?.raw !== undefined ? { peRatio: summary.trailingPE.raw } : {}),\n ...(summary?.forwardPE?.raw !== undefined ? { forwardPE: summary.forwardPE.raw } : {}),\n ...(summary?.priceToBook?.raw !== undefined ? { priceToBook: summary.priceToBook.raw } : {}),\n ...(summary?.dividendYield?.raw !== undefined\n ? { dividendYield: summary.dividendYield.raw }\n : {}),\n ...(summary?.beta?.raw !== undefined ? { beta: summary.beta.raw } : {}),\n ...(price?.exchangeName !== undefined ? { exchange: price.exchangeName } : {}),\n ...(price?.currency !== undefined\n ? { currency: price.currency }\n : summary?.currency !== undefined\n ? { currency: summary.currency }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Earnings\n// ---------------------------------------------------------------------------\nexport function transformEarnings(\n symbol: string,\n result: YahooQuoteSummaryResult,\n raw?: unknown,\n): EarningsEvent[] {\n const history = result.earningsHistory?.history;\n if (!history || history.length === 0) return [];\n\n return history\n .map((entry) => {\n const ts = entry.quarter?.raw;\n if (ts == null) return null;\n\n const event: EarningsEvent = {\n symbol,\n date: new Date(ts * 1_000),\n ...(entry.quarter?.fmt !== undefined ? { period: entry.quarter.fmt } : {}),\n ...(entry.epsActual?.raw !== undefined ? { epsActual: entry.epsActual.raw } : {}),\n ...(entry.epsEstimate?.raw !== undefined ? { epsEstimate: entry.epsEstimate.raw } : {}),\n ...(entry.surprisePercent?.raw !== undefined\n ? { epsSurprisePct: entry.surprisePercent.raw }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n return event;\n })\n .filter((e): e is EarningsEvent => e !== null)\n .sort((a, b) => b.date.getTime() - a.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Dividends\n// ---------------------------------------------------------------------------\nexport function transformDividends(\n symbol: string,\n result: YahooChartResult,\n raw?: unknown,\n): DividendEvent[] {\n const dividends = result.events?.dividends;\n if (!dividends) return [];\n\n return Object.values(dividends)\n .map((d) => ({\n symbol,\n exDate: new Date(d.date * 1_000),\n amount: d.amount,\n currency: result.meta.currency,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n }))\n .sort((a, b) => b.exDate.getTime() - a.exDate.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Splits\n// ---------------------------------------------------------------------------\nexport function transformSplits(\n symbol: string,\n result: YahooChartResult,\n raw?: unknown,\n): SplitEvent[] {\n const splits = result.events?.splits;\n if (!splits) return [];\n\n return Object.values(splits)\n .map((s) => ({\n symbol,\n date: new Date(s.date * 1_000),\n ratio: s.denominator > 0 ? s.numerator / s.denominator : s.numerator,\n description: s.splitRatio,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n }))\n .sort((a, b) => b.date.getTime() - a.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst YAHOO_TYPE_MAP: Record<string, AssetType> = {\n EQUITY: \"stock\",\n ETF: \"etf\",\n CRYPTOCURRENCY: \"crypto\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MUTUALFUND: \"mutual-fund\",\n FUTURE: \"future\",\n};\n\nexport function transformSearch(quote: YahooSearchQuote, raw?: unknown): SearchResult {\n const exchange = quote.exchDisp ?? quote.exchange;\n return {\n symbol: quote.symbol,\n name: quote.longname ?? quote.shortname ?? quote.symbol,\n type: YAHOO_TYPE_MAP[quote.quoteType?.toUpperCase() ?? \"\"] ?? \"unknown\",\n ...(exchange !== undefined ? { exchange } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"../../types/dividends.js\";\nimport type { EarningsEvent, EarningsOptions } from \"../../types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"../../types/splits.js\";\nimport { toYahooSymbol } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformDividends,\n transformEarnings,\n transformHistorical,\n transformQuote,\n transformSearch,\n transformSplits,\n} from \"./transform.js\";\nimport type {\n YahooChartResponse,\n YahooQuoteSummaryResponse,\n YahooSearchResponse,\n} from \"./types.js\";\n\nexport interface YahooProviderOptions {\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n}\n\n/**\n * Yahoo Finance provider — no API key required.\n *\n * Uses the unofficial Yahoo Finance v8 chart API, which is free and publicly\n * accessible but not officially supported. Use respectfully.\n */\nexport class YahooProvider implements MarketProvider {\n readonly name = \"yahoo\";\n\n private readonly http1: HttpClient;\n private readonly http2: HttpClient;\n\n constructor(options: YahooProviderOptions = {}) {\n const shared = {\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: {\n Accept: \"application/json\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n },\n };\n this.http1 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query1.finance.yahoo.com\",\n });\n this.http2 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query2.finance.yahoo.com\",\n });\n }\n\n // ---------------------------------------------------------------------------\n // Quote\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n const results = await Promise.all(\n symbols.map((symbol) => this.fetchSingleQuote(symbol, options)),\n );\n return results;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = toYahooSymbol(symbol);\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval: \"1d\",\n range: \"1d\",\n includePrePost: false,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(err?.description ?? `No data returned for symbol \"${s}\"`, this.name);\n }\n\n return transformQuote(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const s = toYahooSymbol(symbol);\n const interval = options?.interval ?? \"1d\";\n\n const period1 = toEpoch(options?.period1 ?? subtractOneYear());\n const period2 = toEpoch(options?.period2 ?? new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval,\n period1,\n period2,\n events: \"div,splits\",\n includeAdjustedClose: true,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No historical data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformHistorical(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const limit = options?.limit ?? 10;\n\n const data = await this.http1.get<YahooSearchResponse>(\"/v1/finance/search\", {\n params: {\n q: query,\n quotesCount: limit,\n newsCount: 0,\n enableFuzzyQuery: false,\n enableEnhancedTrivialQuery: true,\n },\n });\n\n return (data.quotes ?? [])\n .slice(0, limit)\n .map((q) => transformSearch(q, options?.raw ? q : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const s = toYahooSymbol(symbol);\n\n const data = await this.http2.get<YahooQuoteSummaryResponse>(`/v10/finance/quoteSummary/${s}`, {\n params: {\n modules: \"assetProfile,summaryDetail,price\",\n },\n });\n\n const result = data.quoteSummary.result?.[0];\n if (!result) {\n const err = data.quoteSummary.error;\n throw new ProviderError(err?.description ?? `No company data for symbol \"${s}\"`, this.name);\n }\n\n return transformCompany(symbol, result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Earnings\n // ---------------------------------------------------------------------------\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http2.get<YahooQuoteSummaryResponse>(`/v10/finance/quoteSummary/${s}`, {\n params: { modules: \"earningsHistory\" },\n });\n\n const result = data.quoteSummary.result?.[0];\n if (!result) {\n const err = data.quoteSummary.error;\n throw new ProviderError(\n err?.description ?? `No earnings data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformEarnings(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n\n // ---------------------------------------------------------------------------\n // Dividends\n // ---------------------------------------------------------------------------\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 50;\n\n const period1 = options?.from ? toEpoch(options.from) : toEpoch(subtractYears(10));\n const period2 = options?.to ? toEpoch(options.to) : toEpoch(new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: { interval: \"1d\", period1, period2, events: \"div\" },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No dividend data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformDividends(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n\n // ---------------------------------------------------------------------------\n // Splits\n // ---------------------------------------------------------------------------\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n const s = toYahooSymbol(symbol);\n const limit = options?.limit ?? 50;\n\n const period1 = options?.from ? toEpoch(options.from) : toEpoch(subtractYears(10));\n const period2 = options?.to ? toEpoch(options.to) : toEpoch(new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: { interval: \"1d\", period1, period2, events: \"split\" },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No split data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformSplits(symbol, result, options?.raw ? data : undefined).slice(0, limit);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction toEpoch(date: string | Date): number {\n const d = date instanceof Date ? date : new Date(date);\n return Math.floor(d.getTime() / 1_000);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n\nfunction subtractYears(n: number): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - n);\n return d;\n}\n","import { MemoryCacheDriver } from \"./cache/memory.js\";\nimport type { CacheConfig, CacheDriver, CacheMethod } from \"./cache/types.js\";\nimport { AllProvidersFailedError, MarketFeedError, UnsupportedOperationError } from \"./errors.js\";\nimport { YahooProvider } from \"./providers/yahoo/index.js\";\nimport type { CompanyOptions, CompanyProfile } from \"./types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"./types/dividends.js\";\nimport type { EarningsEvent, EarningsOptions } from \"./types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"./types/historical.js\";\nimport type { MarketStatus, MarketStatusOptions } from \"./types/market.js\";\nimport type { NewsItem, NewsOptions } from \"./types/news.js\";\nimport type { MarketProvider } from \"./types/provider.js\";\nimport type { Quote, QuoteOptions } from \"./types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"./types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"./types/splits.js\";\n\nexport interface MarketFeedOptions {\n /**\n * Ordered list of provider adapters.\n * When `fallback: true`, each is tried in order until one succeeds.\n * Defaults to `[new YahooProvider()]`.\n */\n providers?: MarketProvider[];\n /**\n * Cache configuration. Pass `false` to disable caching entirely.\n * Defaults to an in-memory LRU cache with 60s TTL.\n */\n cache?: CacheConfig | false;\n /**\n * When `true`, automatically tries the next provider if the current one fails.\n * Defaults to `true`.\n */\n fallback?: boolean;\n}\n\n// Default TTLs per method (seconds)\nconst DEFAULT_TTLS: Record<CacheMethod, number> = {\n quote: 60,\n historical: 3600,\n company: 86400,\n news: 300,\n search: 600,\n marketStatus: 60,\n earnings: 3600,\n dividends: 86400,\n splits: 86400,\n};\n\n/**\n * The unified MarketFeed client.\n *\n * Wraps one or more provider adapters under a single consistent API.\n * Handles caching, fallback, and error aggregation transparently.\n *\n * @example\n * ```ts\n * import { MarketFeed } from 'market-feed';\n *\n * const feed = new MarketFeed();\n * const quote = await feed.quote('AAPL');\n * console.log(quote.price); // 189.84\n * ```\n */\nexport class MarketFeed {\n private readonly _providers: MarketProvider[];\n private readonly cache: CacheDriver | null;\n private readonly fallback: boolean;\n private readonly ttls: Record<CacheMethod, number>;\n\n /** Read-only view of the configured provider adapters. */\n get providers(): readonly MarketProvider[] {\n return this._providers;\n }\n\n constructor(options: MarketFeedOptions = {}) {\n this._providers =\n options.providers && options.providers.length > 0 ? options.providers : [new YahooProvider()];\n\n this.fallback = options.fallback ?? true;\n\n if (options.cache === false) {\n this.cache = null;\n } else {\n const cfg = options.cache ?? {};\n this.cache = cfg.driver ?? new MemoryCacheDriver(cfg.maxSize ?? 500);\n }\n\n const overrides = options.cache !== false ? (options.cache?.ttlOverrides ?? {}) : {};\n this.ttls = { ...DEFAULT_TTLS, ...overrides };\n }\n\n // ---------------------------------------------------------------------------\n // quote\n // ---------------------------------------------------------------------------\n\n /** Fetch a quote for a single symbol. */\n async quote(symbol: string, options?: QuoteOptions): Promise<Quote>;\n /** Fetch quotes for multiple symbols in parallel. */\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]>;\n async quote(\n symbolOrSymbols: string | string[],\n options?: QuoteOptions,\n ): Promise<Quote | Quote[]> {\n const isSingle = typeof symbolOrSymbols === \"string\";\n const symbols = isSingle ? [symbolOrSymbols] : symbolOrSymbols;\n\n const cacheKey = `quote:${symbols.join(\",\")}`;\n const cached = await this.getCache<Quote[]>(cacheKey);\n if (cached) return isSingle ? (cached[0] as Quote) : cached;\n\n const result = await this.withFallback(\"quote\", (provider) => provider.quote(symbols, options));\n\n await this.setCache(cacheKey, result, \"quote\");\n return isSingle ? (result[0] as Quote) : result;\n }\n\n // ---------------------------------------------------------------------------\n // historical\n // ---------------------------------------------------------------------------\n\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const interval = options?.interval ?? \"1d\";\n const p1 = normaliseDate(options?.period1);\n const p2 = normaliseDate(options?.period2 ?? new Date());\n const cacheKey = `historical:${symbol}:${interval}:${p1}:${p2}`;\n\n const cached = await this.getCache<HistoricalBar[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"historical\", (provider) =>\n provider.historical(symbol, options),\n );\n\n await this.setCache(cacheKey, result, \"historical\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // search\n // ---------------------------------------------------------------------------\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${options?.limit ?? 10}`;\n const cached = await this.getCache<SearchResult[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"search\", (provider) => provider.search(query, options));\n\n await this.setCache(cacheKey, result, \"search\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // company\n // ---------------------------------------------------------------------------\n\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const cacheKey = `company:${symbol}`;\n const cached = await this.getCache<CompanyProfile>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"company\", (provider) => {\n if (!provider.company) throw new UnsupportedOperationError(provider.name, \"company\");\n return provider.company(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"company\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // news\n // ---------------------------------------------------------------------------\n\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n const cacheKey = `news:${symbol}:${options?.limit ?? 10}`;\n const cached = await this.getCache<NewsItem[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"news\", (provider) => {\n if (!provider.news) throw new UnsupportedOperationError(provider.name, \"news\");\n return provider.news(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"news\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // marketStatus\n // ---------------------------------------------------------------------------\n\n async marketStatus(market?: string, options?: MarketStatusOptions): Promise<MarketStatus> {\n const cacheKey = `marketStatus:${market ?? \"default\"}`;\n const cached = await this.getCache<MarketStatus>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"marketStatus\", (provider) => {\n if (!provider.marketStatus) {\n throw new UnsupportedOperationError(provider.name, \"marketStatus\");\n }\n return provider.marketStatus(market, options);\n });\n\n await this.setCache(cacheKey, result, \"marketStatus\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // earnings\n // ---------------------------------------------------------------------------\n\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n const limit = options?.limit ?? 10;\n const cacheKey = `earnings:${symbol}:${limit}`;\n const cached = await this.getCache<EarningsEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"earnings\", (provider) => {\n if (!provider.earnings) throw new UnsupportedOperationError(provider.name, \"earnings\");\n return provider.earnings(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"earnings\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // dividends\n // ---------------------------------------------------------------------------\n\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n const from = normaliseDate(options?.from);\n const to = normaliseDate(options?.to ?? new Date());\n const cacheKey = `dividends:${symbol}:${from}:${to}`;\n const cached = await this.getCache<DividendEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"dividends\", (provider) => {\n if (!provider.dividends) throw new UnsupportedOperationError(provider.name, \"dividends\");\n return provider.dividends(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"dividends\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // splits\n // ---------------------------------------------------------------------------\n\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n const from = normaliseDate(options?.from);\n const to = normaliseDate(options?.to ?? new Date());\n const cacheKey = `splits:${symbol}:${from}:${to}`;\n const cached = await this.getCache<SplitEvent[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"splits\", (provider) => {\n if (!provider.splits) throw new UnsupportedOperationError(provider.name, \"splits\");\n return provider.splits(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"splits\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // Cache management\n // ---------------------------------------------------------------------------\n\n /** Invalidate all cached entries. */\n async clearCache(): Promise<void> {\n await this.cache?.clear();\n }\n\n /** Invalidate a specific cache key (exact match). */\n async invalidate(key: string): Promise<void> {\n await this.cache?.delete(key);\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private async withFallback<T>(\n operation: string,\n fn: (provider: MarketProvider) => Promise<T>,\n ): Promise<T> {\n const errors: MarketFeedError[] = [];\n\n for (const provider of this._providers) {\n try {\n return await fn(provider);\n } catch (err) {\n if (err instanceof UnsupportedOperationError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n if (err instanceof MarketFeedError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n // Unknown error — wrap and rethrow\n throw err;\n }\n }\n\n throw new AllProvidersFailedError(errors, operation);\n }\n\n private async getCache<T>(key: string): Promise<T | undefined> {\n if (!this.cache) return undefined;\n return this.cache.get<T>(key);\n }\n\n private async setCache<T>(key: string, value: T, method: CacheMethod): Promise<void> {\n if (!this.cache) return;\n await this.cache.set(key, value, this.ttls[method]);\n }\n}\n\nfunction normaliseDate(d?: string | Date): string {\n if (!d) return \"\";\n const date = d instanceof Date ? d : new Date(d);\n return date.toISOString().slice(0, 10);\n}\n","import { RateLimitError } from \"../errors.js\";\n\n/**\n * Token-bucket rate limiter.\n *\n * Tokens refill at `refillRate` tokens per second up to `capacity`.\n * Call `consume()` before each API request; it throws `RateLimitError`\n * if the bucket is empty.\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number; // epoch ms\n\n /**\n * @param providerName Used in error messages\n * @param capacity Maximum tokens in the bucket (= burst limit)\n * @param refillRate Tokens added per second\n */\n constructor(\n private readonly providerName: string,\n private readonly capacity: number,\n private readonly refillRate: number,\n ) {\n this.tokens = capacity;\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume `count` tokens.\n * Throws `RateLimitError` if insufficient tokens are available.\n */\n consume(count = 1): void {\n this.refill();\n\n if (this.tokens < count) {\n // Calculate when enough tokens will be available\n const deficit = count - this.tokens;\n const waitSeconds = deficit / this.refillRate;\n const retryAfter = new Date(Date.now() + waitSeconds * 1_000);\n throw new RateLimitError(this.providerName, retryAfter);\n }\n\n this.tokens -= count;\n }\n\n /**\n * Returns true if at least `count` tokens are available without consuming them.\n */\n canConsume(count = 1): boolean {\n this.refill();\n return this.tokens >= count;\n }\n\n /** Milliseconds until the bucket has at least `count` tokens. 0 if already available. */\n waitTimeMs(count = 1): number {\n this.refill();\n if (this.tokens >= count) return 0;\n const deficit = count - this.tokens;\n return Math.ceil((deficit / this.refillRate) * 1_000);\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1_000; // seconds\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type { AVDailyAdjBar, AVGlobalQuote, AVOverviewResponse, AVSearchMatch } from \"./types.js\";\n\nconst PROVIDER = \"alpha-vantage\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(raw: AVGlobalQuote, includeRaw?: unknown): Quote {\n const price = Number.parseFloat(raw[\"05. price\"]);\n const open = Number.parseFloat(raw[\"02. open\"]);\n const high = Number.parseFloat(raw[\"03. high\"]);\n const low = Number.parseFloat(raw[\"04. low\"]);\n const previousClose = Number.parseFloat(raw[\"08. previous close\"]);\n const change = Number.parseFloat(raw[\"09. change\"]);\n const changePercent = Number.parseFloat(raw[\"10. change percent\"].replace(\"%\", \"\"));\n const volume = Number.parseInt(raw[\"06. volume\"], 10);\n const latestDay = raw[\"07. latest trading day\"];\n\n return {\n symbol: raw[\"01. symbol\"],\n name: raw[\"01. symbol\"],\n price,\n change,\n changePercent,\n open,\n high,\n low,\n close: price,\n previousClose,\n volume,\n currency: \"USD\", // AV free tier is USD only\n exchange: \"\",\n timestamp: new Date(`${latestDay}T16:00:00-05:00`),\n provider: PROVIDER,\n raw: includeRaw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBars(\n timeSeries: Record<string, AVDailyAdjBar>,\n period1?: Date,\n period2?: Date,\n raw?: unknown,\n): HistoricalBar[] {\n return Object.entries(timeSeries)\n .filter(([dateStr]) => {\n const d = new Date(dateStr);\n if (period1 && d < period1) return false;\n if (period2 && d > period2) return false;\n return true;\n })\n .map(\n ([dateStr, bar]): HistoricalBar => ({\n date: new Date(dateStr),\n open: Number.parseFloat(bar[\"1. open\"]),\n high: Number.parseFloat(bar[\"2. high\"]),\n low: Number.parseFloat(bar[\"3. low\"]),\n close: Number.parseFloat(bar[\"4. close\"]),\n adjClose: Number.parseFloat(bar[\"5. adjusted close\"]),\n volume: Number.parseInt(bar[\"6. volume\"], 10),\n ...(raw !== undefined ? { raw } : {}),\n }),\n )\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst AV_TYPE_MAP: Record<string, AssetType> = {\n equity: \"stock\",\n etf: \"etf\",\n \"mutual fund\": \"mutual-fund\",\n crypto: \"crypto\",\n forex: \"forex\",\n index: \"index\",\n};\n\nexport function transformSearch(match: AVSearchMatch, raw?: unknown): SearchResult {\n const rawType = match[\"3. type\"].toLowerCase();\n return {\n symbol: match[\"1. symbol\"],\n name: match[\"2. name\"],\n type: AV_TYPE_MAP[rawType] ?? \"unknown\",\n exchange: match[\"4. region\"],\n currency: match[\"8. currency\"],\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(data: AVOverviewResponse, raw?: unknown): CompanyProfile {\n return {\n symbol: data.Symbol ?? \"\",\n name: data.Name ?? data.Symbol ?? \"\",\n ...(data.Description ? { description: data.Description } : {}),\n ...(data.Sector ? { sector: data.Sector } : {}),\n ...(data.Industry ? { industry: data.Industry } : {}),\n ...(data.Country ? { country: data.Country } : {}),\n ...(data.FullTimeEmployees ? { employees: Number.parseInt(data.FullTimeEmployees, 10) } : {}),\n ...(data.OfficialSite ? { website: data.OfficialSite } : {}),\n ...(data.MarketCapitalization\n ? { marketCap: Number.parseFloat(data.MarketCapitalization) }\n : {}),\n ...(data.TrailingPE ? { peRatio: Number.parseFloat(data.TrailingPE) } : {}),\n ...(data.ForwardPE ? { forwardPE: Number.parseFloat(data.ForwardPE) } : {}),\n ...(data.PriceToBookRatio ? { priceToBook: Number.parseFloat(data.PriceToBookRatio) } : {}),\n ...(data.DividendYield ? { dividendYield: Number.parseFloat(data.DividendYield) } : {}),\n ...(data.Beta ? { beta: Number.parseFloat(data.Beta) } : {}),\n ...(data.Exchange ? { exchange: data.Exchange } : {}),\n ...(data.Currency ? { currency: data.Currency } : {}),\n ...(data.IPODate ? { ipoDate: new Date(data.IPODate) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError, RateLimitError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformHistoricalBars,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\nimport type {\n AVDailyAdjBar,\n AVGlobalQuoteResponse,\n AVOverviewResponse,\n AVSearchResponse,\n AVTimeSeriesDailyResponse,\n} from \"./types.js\";\n\nexport interface AlphaVantageProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute, 25 calls/day.\n * Premium tier: higher — set refillRate accordingly.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Alpha Vantage provider.\n *\n * Free tier: 25 API calls/day, 5 calls/minute.\n * The rate limiter is enforced client-side to avoid burning your daily quota.\n */\nexport class AlphaVantageProvider implements MarketProvider {\n readonly name = \"alpha-vantage\";\n\n private readonly http: HttpClient;\n private readonly apiKey: string;\n private readonly limiter: RateLimiter;\n\n constructor(options: AlphaVantageProviderOptions) {\n this.apiKey = options.apiKey;\n this.http = new HttpClient(\"alpha-vantage\", {\n baseUrl: \"https://www.alphavantage.co\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n });\n // Default: 5 requests/minute burst capacity\n this.limiter = options.rateLimiter ?? new RateLimiter(\"alpha-vantage\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — uses GLOBAL_QUOTE function\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n // AV only supports single-symbol quote; batch sequentially\n const quotes: Quote[] = [];\n for (const symbol of symbols) {\n this.limiter.consume();\n quotes.push(await this.fetchSingleQuote(symbol, options));\n }\n return quotes;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = normalise(symbol);\n const data = await this.http.get<AVGlobalQuoteResponse>(\"/query\", {\n params: { function: \"GLOBAL_QUOTE\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const gq = data[\"Global Quote\"];\n if (!gq || !gq[\"01. symbol\"]) {\n throw new ProviderError(`No quote data returned for \"${s}\"`, this.name);\n }\n\n return transformQuote(gq, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical — uses TIME_SERIES_DAILY_ADJUSTED\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const outputsize = \"full\"; // always fetch full; filter client-side\n\n const data = await this.http.get<AVTimeSeriesDailyResponse>(\"/query\", {\n params: {\n function: \"TIME_SERIES_DAILY_ADJUSTED\",\n symbol: s,\n outputsize,\n apikey: this.apiKey,\n },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const timeSeries = data[\"Time Series (Daily Adjusted)\"] ?? data[\"Time Series (Daily)\"];\n if (!timeSeries) {\n throw new ProviderError(`No historical data returned for \"${s}\"`, this.name);\n }\n\n const period1 = options?.period1\n ? new Date(options.period1)\n : (() => {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n })();\n const period2 = options?.period2 ? new Date(options.period2) : new Date();\n\n return transformHistoricalBars(\n timeSeries as Record<string, AVDailyAdjBar>,\n period1,\n period2,\n options?.raw ? data : undefined,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — uses SYMBOL_SEARCH\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const data = await this.http.get<AVSearchResponse>(\"/query\", {\n params: { function: \"SYMBOL_SEARCH\", keywords: query, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const limit = options?.limit ?? 10;\n return (data.bestMatches ?? [])\n .slice(0, limit)\n .map((m) => transformSearch(m, options?.raw ? m : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — uses OVERVIEW\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<AVOverviewResponse>(\"/query\", {\n params: { function: \"OVERVIEW\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n if (!data.Symbol) {\n throw new ProviderError(`No company overview returned for \"${s}\"`, this.name);\n }\n\n return transformCompany(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private checkRateLimit(data: Record<string, unknown>): void {\n const info = data[\"Information\"] as string | undefined;\n const note = data[\"Note\"] as string | undefined;\n const msg = info ?? note ?? \"\";\n if (msg.toLowerCase().includes(\"rate limit\") || msg.toLowerCase().includes(\"api call\")) {\n throw new RateLimitError(this.name);\n }\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { EarningsEvent } from \"../../types/earnings.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { NewsItem } from \"../../types/news.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type {\n FinnhubCandlesResponse,\n FinnhubEarningsEntry,\n FinnhubNewsArticle,\n FinnhubProfileResponse,\n FinnhubQuoteResponse,\n FinnhubSearchResult,\n} from \"./types.js\";\n\nconst PROVIDER = \"finnhub\";\n\nexport function transformQuote(\n symbol: string,\n data: FinnhubQuoteResponse,\n raw?: unknown,\n): Quote {\n return {\n symbol: symbol.toUpperCase(),\n name: symbol.toUpperCase(),\n price: data.c,\n change: data.d,\n changePercent: data.dp,\n open: data.o,\n high: data.h,\n low: data.l,\n close: data.c,\n previousClose: data.pc,\n volume: 0,\n currency: \"USD\",\n exchange: \"\",\n timestamp: new Date(data.t * 1000),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformHistorical(\n data: FinnhubCandlesResponse,\n raw?: unknown,\n): HistoricalBar[] {\n if (data.s !== \"ok\") return [];\n\n return data.t.map((timestamp, i) => ({\n date: new Date(timestamp * 1000),\n open: data.o[i] ?? 0,\n high: data.h[i] ?? 0,\n low: data.l[i] ?? 0,\n close: data.c[i] ?? 0,\n volume: data.v[i] ?? 0,\n ...(raw !== undefined ? { raw } : {}),\n }));\n}\n\nexport function transformSearch(result: FinnhubSearchResult, raw?: unknown): SearchResult {\n return {\n symbol: result.displaySymbol,\n name: result.description,\n type: mapType(result.type),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformCompany(data: FinnhubProfileResponse, raw?: unknown): CompanyProfile {\n return {\n symbol: data.ticker,\n name: data.name,\n description: undefined,\n sector: data.gsector || data.finnhubIndustry || undefined,\n industry: data.gind || undefined,\n country: data.country || undefined,\n website: data.weburl || undefined,\n currency: data.currency || undefined,\n exchange: data.exchange || undefined,\n // Finnhub reports marketCap in millions USD\n marketCap: data.marketCapitalization ? data.marketCapitalization * 1_000_000 : undefined,\n ipoDate: data.ipo ? new Date(data.ipo) : undefined,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformNews(article: FinnhubNewsArticle, raw?: unknown): NewsItem {\n return {\n id: String(article.id),\n title: article.headline,\n summary: article.summary || undefined,\n url: article.url,\n source: article.source,\n publishedAt: new Date(article.datetime * 1000),\n symbols: article.related\n ? article.related\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [],\n thumbnail: article.image || undefined,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nexport function transformEarnings(entry: FinnhubEarningsEntry, raw?: unknown): EarningsEvent {\n return {\n symbol: entry.symbol,\n date: new Date(entry.period),\n period: entry.period,\n ...(entry.actual !== null && entry.actual !== undefined ? { epsActual: entry.actual } : {}),\n ...(entry.estimate !== null && entry.estimate !== undefined\n ? { epsEstimate: entry.estimate }\n : {}),\n ...(entry.surprisePercent !== null && entry.surprisePercent !== undefined\n ? { epsSurprisePct: entry.surprisePercent }\n : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\nfunction mapType(type: string): AssetType {\n const t = type.toLowerCase();\n if (t === \"common stock\" || t === \"cs\") return \"stock\";\n if (t === \"etp\" || t.includes(\"etf\")) return \"etf\";\n if (t.includes(\"crypto\")) return \"crypto\";\n if (t.includes(\"forex\") || t.includes(\"currency\")) return \"forex\";\n if (t.includes(\"mutual fund\") || t.includes(\"fund\")) return \"mutual-fund\";\n if (t.includes(\"future\")) return \"future\";\n if (t.includes(\"index\")) return \"index\";\n return \"unknown\";\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { EarningsEvent, EarningsOptions } from \"../../types/earnings.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { NewsItem, NewsOptions } from \"../../types/news.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformEarnings,\n transformHistorical,\n transformNews,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\nimport type {\n FinnhubCandlesResponse,\n FinnhubEarningsResponse,\n FinnhubNewsArticle,\n FinnhubProfileResponse,\n FinnhubQuoteResponse,\n FinnhubSearchResponse,\n} from \"./types.js\";\n\nexport interface FinnhubProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the default rate limiter.\n * Free tier: 60 API calls/minute.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Finnhub.io provider.\n *\n * Free tier provides real-time US stock market data with a 60 calls/minute limit.\n * API key is required — get one free at https://finnhub.io\n */\nexport class FinnhubProvider implements MarketProvider {\n readonly name = \"finnhub\";\n\n private readonly http: HttpClient;\n private readonly limiter: RateLimiter;\n\n /** API key exposed for WebSocket authentication in `market-feed/ws`. */\n get wsApiKey(): string {\n return this.options.apiKey;\n }\n\n constructor(private readonly options: FinnhubProviderOptions) {\n this.http = new HttpClient(\"finnhub\", {\n baseUrl: \"https://finnhub.io\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: {\n \"X-Finnhub-Token\": options.apiKey,\n Accept: \"application/json\",\n },\n });\n // Free tier: 60 calls/minute = 1 call/second\n this.limiter = options.rateLimiter ?? new RateLimiter(\"finnhub\", 60, 1);\n }\n\n // ---------------------------------------------------------------------------\n // Quote\n // ---------------------------------------------------------------------------\n\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n return Promise.all(symbols.map((s) => this.fetchSingleQuote(s, options)));\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n this.limiter.consume();\n const s = normalise(symbol);\n\n const data = await this.http.get<FinnhubQuoteResponse>(\"/api/v1/quote\", {\n params: { symbol: s },\n });\n\n // c === 0 means no data for this symbol on Finnhub\n if (!data.c) {\n throw new ProviderError(`No quote data for symbol \"${s}\"`, this.name);\n }\n\n return transformQuote(s, data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical (candles)\n // ---------------------------------------------------------------------------\n\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const resolution = toResolution(options?.interval ?? \"1d\");\n const from = toEpoch(options?.period1 ?? subtractOneYear());\n const to = toEpoch(options?.period2 ?? new Date());\n\n const data = await this.http.get<FinnhubCandlesResponse>(\"/api/v1/stock/candle\", {\n params: { symbol: s, resolution, from, to },\n });\n\n if (data.s === \"no_data\") {\n throw new ProviderError(`No historical data for symbol \"${s}\"`, this.name);\n }\n\n return transformHistorical(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<FinnhubSearchResponse>(\"/api/v1/search\", {\n params: { q: query },\n });\n\n return (data.result ?? [])\n .slice(0, limit)\n .map((r) => transformSearch(r, options?.raw ? r : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company\n // ---------------------------------------------------------------------------\n\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n const s = normalise(symbol);\n\n const data = await this.http.get<FinnhubProfileResponse>(\"/api/v1/stock/profile2\", {\n params: { symbol: s },\n });\n\n if (!data.name) {\n throw new ProviderError(`No company data for symbol \"${s}\"`, this.name);\n }\n\n return transformCompany(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // News\n // ---------------------------------------------------------------------------\n\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const to = toDateString(new Date());\n const from = toDateString(subtractDays(new Date(), 30));\n\n const data = await this.http.get<FinnhubNewsArticle[]>(\"/api/v1/company-news\", {\n params: { symbol: s, from, to },\n });\n\n if (!Array.isArray(data)) {\n throw new ProviderError(`Unexpected response for news \"${s}\"`, this.name);\n }\n\n return data\n .slice(0, limit)\n .map((article) => transformNews(article, options?.raw ? article : undefined));\n }\n // ---------------------------------------------------------------------------\n // Earnings\n // ---------------------------------------------------------------------------\n\n async earnings(symbol: string, options?: EarningsOptions): Promise<EarningsEvent[]> {\n this.limiter.consume();\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<FinnhubEarningsResponse>(\"/api/v1/stock/earnings\", {\n params: { symbol: s, limit },\n });\n\n if (!Array.isArray(data)) {\n throw new ProviderError(`Unexpected earnings response for \"${s}\"`, this.name);\n }\n\n return data.map((entry) => transformEarnings(entry, options?.raw ? entry : undefined));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toResolution(interval: string): string {\n const map: Record<string, string> = {\n \"1m\": \"1\",\n \"2m\": \"1\",\n \"5m\": \"5\",\n \"15m\": \"15\",\n \"30m\": \"30\",\n \"60m\": \"60\",\n \"90m\": \"60\",\n \"1h\": \"60\",\n \"1d\": \"D\",\n \"5d\": \"D\",\n \"1wk\": \"W\",\n \"1mo\": \"M\",\n \"3mo\": \"M\",\n };\n return map[interval] ?? \"D\";\n}\n\nfunction toEpoch(date: string | Date): number {\n const d = date instanceof Date ? date : new Date(date);\n return Math.floor(d.getTime() / 1_000);\n}\n\nfunction toDateString(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n\nfunction subtractDays(date: Date, days: number): Date {\n const d = new Date(date);\n d.setDate(d.getDate() - days);\n return d;\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendFrequency } from \"../../types/dividends.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { NewsItem } from \"../../types/news.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent } from \"../../types/splits.js\";\nimport type {\n PolygonAggBar,\n PolygonDividend,\n PolygonNewsArticle,\n PolygonSnapshotTicker,\n PolygonSplit,\n PolygonTicker,\n PolygonTickerDetails,\n} from \"./types.js\";\n\nconst PROVIDER = \"polygon\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(ticker: PolygonSnapshotTicker, raw?: unknown): Quote {\n const day = ticker.day;\n const prev = ticker.prevDay;\n const price = ticker.lastTrade?.p ?? day.c;\n\n return {\n symbol: ticker.ticker,\n name: ticker.ticker,\n price,\n change: ticker.todaysChange,\n changePercent: ticker.todaysChangePerc,\n open: day.o,\n high: day.h,\n low: day.l,\n close: day.c,\n previousClose: prev.c,\n volume: day.v,\n currency: \"USD\",\n exchange: \"\",\n timestamp: new Date(ticker.updated / 1_000_000), // nanoseconds → ms\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBar(bar: PolygonAggBar, raw?: unknown): HistoricalBar {\n return {\n date: new Date(bar.t),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst POLYGON_TYPE_MAP: Record<string, AssetType> = {\n CS: \"stock\",\n ETF: \"etf\",\n ETN: \"etf\",\n ETP: \"etf\",\n CRYPTO: \"crypto\",\n FX: \"forex\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MF: \"mutual-fund\",\n FUND: \"mutual-fund\",\n WARRANT: \"unknown\",\n RIGHT: \"unknown\",\n ADRC: \"stock\",\n PFD: \"stock\",\n};\n\nexport function transformSearch(ticker: PolygonTicker, raw?: unknown): SearchResult {\n const type = ticker.type ? (POLYGON_TYPE_MAP[ticker.type.toUpperCase()] ?? \"unknown\") : \"unknown\";\n return {\n symbol: ticker.ticker,\n name: ticker.name,\n type,\n ...(ticker.primary_exchange ? { exchange: ticker.primary_exchange } : {}),\n ...(ticker.currency_name ? { currency: ticker.currency_name.toUpperCase() } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(details: PolygonTickerDetails, raw?: unknown): CompanyProfile {\n return {\n symbol: details.ticker,\n name: details.name,\n ...(details.description ? { description: details.description } : {}),\n ...(details.sic_description ? { sector: details.sic_description } : {}),\n ...(details.address?.country ? { country: details.address.country } : {}),\n ...(details.total_employees !== undefined ? { employees: details.total_employees } : {}),\n ...(details.homepage_url ? { website: details.homepage_url } : {}),\n ...(details.market_cap !== undefined ? { marketCap: details.market_cap } : {}),\n ...(details.primary_exchange ? { exchange: details.primary_exchange } : {}),\n ...(details.list_date ? { ipoDate: new Date(details.list_date) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Dividends\n// ---------------------------------------------------------------------------\nfunction toFrequency(n?: number): DividendFrequency | undefined {\n switch (n) {\n case 1:\n return \"annual\";\n case 2:\n return \"semi-annual\";\n case 4:\n return \"quarterly\";\n case 12:\n return \"monthly\";\n default:\n return n !== undefined ? \"irregular\" : undefined;\n }\n}\n\nexport function transformDividend(dividend: PolygonDividend, raw?: unknown): DividendEvent {\n const freq = toFrequency(dividend.frequency);\n return {\n symbol: dividend.ticker,\n exDate: new Date(dividend.ex_dividend_date),\n ...(dividend.pay_date !== undefined ? { payDate: new Date(dividend.pay_date) } : {}),\n ...(dividend.declaration_date !== undefined\n ? { declaredDate: new Date(dividend.declaration_date) }\n : {}),\n amount: dividend.cash_amount,\n currency: dividend.currency ?? \"USD\",\n ...(freq !== undefined ? { frequency: freq } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Splits\n// ---------------------------------------------------------------------------\nexport function transformSplit(split: PolygonSplit, raw?: unknown): SplitEvent {\n return {\n symbol: split.ticker,\n date: new Date(split.execution_date),\n ratio: split.split_from > 0 ? split.split_to / split.split_from : split.split_to,\n description: `${split.split_to}:${split.split_from}`,\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// News\n// ---------------------------------------------------------------------------\nexport function transformNews(article: PolygonNewsArticle, raw?: unknown): NewsItem {\n return {\n id: article.id,\n title: article.title,\n ...(article.description ? { summary: article.description } : {}),\n url: article.article_url,\n source: article.publisher?.name ?? \"unknown\",\n publishedAt: new Date(article.published_utc),\n symbols: article.tickers ?? [],\n ...(article.image_url ? { thumbnail: article.image_url } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { DividendEvent, DividendOptions } from \"../../types/dividends.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { NewsItem, NewsOptions } from \"../../types/news.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type { SplitEvent, SplitOptions } from \"../../types/splits.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport {\n transformCompany,\n transformDividend,\n transformHistoricalBar,\n transformNews,\n transformQuote,\n transformSearch,\n transformSplit,\n} from \"./transform.js\";\nimport type {\n PolygonAggregatesResponse,\n PolygonDividendsResponse,\n PolygonNewsResponse,\n PolygonSnapshotResponse,\n PolygonSplitsResponse,\n PolygonTickerDetailsResponse,\n PolygonTickersResponse,\n} from \"./types.js\";\n\nexport interface PolygonProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute. Unlimited for paid plans.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Polygon.io provider.\n *\n * Free tier provides 15-minute delayed data with 5 API calls per minute.\n * Paid plans unlock real-time data and higher rate limits.\n */\nexport class PolygonProvider implements MarketProvider {\n readonly name = \"polygon\";\n\n private readonly http: HttpClient;\n private readonly limiter: RateLimiter;\n\n /** API key exposed for WebSocket authentication in `market-feed/ws`. */\n get wsApiKey(): string {\n return this.options.apiKey;\n }\n\n constructor(private readonly options: PolygonProviderOptions) {\n this.http = new HttpClient(\"polygon\", {\n baseUrl: \"https://api.polygon.io\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: { Authorization: `Bearer ${options.apiKey}` },\n });\n // Free tier: 5 calls/minute\n this.limiter = options.rateLimiter ?? new RateLimiter(\"polygon\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — snapshot endpoint\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n this.limiter.consume();\n\n const tickers = symbols.map(normalise).join(\",\");\n const data = await this.http.get<PolygonSnapshotResponse>(\n `/v2/snapshot/locale/us/markets/stocks/tickers`,\n { params: { tickers, apiKey: this.options.apiKey } },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n const tickerList = data.tickers ?? (data.ticker ? [data.ticker] : []);\n if (tickerList.length === 0) {\n throw new ProviderError(`No snapshot data for \"${tickers}\"`, this.name);\n }\n\n return tickerList.map((t) => transformQuote(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Historical — aggregates endpoint\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const interval = options?.interval ?? \"1d\";\n const { multiplier, timespan } = parseInterval(interval);\n\n const period1 = toDateString(options?.period1 ?? subtractOneYear());\n const period2 = toDateString(options?.period2 ?? new Date());\n\n const data = await this.http.get<PolygonAggregatesResponse>(\n `/v2/aggs/ticker/${s}/range/${multiplier}/${timespan}/${period1}/${period2}`,\n {\n params: {\n adjusted: true,\n sort: \"asc\",\n limit: 50000,\n apiKey: this.options.apiKey,\n },\n },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((bar) =>\n transformHistoricalBar(bar, options?.raw ? bar : undefined),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — reference tickers endpoint\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const limit = options?.limit ?? 10;\n const data = await this.http.get<PolygonTickersResponse>(\"/v3/reference/tickers\", {\n params: {\n search: query,\n active: true,\n limit,\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((t) => transformSearch(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — ticker details v3\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<PolygonTickerDetailsResponse>(`/v3/reference/tickers/${s}`, {\n params: { apiKey: this.options.apiKey },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n if (!data.results) {\n throw new ProviderError(`No company data for \"${s}\"`, this.name);\n }\n\n return transformCompany(data.results, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // News — ticker news endpoint\n // ---------------------------------------------------------------------------\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<PolygonNewsResponse>(\"/v2/reference/news\", {\n params: {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"published_utc\",\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((a) => transformNews(a, options?.raw ? a : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Dividends\n // ---------------------------------------------------------------------------\n async dividends(symbol: string, options?: DividendOptions): Promise<DividendEvent[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 50;\n const params: Record<string, string | number | boolean> = {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"ex_dividend_date\",\n apiKey: this.options.apiKey,\n };\n if (options?.from) params[\"ex_dividend_date.gte\"] = toDateString(new Date(options.from as string));\n if (options?.to) params[\"ex_dividend_date.lte\"] = toDateString(new Date(options.to as string));\n\n const data = await this.http.get<PolygonDividendsResponse>(\"/v3/reference/dividends\", {\n params,\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((d) => transformDividend(d, options?.raw ? d : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Splits\n // ---------------------------------------------------------------------------\n async splits(symbol: string, options?: SplitOptions): Promise<SplitEvent[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 50;\n const params: Record<string, string | number | boolean> = {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"execution_date\",\n apiKey: this.options.apiKey,\n };\n if (options?.from) params[\"execution_date.gte\"] = toDateString(new Date(options.from as string));\n if (options?.to) params[\"execution_date.lte\"] = toDateString(new Date(options.to as string));\n\n const data = await this.http.get<PolygonSplitsResponse>(\"/v3/reference/splits\", {\n params,\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((s) => transformSplit(s, options?.raw ? s : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private assertSuccess(response: { status: string; error?: string }): void {\n if (response.status === \"ERROR\" || response.error) {\n throw new ProviderError(\n response.error ?? `Polygon returned status \"${response.status}\"`,\n this.name,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interval parsing helpers\n// ---------------------------------------------------------------------------\nfunction parseInterval(interval: string): { multiplier: number; timespan: string } {\n const map: Record<string, { multiplier: number; timespan: string }> = {\n \"1m\": { multiplier: 1, timespan: \"minute\" },\n \"2m\": { multiplier: 2, timespan: \"minute\" },\n \"5m\": { multiplier: 5, timespan: \"minute\" },\n \"15m\": { multiplier: 15, timespan: \"minute\" },\n \"30m\": { multiplier: 30, timespan: \"minute\" },\n \"60m\": { multiplier: 60, timespan: \"minute\" },\n \"1h\": { multiplier: 1, timespan: \"hour\" },\n \"1d\": { multiplier: 1, timespan: \"day\" },\n \"5d\": { multiplier: 5, timespan: \"day\" },\n \"1wk\": { multiplier: 1, timespan: \"week\" },\n \"1mo\": { multiplier: 1, timespan: \"month\" },\n \"3mo\": { multiplier: 3, timespan: \"month\" },\n };\n return map[interval] ?? { multiplier: 1, timespan: \"day\" };\n}\n\nfunction toDateString(date: string | Date): string {\n const d = date instanceof Date ? date : new Date(date);\n return d.toISOString().slice(0, 10);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n","/**\n * market-feed CLI\n *\n * Usage: market-feed <command> [options]\n * Run `market-feed --help` for full usage.\n */\nimport { MarketFeed } from \"../client.js\";\nimport { AlphaVantageProvider } from \"../providers/alpha-vantage/index.js\";\nimport { FinnhubProvider } from \"../providers/finnhub/index.js\";\nimport { PolygonProvider } from \"../providers/polygon/index.js\";\nimport { YahooProvider } from \"../providers/yahoo/index.js\";\n\nconst HELP = `\nUsage: market-feed <command> [options]\n\nCommands:\n quote <symbol...> Fetch real-time quote(s)\n historical <symbol> Fetch OHLCV history\n search <query> Search for symbols\n company <symbol> Fetch company profile\n news <symbol> Fetch recent news\n earnings <symbol> Fetch EPS history (actuals vs. estimates)\n dividends <symbol> Fetch cash dividend history\n splits <symbol> Fetch stock split history\n\nOptions:\n --av-key <key> Alpha Vantage API key\n --polygon-key <key> Polygon.io API key\n --finnhub-key <key> Finnhub API key\n --json Output raw JSON\n --limit <n> Limit results (default: 10)\n --interval <i> Historical interval: 1m 5m 15m 30m 1h 1d 1wk 1mo (default: 1d)\n --period1 <date> Historical start date (ISO 8601)\n --period2 <date> Historical end date (ISO 8601)\n --from <date> Dividends/splits start date (ISO 8601)\n --to <date> Dividends/splits end date (ISO 8601)\n -h, --help Show this help message\n\nExamples:\n market-feed quote AAPL MSFT GOOGL\n market-feed historical AAPL --interval 1wk --period1 2024-01-01\n market-feed search \"apple inc\"\n market-feed company AAPL --json\n market-feed news AAPL --limit 5\n market-feed earnings AAPL --limit 8\n market-feed dividends AAPL --from 2020-01-01\n market-feed splits AAPL --json\n`.trim();\n\ninterface CliArgs {\n command: string;\n positionals: string[];\n json: boolean;\n avKey?: string;\n polygonKey?: string;\n finnhubKey?: string;\n limit: number;\n interval: string;\n period1?: string;\n period2?: string;\n from?: string;\n to?: string;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args = argv.slice(2);\n const result: CliArgs = {\n command: \"\",\n positionals: [],\n json: false,\n limit: 10,\n interval: \"1d\",\n };\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i]!;\n if (arg === \"--json\") {\n result.json = true;\n i++;\n } else if (arg === \"-h\" || arg === \"--help\") {\n result.command = \"help\";\n i++;\n } else if (arg === \"--av-key\") {\n result.avKey = args[++i];\n i++;\n } else if (arg === \"--polygon-key\") {\n result.polygonKey = args[++i];\n i++;\n } else if (arg === \"--finnhub-key\") {\n result.finnhubKey = args[++i];\n i++;\n } else if (arg === \"--limit\") {\n result.limit = Number(args[++i]) || 10;\n i++;\n } else if (arg === \"--interval\") {\n result.interval = args[++i] ?? \"1d\";\n i++;\n } else if (arg === \"--period1\") {\n result.period1 = args[++i];\n i++;\n } else if (arg === \"--period2\") {\n result.period2 = args[++i];\n i++;\n } else if (arg === \"--from\") {\n result.from = args[++i];\n i++;\n } else if (arg === \"--to\") {\n result.to = args[++i];\n i++;\n } else if (!arg.startsWith(\"-\") && !result.command) {\n result.command = arg;\n i++;\n } else if (!arg.startsWith(\"-\")) {\n result.positionals.push(arg);\n i++;\n } else {\n i++;\n }\n }\n return result;\n}\n\nfunction buildFeed(args: CliArgs): MarketFeed {\n const providers: InstanceType<typeof YahooProvider | typeof AlphaVantageProvider | typeof PolygonProvider | typeof FinnhubProvider>[] = [\n new YahooProvider(),\n ];\n if (args.avKey) providers.push(new AlphaVantageProvider({ apiKey: args.avKey }));\n if (args.polygonKey) providers.push(new PolygonProvider({ apiKey: args.polygonKey }));\n if (args.finnhubKey) providers.push(new FinnhubProvider({ apiKey: args.finnhubKey }));\n return new MarketFeed({ providers });\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction pad(s: string, n: number): string {\n const str = String(s);\n return str.length >= n ? str.slice(0, n) : str + \" \".repeat(n - str.length);\n}\n\nfunction fmtNum(n: number, decimals = 2): string {\n return n.toFixed(decimals);\n}\n\nfunction fmtChange(change: number, changePct: number): string {\n const sign = change >= 0 ? \"+\" : \"\";\n return `${sign}${fmtNum(change)} (${sign}${fmtNum(changePct)}%)`;\n}\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nasync function runQuote(feed: MarketFeed, symbols: string[], asJson: boolean): Promise<void> {\n const quotes = await feed.quote(symbols);\n if (asJson) {\n console.log(JSON.stringify(quotes, null, 2));\n return;\n }\n console.log(\n `${pad(\"Symbol\", 8)} ${pad(\"Price\", 10)} ${pad(\"Change\", 24)} ${pad(\"Volume\", 14)} Provider`,\n );\n console.log(\"-\".repeat(72));\n for (const q of quotes) {\n console.log(\n `${pad(q.symbol, 8)} ${pad(fmtNum(q.price), 10)} ${pad(fmtChange(q.change, q.changePercent), 24)} ${pad(q.volume.toLocaleString(), 14)} ${q.provider}`,\n );\n }\n}\n\nasync function runHistorical(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const bars = await feed.historical(symbol, {\n interval: args.interval as \"1d\",\n ...(args.period1 ? { period1: args.period1 } : {}),\n ...(args.period2 ? { period2: args.period2 } : {}),\n });\n if (args.json) {\n console.log(JSON.stringify(bars, null, 2));\n return;\n }\n console.log(\n `${pad(\"Date\", 12)} ${pad(\"Open\", 10)} ${pad(\"High\", 10)} ${pad(\"Low\", 10)} ${pad(\"Close\", 10)} Volume`,\n );\n console.log(\"-\".repeat(68));\n for (const b of bars.slice(-args.limit)) {\n console.log(\n `${pad(b.date.toISOString().slice(0, 10), 12)} ${pad(fmtNum(b.open), 10)} ${pad(fmtNum(b.high), 10)} ${pad(fmtNum(b.low), 10)} ${pad(fmtNum(b.close), 10)} ${b.volume.toLocaleString()}`,\n );\n }\n}\n\nasync function runSearch(feed: MarketFeed, query: string, args: CliArgs): Promise<void> {\n const results = await feed.search(query, { limit: args.limit });\n if (args.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n console.log(`${pad(\"Symbol\", 10)} ${pad(\"Name\", 36)} ${pad(\"Type\", 12)} Exchange`);\n console.log(\"-\".repeat(72));\n for (const r of results) {\n console.log(\n `${pad(r.symbol, 10)} ${pad(r.name, 36)} ${pad(r.type, 12)} ${r.exchange ?? \"\"}`,\n );\n }\n}\n\nasync function runCompany(feed: MarketFeed, symbol: string, asJson: boolean): Promise<void> {\n const profile = await feed.company(symbol);\n if (asJson) {\n console.log(JSON.stringify(profile, null, 2));\n return;\n }\n console.log(`\\n ${profile.name} (${profile.symbol})`);\n if (profile.sector) console.log(` Sector: ${profile.sector}`);\n if (profile.industry) console.log(` Industry: ${profile.industry}`);\n if (profile.country) console.log(` Country: ${profile.country}`);\n if (profile.employees) console.log(` Employees: ${profile.employees.toLocaleString()}`);\n if (profile.marketCap) console.log(` Mkt Cap: $${(profile.marketCap / 1e9).toFixed(2)}B`);\n if (profile.peRatio) console.log(` P/E: ${profile.peRatio.toFixed(2)}`);\n if (profile.website) console.log(` Website: ${profile.website}`);\n console.log(` Provider: ${profile.provider}\\n`);\n}\n\nasync function runNews(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const news = await feed.news(symbol, { limit: args.limit });\n if (args.json) {\n console.log(JSON.stringify(news, null, 2));\n return;\n }\n console.log(\"\");\n for (const item of news) {\n const date = item.publishedAt.toISOString().slice(0, 10);\n console.log(` [${date}] ${item.title}`);\n console.log(` ${item.source} — ${item.url}`);\n if (item.summary) {\n const excerpt = item.summary.length > 100 ? `${item.summary.slice(0, 100)}…` : item.summary;\n console.log(` ${excerpt}`);\n }\n console.log(\"\");\n }\n}\n\nasync function runEarnings(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const events = await feed.earnings(symbol, { limit: args.limit });\n if (args.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n if (events.length === 0) {\n console.log(\"No earnings data found.\");\n return;\n }\n console.log(\n `${pad(\"Date\", 12)} ${pad(\"Period\", 12)} ${pad(\"Actual\", 9)} ${pad(\"Estimate\", 9)} ${pad(\"Surprise%\", 10)} Provider`,\n );\n console.log(\"-\".repeat(70));\n for (const e of events) {\n const date = e.date.toISOString().slice(0, 10);\n const period = e.period ?? \"-\";\n const actual = e.epsActual !== undefined ? fmtNum(e.epsActual, 2) : \"-\";\n const estimate = e.epsEstimate !== undefined ? fmtNum(e.epsEstimate, 2) : \"-\";\n const surprise =\n e.epsSurprisePct !== undefined\n ? `${e.epsSurprisePct >= 0 ? \"+\" : \"\"}${fmtNum(e.epsSurprisePct, 2)}%`\n : \"-\";\n console.log(\n `${pad(date, 12)} ${pad(period, 12)} ${pad(actual, 9)} ${pad(estimate, 9)} ${pad(surprise, 10)} ${e.provider}`,\n );\n }\n}\n\nasync function runDividends(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const events = await feed.dividends(symbol, {\n limit: args.limit,\n ...(args.from ? { from: args.from } : {}),\n ...(args.to ? { to: args.to } : {}),\n });\n if (args.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n if (events.length === 0) {\n console.log(\"No dividend data found.\");\n return;\n }\n console.log(\n `${pad(\"Ex Date\", 12)} ${pad(\"Amount\", 9)} ${pad(\"Frequency\", 14)} ${pad(\"Pay Date\", 12)} Provider`,\n );\n console.log(\"-\".repeat(66));\n for (const e of events) {\n const exDate = e.exDate.toISOString().slice(0, 10);\n const amount = `$${fmtNum(e.amount, 4)}`;\n const freq = e.frequency ?? \"-\";\n const payDate = e.payDate ? e.payDate.toISOString().slice(0, 10) : \"-\";\n console.log(\n `${pad(exDate, 12)} ${pad(amount, 9)} ${pad(freq, 14)} ${pad(payDate, 12)} ${e.provider}`,\n );\n }\n}\n\nasync function runSplits(feed: MarketFeed, symbol: string, args: CliArgs): Promise<void> {\n const events = await feed.splits(symbol, {\n limit: args.limit,\n ...(args.from ? { from: args.from } : {}),\n ...(args.to ? { to: args.to } : {}),\n });\n if (args.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n if (events.length === 0) {\n console.log(\"No split data found.\");\n return;\n }\n console.log(`${pad(\"Date\", 12)} ${pad(\"Ratio\", 8)} ${pad(\"Description\", 14)} Provider`);\n console.log(\"-\".repeat(50));\n for (const e of events) {\n const date = e.date.toISOString().slice(0, 10);\n const ratio = fmtNum(e.ratio, 4);\n const desc = e.description ?? \"-\";\n console.log(`${pad(date, 12)} ${pad(ratio, 8)} ${pad(desc, 14)} ${e.provider}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (!args.command || args.command === \"help\") {\n console.log(HELP);\n process.exit(0);\n }\n\n const feed = buildFeed(args);\n\n try {\n switch (args.command) {\n case \"quote\": {\n const symbols = args.positionals;\n if (symbols.length === 0) {\n console.error(\"Error: quote requires at least one symbol\\n\");\n process.exit(1);\n }\n await runQuote(feed, symbols, args.json);\n break;\n }\n case \"historical\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: historical requires a symbol\\n\");\n process.exit(1);\n }\n await runHistorical(feed, symbol, args);\n break;\n }\n case \"search\": {\n const query = args.positionals.join(\" \");\n if (!query) {\n console.error(\"Error: search requires a query string\\n\");\n process.exit(1);\n }\n await runSearch(feed, query, args);\n break;\n }\n case \"company\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: company requires a symbol\\n\");\n process.exit(1);\n }\n await runCompany(feed, symbol, args.json);\n break;\n }\n case \"news\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: news requires a symbol\\n\");\n process.exit(1);\n }\n await runNews(feed, symbol, args);\n break;\n }\n case \"earnings\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: earnings requires a symbol\\n\");\n process.exit(1);\n }\n await runEarnings(feed, symbol, args);\n break;\n }\n case \"dividends\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: dividends requires a symbol\\n\");\n process.exit(1);\n }\n await runDividends(feed, symbol, args);\n break;\n }\n case \"splits\": {\n const [symbol] = args.positionals;\n if (!symbol) {\n console.error(\"Error: splits requires a symbol\\n\");\n process.exit(1);\n }\n await runSplits(feed, symbol, args);\n break;\n }\n default: {\n console.error(`Unknown command: \"${args.command}\"\\n`);\n console.log(HELP);\n process.exit(1);\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n}\n\n// Guard against running when imported in tests\nif (!process.env[\"VITEST\"]) {\n main().catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n });\n}\n\n// Export parseArgs for unit testing\nexport { parseArgs };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "market-feed",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Unified TypeScript client for financial market data — wraps Yahoo Finance, Alpha Vantage, Polygon.io, and Finnhub under one consistent interface with caching, fallback, and real-time WebSocket streaming.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"finance",
|