fmp-node-api 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -51
- package/dist/index.d.mts +3291 -662
- package/dist/index.d.ts +3291 -662
- package/dist/index.js +3532 -681
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3525 -674
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/shared.ts","../src/utils/validation.ts","../src/endpoints/stock.ts","../src/endpoints/financial.ts","../src/endpoints/forex.ts","../src/endpoints/crypto.ts","../src/endpoints/etf.ts","../src/endpoints/mutual-fund.ts","../src/endpoints/economic.ts","../src/endpoints/market.ts","../src/endpoints/list.ts","../src/endpoints/calendar.ts","../src/endpoints/company.ts","../src/endpoints/quote.ts","../src/endpoints/senate-house.ts","../src/fmp.ts","../src/types/common.ts","../src/utils/formatting.ts","../src/utils/constants.ts"],"names":["axios","filteredData","Period","Exchange"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport { FMPConfig, APIResponse } from './types';\n\n/**\n * Utility function to unwrap single objects from arrays\n * Only unwraps if the response is an array with exactly one item\n * Otherwise, returns the original response\n */\nfunction unwrapSingleObject<T>(data: T): T {\n if (Array.isArray(data) && data.length === 1) {\n return data[0];\n }\n return data;\n}\n\n/**\n * Utility to normalize array responses: always returns an array (possibly empty)\n */\nfunction normalizeArrayResponse<T>(data: T | undefined | null): T {\n if (Array.isArray(data)) return data;\n if (data == null) return [] as unknown as T;\n return data;\n}\n\n/**\n * Utility to normalize object responses: always returns an object (possibly empty)\n */\nfunction normalizeObjectResponse<T>(data: T | undefined | null): T {\n if (data == null) return {} as unknown as T;\n return data;\n}\n\nexport class FMPClient {\n private v3Client: AxiosInstance;\n private v4Client: AxiosInstance;\n private stableClient: AxiosInstance;\n private apiKey: string;\n\n constructor(config: FMPConfig) {\n this.apiKey = config.apiKey;\n\n // Create separate clients for each version\n this.v3Client = this.createClient('https://financialmodelingprep.com/api/v3', config.timeout);\n this.v4Client = this.createClient('https://financialmodelingprep.com/api/v4', config.timeout);\n this.stableClient = this.createClient(\n 'https://financialmodelingprep.com/stable',\n config.timeout,\n );\n }\n\n private createClient(baseURL: string, timeout?: number): AxiosInstance {\n const client = axios.create({\n baseURL,\n timeout: timeout || 10000,\n headers: { 'Content-Type': 'application/json' },\n });\n\n client.interceptors.request.use(config => {\n config.params = { ...config.params, apikey: this.apiKey };\n return config;\n });\n\n return client;\n }\n\n /**\n * Standard get method - returns raw API response\n *\n * For endpoints that return arrays, this will always return an array (possibly empty) for `data` when success is true.\n * For endpoints that return objects, data is returned as-is.\n */\n async get<T>(\n endpoint: string,\n version: 'v3' | 'v4' | 'stable' = 'v3',\n params?: Record<string, any>,\n ): Promise<APIResponse<T>> {\n const client = this.getClientForVersion(version);\n\n try {\n const response = await client.get(endpoint, { params });\n let data = response.data;\n // If T is an array type, always return an array (never undefined/null)\n if (Array.isArray(data) || data == null) {\n data = normalizeArrayResponse<T>(data);\n }\n return {\n success: true,\n data,\n status: response.status,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n status: error.response?.status || 500,\n };\n }\n }\n\n /**\n * Get method for single-object endpoints - unwraps single-item arrays\n *\n * For endpoints that return single objects, this will always return an object (possibly empty) for `data` when success is true.\n */\n async getSingle<T>(\n endpoint: string,\n version: 'v3' | 'v4' | 'stable' = 'v3',\n params?: Record<string, any>,\n ): Promise<APIResponse<T>> {\n const client = this.getClientForVersion(version);\n\n try {\n const response = await client.get(endpoint, { params });\n const data = normalizeObjectResponse<T>(unwrapSingleObject(response.data));\n return {\n success: true,\n data,\n status: response.status,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Unknown error occurred',\n status: error.response?.status || 500,\n };\n }\n }\n\n private getClientForVersion(version: 'v3' | 'v4' | 'stable'): AxiosInstance {\n switch (version) {\n case 'v3':\n return this.v3Client;\n case 'v4':\n return this.v4Client;\n case 'stable':\n return this.stableClient;\n default:\n return this.v3Client; // Default to v3\n }\n }\n}\n","// Shared types and utilities for FMP API wrapper\n\n// Common error types\nexport class FMPError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = 'FMPError';\n }\n}\n","// Validation utilities for FMP API\n\nimport { FMPError } from '../shared';\n\n/**\n * Validate API key\n */\nexport function validateApiKey(apiKey: string): void {\n if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {\n throw new FMPError('API key is required and must be a non-empty string');\n }\n}\n\n/**\n * Validate stock symbol\n */\nexport function validateSymbol(symbol: string): void {\n if (!symbol || typeof symbol !== 'string' || symbol.trim().length === 0) {\n throw new FMPError('Symbol is required and must be a non-empty string');\n }\n\n // Basic symbol validation (alphanumeric and common symbols)\n const symbolRegex = /^[A-Z0-9.-]+$/;\n if (!symbolRegex.test(symbol.toUpperCase())) {\n throw new FMPError(\n 'Invalid symbol format. Symbols should contain only letters, numbers, dots, and hyphens',\n );\n }\n}\n\n/**\n * Validate date format (YYYY-MM-DD)\n */\nexport function validateDate(date: string): void {\n if (!date || typeof date !== 'string') {\n throw new FMPError('Date is required and must be a string');\n }\n\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(date)) {\n throw new FMPError('Invalid date format. Use YYYY-MM-DD format');\n }\n\n const parsedDate = new Date(date);\n if (isNaN(parsedDate.getTime())) {\n throw new FMPError('Invalid date');\n }\n}\n\n/**\n * Validate period parameter\n */\nexport function validatePeriod(period: string): void {\n if (period && !['annual', 'quarter'].includes(period)) {\n throw new FMPError('Period must be either \"annual\" or \"quarter\"');\n }\n}\n\n/**\n * Validate limit parameter\n */\nexport function validateLimit(limit: number): void {\n if (limit !== undefined && (typeof limit !== 'number' || limit < 1 || limit > 1000)) {\n throw new FMPError('Limit must be a number between 1 and 1000');\n }\n}\n\n/**\n * Validate page parameter\n */\nexport function validatePage(page: number): void {\n if (page !== undefined && (typeof page !== 'number' || page < 0)) {\n throw new FMPError('Page must be a non-negative number');\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse, DateRangeParams } from '@/types/common';\nimport { HistoricalPriceResponse } from '@/types/quote';\nimport {\n MarketCap,\n StockSplitResponse,\n StockQuote,\n StockDividendResponse,\n StockRealTimePrice,\n StockRealTimePriceFull,\n StockListResponse,\n CompaniesPriceListResponse,\n} from '@/types/stock';\n\nexport class StockEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get real-time stock quote\n * @deprecated Use `fmp.quote.getQuote()` instead. This method will be removed in version 0.1.0.\n * @param symbol - The stock symbol to get the quote for\n * @returns This endpoint gives you the latest bid and ask prices for a stock, as well as the volume and last trade price in real time.\n */\n async getQuote({ symbol }: { symbol: string }): Promise<APIResponse<StockQuote>> {\n console.warn(\n '⚠️ StockEndpoints.getQuote() is deprecated. Use fmp.quote.getQuote() instead. This method will be removed in version 0.1.0.',\n );\n return this.client.getSingle(`/quote/${symbol}`, 'v3');\n }\n\n /**\n * Get historical stock prices\n * @deprecated Use `fmp.quote.getHistoricalPrice()` instead. This method will be removed in version 0.1.0.\n * @param symbol - The stock symbol to get the historical prices for\n * @param from - The start date to get the historical prices for\n * @param to - The end date to get the historical prices for\n * @returns The FMP Daily Chart endpoint provides daily stock data for a specified company, including opening, high, low, and closing prices, with a default limit of 5 years of historical data. To access data beyond this limit, use the from and to parameters for custom date ranges, each with a 5-year limit\n */\n async getHistoricalPrice({\n symbol,\n from,\n to,\n }: {\n symbol: string;\n from?: string;\n to?: string;\n }): Promise<APIResponse<HistoricalPriceResponse>> {\n console.warn(\n '⚠️ StockEndpoints.getHistoricalPrice() is deprecated. Use fmp.quote.getHistoricalPrice() instead. This method will be removed in version 0.1.0.',\n );\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.getSingle(`/historical-price-full/${symbol}`, 'v3', params);\n }\n\n /**\n * Get market cap\n * https://site.financialmodelingprep.com/developer/docs#market-cap-company-information\n * @param symbol - The stock symbol to get the market cap for\n * @returns The FMP Market Cap endpoint provides the current market capitalization of a company. Market cap is a measure of the size and relative importance of a company in the stock market. It is calculated by multiplying the current share price by the number of outstanding shares.\n */\n async getMarketCap({ symbol }: { symbol: string }): Promise<APIResponse<MarketCap>> {\n return this.client.getSingle(`/market-capitalization/${symbol}`, 'v3');\n }\n\n /**\n * Get stock splits\n * https://site.financialmodelingprep.com/developer/docs#splits-historical-splits\n * @param symbol - The stock symbol to get the splits for\n * @returns A list of historical stock splits for publicly traded companies, including the date of the stock split, the split ratio, and the type of stock split.\n */\n async getStockSplits({ symbol }: { symbol: string }): Promise<APIResponse<StockSplitResponse>> {\n return this.client.get(`/historical-price-full/stock_split/${symbol}`, 'v3');\n }\n\n /**\n * Get dividend history\n * https://site.financialmodelingprep.com/developer/docs#dividends-historical-dividends\n * @param symbol - The stock symbol to get the dividend history for\n * @returns A list of historical dividend payments for publicly traded companies, including the date of the dividend payment, the ex-dividend date, and the dividend per share.\n */\n async getDividendHistory({\n symbol,\n }: {\n symbol: string;\n }): Promise<APIResponse<StockDividendResponse>> {\n return this.client.getSingle(`/historical-price-full/stock_dividend/${symbol}`, 'v3');\n }\n\n /**\n * Get stock real time price\n * @param symbol - The stock symbol to get the real time price for\n * @returns The real time price for the stock\n */\n async getRealTimePrice({\n symbols,\n }: {\n symbols: string[];\n }): Promise<APIResponse<StockRealTimePrice[]>> {\n const url = `stock/real-time-price/${symbols.join(',')}`;\n const result = await this.client.get(url, 'v3');\n if (result.success && result.data && !Array.isArray(result.data)) {\n const data = result.data as\n | StockListResponse<StockRealTimePrice>\n | CompaniesPriceListResponse<StockRealTimePrice>\n | StockRealTimePrice;\n\n // Check for companiesPriceList (when symbols are provided)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'companiesPriceList' in data &&\n Array.isArray(data.companiesPriceList)\n ) {\n const filteredData = data.companiesPriceList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // Check for stockList (when no symbols are provided - all stocks)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'stockList' in data &&\n Array.isArray(data.stockList)\n ) {\n const filteredData = data.stockList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // fallback: wrap single object in array if it has a symbol\n if ((data as StockRealTimePrice).symbol) {\n return { ...result, data: [data as StockRealTimePrice] };\n }\n\n if (symbols.length === 1) {\n console.warn(`No real-time price data found for symbol: ${symbols[0]}`);\n }\n return { ...result, data: [] };\n }\n const filteredData = (result.data as StockRealTimePrice[]).filter(item => item && item.symbol);\n return { ...result, data: filteredData };\n }\n\n /**\n * Get stock real time price full\n * https://site.financialmodelingprep.com/developer/docs#real-time-full-price-quote\n * @param symbols - The stock symbols to get the real time price for\n * @returns The real time price for the stocks\n */\n async getRealTimePriceForMultipleStocks({\n symbols,\n }: {\n symbols: string[];\n }): Promise<APIResponse<StockRealTimePriceFull[]>> {\n const url = `stock/full/real-time-price/${symbols.join(',')}`;\n const result = await this.client.get(url, 'v3');\n if (result.success && result.data && !Array.isArray(result.data)) {\n const data = result.data as\n | StockListResponse<StockRealTimePriceFull>\n | CompaniesPriceListResponse<StockRealTimePriceFull>\n | StockRealTimePriceFull;\n\n // Check for companiesPriceList (when symbols are provided)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'companiesPriceList' in data &&\n Array.isArray(data.companiesPriceList)\n ) {\n const filteredData = data.companiesPriceList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // Check for stockList (when no symbols are provided - all stocks)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'stockList' in data &&\n Array.isArray(data.stockList)\n ) {\n const filteredData = data.stockList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n if ((data as StockRealTimePriceFull).symbol) {\n return { ...result, data: [data as StockRealTimePriceFull] };\n }\n\n if (symbols.length === 1) {\n console.warn(`No full real-time price data found for symbol: ${symbols[0]}`);\n }\n return { ...result, data: [] };\n }\n const filteredData = (result.data as StockRealTimePriceFull[]).filter(\n item => item && item.symbol,\n );\n return { ...result, data: filteredData };\n }\n}\n","import { APIResponse } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n FinancialStatementsParams,\n KeyMetrics,\n FinancialRatios,\n EnterpriseValue,\n CashflowGrowth,\n IncomeGrowth,\n BalanceSheetGrowth,\n FinancialGrowth,\n IncomeStatement,\n BalanceSheet,\n CashFlowStatement,\n EarningsSurprises,\n EarningsHistorical,\n} from '@/types/financial';\n\nexport class FinancialEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get income statement\n * https://site.financialmodelingprep.com/developer/docs#income-statements-financial-statements\n * @param symbol - The stock symbol to get the income statement for\n * @param period - The period to get the income statement for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns FMP's Income Statement API provides access to real-time income statement data for a wide range of companies, including public companies, private companies, and ETFs. This data can be used to track a company's profitability over time, to compare a company to its competitors, and to identify trends in a company's business.\n */\n async getIncomeStatement({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<IncomeStatement[]>> {\n return this.client.get(`/income-statement/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get balance sheet\n * https://site.financialmodelingprep.com/developer/docs#balance-sheet-statements-financial-statements\n * @param symbol - The stock symbol to get the balance sheet for\n * @param period - The period to get the balance sheet for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns The balance sheet is a financial statement that displays a company's total assets, liabilities, and shareholder equity over a specific timeframe (quarterly or yearly). Investors can use this statement to determine if the company can fund its operations, meet its debt obligations, and pay a dividend.\n */\n async getBalanceSheet({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<BalanceSheet[]>> {\n return this.client.get(\n `/balance-sheet-statement/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get cash flow statement\n * https://site.financialmodelingprep.com/developer/docs#cashflow-statements-financial-statements\n * @param symbol - The stock symbol to get the cash flow statement for\n * @param period - The period to get the cash flow statement for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns The cash flow statement is a financial statement that highlights how cash moves through the company, including both cash inflows and outflows. This statement shows the cash flows in 3 main categories \"Operating Cash Flows\", \"Investing Cash Flows\", and \"Financing Cash Flows\", which help investors to understand if the company is making money or losing money by conducting business.\n */\n async getCashFlowStatement({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<CashFlowStatement[]>> {\n return this.client.get(`/cash-flow-statement/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get key metrics\n * https://site.financialmodelingprep.com/developer/docs#key-metrics-statement-analysis\n * @param symbol - The stock symbol to get the key metrics for\n * @param period - The period to get the key metrics for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get key financial metrics for a company, including revenue, net income, and price-to-earnings ratio (P/E ratio). Assess a company's financial performance and compare it to its competitors.\n */\n async getKeyMetrics({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<KeyMetrics[]>> {\n return this.client.get(`/key-metrics/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get financial ratios\n * https://site.financialmodelingprep.com/developer/docs#ratios-statement-analysis\n * @param symbol - The stock symbol to get the financial ratios for\n * @param period - The period to get the financial ratios for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get financial ratios for a company, such as the P/B ratio and the ROE. Assess a company's financial health and compare it to its competitors.\n */\n async getFinancialRatios({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<FinancialRatios[]>> {\n return this.client.get(`/ratios/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get enterprise value\n * https://site.financialmodelingprep.com/developer/docs#enterprise-values-statement-analysis\n * @param symbol - The stock symbol to get the enterprise value for\n * @param period - The period to get the enterprise value for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get the enterprise value of a company, which is the total value of a company, including its equity and debt. Assess a company's overall value and compare it to its peers.\n */\n async getEnterpriseValue({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<EnterpriseValue[]>> {\n return this.client.get(`/enterprise-value/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get cashflow growth\n * https://site.financialmodelingprep.com/developer/docs#cashflow-growth-statement-analysis\n * @param symbol - The stock symbol to get the cashflow growth for\n * @param period - The period to get the cashflow growth for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get the cash flow growth rate for a company. Measure how quickly a company's cash flow is growing.\n */\n async getCashflowGrowth({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<CashflowGrowth[]>> {\n return this.client.get(\n `/cash-flow-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get income growth\n * https://site.financialmodelingprep.com/developer/docs#income-growth-statement-analysis\n * @param symbol - The stock symbol to get the income growth for\n * @param period - The period to get the income growth for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get the income growth rate for a company. Measure how quickly a company's income is growing.\n */\n async getIncomeGrowth({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<IncomeGrowth[]>> {\n return this.client.get(\n `/income-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get balance sheet growth\n * https://site.financialmodelingprep.com/developer/docs#balance-sheet-growth-statement-analysis\n * @param symbol - The stock symbol to get the balance sheet growth for\n * @param period - The period to get the balance sheet growth for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Get the balance sheet growth rate for a company. Measure how quickly a company's assets and liabilities are growing.\n */\n async getBalanceSheetGrowth({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<BalanceSheetGrowth[]>> {\n return this.client.get(\n `/balance-sheet-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get financial growth\n * https://site.financialmodelingprep.com/developer/docs#financial-growth-statement-analysis\n * @param symbol - The stock symbol to get the financial growth for\n * @param period - The period to get the financial growth for (annual or quarter)\n * @param limit - The number of periods to get\n * @returns Financial Growth Get the financial growth rate for a company. Measure how quickly a company's overall financial performance is improving.\n */\n async getFinancialGrowth({\n symbol,\n period = 'annual',\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<FinancialGrowth[]>> {\n return this.client.get(`/financial-growth/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get earnings historical\n * https://site.financialmodelingprep.com/developer/docs#earnings-historical-earnings\n * @param symbol - The stock symbol to get the earnings historical for\n * @param limit - The number of periods to get\n * @returns A list of historical & upcoming earnings announcements for a specific company, including the date, estimated EPS, and actual EPS.\n */\n async getEarningsHistorical({\n symbol,\n limit = 5,\n }: FinancialStatementsParams): Promise<APIResponse<EarningsHistorical[]>> {\n return this.client.get(`/historical/earning_calendar/${symbol}?limit=${limit}`, 'v3');\n }\n\n /**\n * Get earnings surprises\n * https://site.financialmodelingprep.com/developer/docs#earnings-surprises-earnings\n * @param symbol - The stock symbol to get the earnings surprises for\n * @param limit - The number of periods to get\n * @returns A list of earnings announcements for publicly traded companies that were either positive or negative surprises. This endpoint includes the date of the earnings announcement, the estimated EPS, the actual EPS, and the earnings surprise.\n */\n async getEarningsSurprises({\n symbol,\n }: FinancialStatementsParams): Promise<APIResponse<EarningsSurprises[]>> {\n return this.client.get(`/earnings-surprises/${symbol}`, 'v3');\n }\n}\n","// Forex endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, QueryParams, SymbolParams } from '@/types/common';\nimport { HistoricalPriceResponse } from '@/types/quote';\nimport { ForexQuote } from '@/types/forex';\n\nexport class ForexEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get forex quote\n * @deprecated Use `fmp.quote.getQuote()` instead. This method will be removed in version 0.1.0.\n * @param params - Parameters for the forex quote request\n * @returns Forex quote data\n */\n async getQuote(params: SymbolParams): Promise<APIResponse<ForexQuote[]>> {\n console.warn(\n '⚠️ ForexEndpoints.getQuote() is deprecated. Use fmp.quote.getQuote() instead. This method will be removed in version 0.1.0.',\n );\n return this.client.get('/quote', 'v3', params);\n }\n\n /**\n * Get historical forex prices\n * @deprecated Use `fmp.quote.getHistoricalPrice()` instead. This method will be removed in version 0.1.0.\n * @param symbol - The forex symbol to get the historical prices for\n * @param from - The start date to get the historical prices for\n * @param to - The end date to get the historical prices for\n * @returns Historical forex price data\n */\n async getHistoricalPrice({\n symbol,\n from,\n to,\n }: {\n symbol: string;\n from?: string;\n to?: string;\n }): Promise<APIResponse<HistoricalPriceResponse>> {\n console.warn(\n '⚠️ ForexEndpoints.getHistoricalPrice() is deprecated. Use fmp.quote.getHistoricalPrice() instead. This method will be removed in version 0.1.0.',\n );\n const params: QueryParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get(`/historical-price-full/${symbol}`, 'v3', params);\n }\n}\n","// Cryptocurrency endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, DateRangeParams } from '@/types/common';\nimport { HistoricalPriceResponse } from '@/types/quote';\nimport { CryptoQuote } from '@/types/crypto';\n\nexport class CryptoEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get crypto quote\n * @deprecated Use `fmp.quote.getQuote()` instead. This method will be removed in version 0.1.0.\n * @param symbol - The crypto symbol to get the quote for\n * @returns Crypto quote data\n */\n async getQuote({ symbol }: { symbol: string }): Promise<APIResponse<CryptoQuote | null>> {\n console.warn(\n '⚠️ CryptoEndpoints.getQuote() is deprecated. Use fmp.quote.getQuote() instead. This method will be removed in version 0.1.0.',\n );\n return this.client.getSingle(`/quote/${symbol}`, 'v3');\n }\n\n /**\n * Get historical crypto prices\n * @deprecated Use `fmp.quote.getHistoricalPrice()` instead. This method will be removed in version 0.1.0.\n * @param symbol - The crypto symbol to get the historical prices for\n * @param from - The start date to get the historical prices for\n * @param to - The end date to get the historical prices for\n * @returns Provides daily price data for all cryptocurrencies that are traded on exchanges around the world.\n */\n async getHistoricalPrice({\n symbol,\n from,\n to,\n }: {\n symbol: string;\n from?: string;\n to?: string;\n }): Promise<APIResponse<HistoricalPriceResponse>> {\n console.warn(\n '⚠️ CryptoEndpoints.getHistoricalPrice() is deprecated. Use fmp.quote.getHistoricalPrice() instead. This method will be removed in version 0.1.0.',\n );\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.getSingle(`/historical-price-full/${symbol}`, 'v3', params);\n }\n}\n","// ETF endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, SymbolParams } from '@/types/common';\nimport {\n ETFProfile,\n ETFHolding,\n ETFHoldingDates,\n ETFHolder,\n ETFStockExposure,\n ETFWeighting,\n ETFCountryWeighting,\n} from '@/types/etf';\n\nexport class ETFEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get ETF holding dates\n * https://site.financialmodelingprep.com/developer/docs#etf-holding-dates-etf-holdings\n * @param symbol - The symbol of the ETF to get the holding dates for\n * @returns The FMP ETF Holding Dates endpoint provides a list of the dates on which ETF holdings are updated. For example, an investor may want to know when an ETF's holdings are updated in order to make sure that they are still aligned with their investment goals.\n */\n async getHoldingDates({ symbol }: SymbolParams): Promise<APIResponse<ETFHoldingDates[]>> {\n const params: { symbol?: string } = {};\n if (symbol) params.symbol = symbol;\n return this.client.get('/etf-holdings/portfolio-date', 'v4', params);\n }\n\n /**\n * Get ETF holdings\n * https://site.financialmodelingprep.com/developer/docs#etf-holdings-etf-holdings\n * @param symbol - The symbol of the ETF to get the holdings for\n * @param date - The date to get the holdings for\n * @returns The FMP ETF Holdings endpoint provides a list of all the institutional investors that own shares of an ETF. For example, an investor may want to know which ETF has the highest exposure to a particular industry or sector.\n */\n async getHoldings({\n symbol,\n date,\n }: {\n symbol: string;\n date: string;\n }): Promise<APIResponse<ETFHolding[]>> {\n const params: { symbol?: string; date?: string } = {};\n if (symbol) params.symbol = symbol;\n if (date) params.date = date;\n return this.client.get('/etf-holdings', 'v4', params);\n }\n\n /**\n * Get ETF holder\n * https://site.financialmodelingprep.com/developer/docs#etf-holder-etf-holdings\n * @param symbol - The symbol of the ETF to get the holder for\n * @returns This endpoint returns all stocks held by a specific ETF. Assets, share number, and weight are among the fields returned. For example you can get components of SPY, VOO and more.\n */\n async getHolder({ symbol }: SymbolParams): Promise<APIResponse<ETFHolder[]>> {\n return this.client.get(`/etf-holder/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF profile\n * https://site.financialmodelingprep.com/developer/docs#etf-information-etf-holdings\n * @param symbol - The symbol of the ETF to get the profile for\n * @returns The FMP ETF Information endpoint provides basic information about an ETF, such as its ticker symbol, name, expense ratio, and asset under management. For example, an investor may want to compare the expense ratios of different ETFs to find the one that is most cost-effective.\n */\n async getProfile({ symbol }: SymbolParams): Promise<APIResponse<ETFProfile>> {\n const params: { symbol?: string } = {};\n if (symbol) params.symbol = symbol;\n return this.client.getSingle('/etf-info', 'v4', params);\n }\n\n /**\n * Get ETF sector weighting\n * https://site.financialmodelingprep.com/developer/docs#etf-sector-weighting-etf-holdings\n * @param symbol - The symbol of the ETF to get the sector exposure for\n * @returns The FMP ETF Sector Weighting endpoint provides a breakdown of the percentage of an ETF's assets that are invested in each sector. For example, an investor may want to invest in an ETF that has a high exposure to the technology sector if they believe that the technology sector is poised for growth.\n */\n async getSectorWeighting({ symbol }: SymbolParams): Promise<APIResponse<ETFWeighting[]>> {\n return this.client.get(`/etf-sector-weightings/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF country weighting\n * https://site.financialmodelingprep.com/developer/docs#etf-country-weighting-etf-holdings\n * @param symbol - The symbol of the ETF to get the country weighting for\n * @returns The FMP ETF Country Weighting endpoint provides a breakdown of the percentage of an ETF's assets that are invested in each country. For example, an investor may want to invest in an ETF that has a high exposure to China if they believe that the Chinese economy is poised for growth.\n */\n async getCountryWeighting({ symbol }: SymbolParams): Promise<APIResponse<ETFCountryWeighting[]>> {\n return this.client.get(`/etf-country-weightings/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF Stock exposure\n * https://site.financialmodelingprep.com/developer/docs#etf-sector-exposure-etf-holdings\n * @param symbol - The symbol of the ETF to get the stock exposure for\n * @returns This endpoint returns asset exposure from all ETFs that have it in their holdings. It has properties like market value, share number or weight percentage. It can be useful for looking up stock you like to check what ETF has it on their portfolio.\n */\n async getStockExposure({ symbol }: SymbolParams): Promise<APIResponse<ETFStockExposure[]>> {\n return this.client.get(`/etf-stock-exposure/${symbol}`, 'v3');\n }\n}\n","// Mutual fund endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, SymbolParams } from '@/types/common';\nimport { MutualFundQuote, MutualFundHolding } from '@/types/mutual-fund';\n\nexport class MutualFundEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get mutual fund quote\n * @deprecated Use `fmp.quote.getQuote()` instead. This method will be removed in a future release.\n * @param params - Parameters for the mutual fund quote request\n * @returns Mutual fund quote data\n */\n async getQuote(params: SymbolParams): Promise<APIResponse<MutualFundQuote[]>> {\n return this.client.get('/quote', 'v3', params);\n }\n\n /**\n * Get mutual fund holders\n * https://site.financialmodelingprep.com/developer/docs#mutual-fund-holder-mutual-funds-holdings\n * @param symbol - The symbol of the mutual fund to get the holders for\n * @returns Mutual fund holders data\n */\n async getHolders({ symbol }: SymbolParams): Promise<APIResponse<MutualFundHolding[]>> {\n return this.client.get(`/mutual-fund-holder/${symbol}`, 'v3');\n }\n}\n","// Economic endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, DateRangeParams } from '@/types/common';\nimport { TreasuryRate, EconomicIndicator, EconomicIndicatorParams } from '@/types/economic';\n\nexport class EconomicEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get treasury rates\n * https://site.financialmodelingprep.com/developer/docs#treasury-rates-economics-data\n * @param from - The start date to get the treasury rates for\n * @param to - The end date to get the treasury rates for\n * @returns Treasury rates data\n */\n async getTreasuryRates(params: DateRangeParams): Promise<APIResponse<TreasuryRate[]>> {\n const { from, to } = params;\n\n const queryParams: DateRangeParams = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n return this.client.get('/treasury', 'v4', queryParams);\n }\n\n /**\n * Get economic indicators\n * https://site.financialmodelingprep.com/developer/docs#economic-indicators-economics-data\n * @param name - GDP, realGDP, nominalPotentialGDP, realGDPPerCapita, federalFunds, CPI, inflationRate, inflation, retailSales, consumerSentiment, durableGoods, unemploymentRate, totalNonfarmPayroll, initialClaims, industrialProductionTotalIndex, newPrivatelyOwnedHousingUnitsStartedTotalUnits, totalVehicleSales, retailMoneyFunds, smoothedUSRecessionProbabilities, 3MonthOr90DayRatesAndYieldsCertificatesOfDeposit, commercialBankInterestRateOnCreditCardPlansAllAccounts, 30YearFixedRateMortgageAverage, 15YearFixedRateMortgageAverage\n * @param from - The start date to get the economic indicators for\n * @param to - The end date to get the economic indicators for\n * @returns Provides real-time and historical economic data for a variety of economic indicators, such as GDP, unemployment, and inflation.\n */\n async getEconomicIndicators(\n params: EconomicIndicatorParams,\n ): Promise<APIResponse<EconomicIndicator[]>> {\n const { name, from, to } = params;\n\n const queryParams: EconomicIndicatorParams = { name };\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get(`/economic`, 'v4', queryParams);\n }\n}\n","// Market endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n MarketHours,\n MarketPerformance,\n MarketSectorPerformance,\n MarketIndex,\n} from '@/types/market';\n\nexport class MarketEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get market hours\n */\n async getMarketHours(): Promise<APIResponse<MarketHours>> {\n return this.client.get('/market-hours', 'v3');\n }\n\n /**\n * Get market performance\n */\n async getMarketPerformance(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/market-performance', 'v3');\n }\n\n /**\n * Get top gainers\n * https://site.financialmodelingprep.com/developer/docs#market-biggest-gainers-market-overview\n * @returns The FMP Market Biggest Gainers endpoint provides a list of the stocks that have gained the most value on a given day. This information can be used by investors to identify stocks that are momentum and to potential investment opportunities.\n */\n async getGainers(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/gainers', 'v3');\n }\n\n /**\n * Get top losers\n * https://site.financialmodelingprep.com/developer/docs#market-biggest-losers-market-overview\n * @returns The FMP Market Biggest Losers endpoint provides a list of the stocks that have lost the most value on a given day. This information can be used by investors to identify stocks that are underperforming and to potential trading opportunities.\n */\n async getLosers(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/losers', 'v3');\n }\n\n /**\n * Get most active stocks\n */\n async getMostActive(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/actives', 'v3');\n }\n\n /**\n * Get sector performance\n * https://site.financialmodelingprep.com/developer/docs#sector-performance-market-overview\n * @returns The FMP Sector Performance endpoint provides the performance of each sector of the stock market over a specified period of time. This information can be used by investors to identify sectors that are outperforming or underperforming the market.\n */\n async getSectorPerformance(): Promise<APIResponse<MarketSectorPerformance[]>> {\n return this.client.get('/sector-performance', 'v3');\n }\n\n /**\n * Get market indices\n * https://site.financialmodelingprep.com/developer/docs#market-index-market-overview\n * @returns The FMP Market Index endpoint provides a list of all the major stock market indices, such as the S&P 500, the Dow Jones Industrial Average, and the Nasdaq Composite Index. This information can be used by investors to track the performance of the overall stock market and to identify sectors and industries that are outperforming or underperforming the market.\n */\n async getMarketIndex(): Promise<APIResponse<MarketIndex[]>> {\n return this.client.get('/quotes/index', 'v3');\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse } from '@/types';\nimport { StockList, ETFList, CryptoList, ForexList, AvailableIndexesList } from '@/types/list';\n\nexport class ListEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get stock list\n * https://site.financialmodelingprep.com/developer/docs#symbol-list-stock-list\n * @returns The stock list\n */\n async getStockList(): Promise<APIResponse<StockList[]>> {\n return this.client.get('/stock/list');\n }\n\n /**\n * Get ETF list\n * https://site.financialmodelingprep.com/developer/docs#exchange-traded-fund-search-stock-list\n * @returns The ETF list\n */\n async getETFList(): Promise<APIResponse<ETFList[]>> {\n return this.client.get('/etf/list');\n }\n\n /**\n * Get crypto list\n * https://site.financialmodelingprep.com/developer/docs#cryptocurrencies-list-crypto\n * @returns The crypto list\n */\n async getCryptoList(): Promise<APIResponse<CryptoList[]>> {\n return this.client.get('/symbol/available-cryptocurrencies');\n }\n\n /**\n * Get forex list\n * https://site.financialmodelingprep.com/developer/docs#forex-list-forex\n * @returns The forex list\n */\n async getForexList(): Promise<APIResponse<ForexList[]>> {\n return this.client.get('/symbol/available-forex-currency-pairs');\n }\n\n /**\n * Get available indexes list\n * https://site.financialmodelingprep.com/developer/docs#available-indexes\n * @returns The available indexes list\n */\n async getAvailableIndexes(): Promise<APIResponse<AvailableIndexesList[]>> {\n return this.client.get('/symbol/available-indexes');\n }\n}\n","import { APIResponse, DateRangeParams } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n EarningsCalendar,\n DividendsCalendar,\n EconomicsCalendar,\n IPOCalendar,\n SplitsCalendar,\n EarningsConfirmed,\n} from '@/types/calendar';\n\nexport class CalendarEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get earnings calendar\n * https://site.financialmodelingprep.com/developer/docs#earnings-calendar-earnings\n * @param from - The start date to get the earnings calendar for\n * @param to - The end date to get the earnings calendar for\n * @returns The earnings calendar\n */\n async getEarningsCalendar({ from, to }: DateRangeParams = {}): Promise<\n APIResponse<EarningsCalendar[]>\n > {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/earning_calendar', 'v3', params);\n }\n\n /**\n * Get earnings confirmed\n * https://site.financialmodelingprep.com/developer/docs#earnings-confirmed-earnings\n * @param from - The start date to get the earnings confirmed for\n * @param to - The end date to get the earnings confirmed for\n * @returns The earnings confirmed\n */\n async getEarningsConfirmed({ from, to }: DateRangeParams = {}): Promise<\n APIResponse<EarningsConfirmed[]>\n > {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/earning-calendar-confirmed', 'v4', params);\n }\n\n /**\n * Get dividends calendar\n * https://site.financialmodelingprep.com/developer/docs#dividends-calendar-dividends\n * @param from - The start date to get the dividends calendar for\n * @param to - The end date to get the dividends calendar for\n * @returns The dividends calendar\n */\n async getDividendsCalendar({ from, to }: DateRangeParams = {}): Promise<\n APIResponse<DividendsCalendar[]>\n > {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/stock_dividend_calendar', 'v3', params);\n }\n\n /**\n * Get economics calendar\n * https://site.financialmodelingprep.com/developer/docs#economics-calendar-economics-data\n * @param from - The start date to get the economics calendar for\n * @param to - The end date to get the economics calendar for\n * @returns The economics calendar\n */\n async getEconomicsCalendar({ from, to }: DateRangeParams = {}): Promise<\n APIResponse<EconomicsCalendar[]>\n > {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/economic_calendar', 'v3', params);\n }\n\n /**\n * Get IPO calendar\n * https://site.financialmodelingprep.com/developer/docs#ipo-calender-by-ipo-calendar\n * @param from - The start date to get the IPO calendar for\n * @param to - The end date to get the IPO calendar for\n * @returns The IPO calendar\n */\n async getIPOCalendar({ from, to }: DateRangeParams = {}): Promise<APIResponse<IPOCalendar[]>> {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/ipo_calendar', 'v3', params);\n }\n\n /**\n * Get stock splits calendar\n * https://site.financialmodelingprep.com/developer/docs#splits-calendar-splits\n * @param from - The start date to get the stock splits calendar for\n * @param to - The end date to get the stock splits calendar for\n * @returns The stock splits calendar\n */\n async getSplitsCalendar({ from, to }: DateRangeParams = {}): Promise<\n APIResponse<SplitsCalendar[]>\n > {\n const params: DateRangeParams = {};\n if (from) params.from = from;\n if (to) params.to = to;\n\n return this.client.get('/stock_split_calendar', 'v3', params);\n }\n}\n","import { APIResponse } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n CompanyNotes,\n CompanyProfile,\n CompanyTranscriptData,\n EarningsCallTranscript,\n ExecutiveCompensation,\n HistoricalEmployeeCount,\n HistoricalSharesFloat,\n SharesFloat,\n} from '@/types/company';\n\nexport class CompanyEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get company profile\n * https://site.financialmodelingprep.com/developer/docs#company-profile-company-information\n * @param symbol - The stock symbol to get the profile for\n * @returns Get a comprehensive overview of a company with our Company Profile endpoint. This endpoint provides key information such as price, beta, market capitalization, description, headquarters, and more.\n */\n async getCompanyProfile({ symbol }: { symbol: string }): Promise<APIResponse<CompanyProfile>> {\n return this.client.getSingle(`/profile/${symbol}`, 'v3');\n }\n\n /**\n * Get executive compensation\n * https://site.financialmodelingprep.com/developer/docs#executive-compensation-company-information\n * @param symbol - The stock symbol to get the executive compensation for\n * @returns Understand how a company compensates its executives with our Executive Compensation endpoint. This endpoint provides information such as salary, bonus, and stock options for each executive.\n */\n async getExecutiveCompensation({\n symbol,\n }: {\n symbol: string;\n }): Promise<APIResponse<ExecutiveCompensation[]>> {\n const params: { symbol: string } = { symbol };\n\n return this.client.get(`/governance/executive_compensation`, 'v4', params);\n }\n\n /**\n * Get company notes\n * https://site.financialmodelingprep.com/developer/docs#company-notes-company-information\n * @param symbol - The stock symbol to get the notes for\n * @returns Stay up-to-date on a company's financial condition, operations, and risks with our Company Notes endpoint. This endpoint provides information about notes reported by a company in their financial statements.\n */\n async getCompanyNotes({ symbol }: { symbol: string }): Promise<APIResponse<CompanyNotes[]>> {\n const params: { symbol: string } = { symbol };\n\n return this.client.get(`/company-notes`, 'v4', params);\n }\n\n /**\n * Get historical employee count\n * https://site.financialmodelingprep.com/developer/docs#historical-employee-company-information\n * @param symbol - The stock symbol to get the historical employee count for\n * @returns Track a company's employee count over time with our Historical Employee Count endpoint. This endpoint provides information about the number of employees a company has had each year.\n */\n async getHistoricalEmployeeCount({\n symbol,\n }: {\n symbol: string;\n }): Promise<APIResponse<HistoricalEmployeeCount[]>> {\n const params: { symbol: string } = { symbol };\n\n return this.client.get(`/historical/employee_count`, 'v4', params);\n }\n\n /**\n * Get shares float\n * https://site.financialmodelingprep.com/developer/docs#company-share-float-share-float\n * @param symbol - The stock symbol to get the shares float for\n * @returns The FMP Company Share Float endpoint provides the total number of shares that are publicly traded for a given company. This is also known as the company's float. The float is calculated by subtracting the number of restricted shares from the total number of outstanding shares.\n */\n async getSharesFloat({ symbol }: { symbol: string }): Promise<APIResponse<SharesFloat>> {\n const params: { symbol: string } = { symbol };\n\n return this.client.getSingle(`/shares_float`, 'v4', params);\n }\n\n /**\n * Get historical shares float\n * https://site.financialmodelingprep.com/developer/docs#company-historical-share-float\n * @param symbol - The stock symbol to get the historical shares float for\n * @returns The FMP Historical Share Float endpoint provides historical data on the number of shares that are publicly traded for a given company. This is also known as the company's float. The float is calculated by subtracting the number of restricted shares from the total number of outstanding shares.\n */\n async getHistoricalSharesFloat({\n symbol,\n }: {\n symbol: string;\n }): Promise<APIResponse<HistoricalSharesFloat[]>> {\n const params: { symbol: string } = { symbol };\n\n return this.client.get(`/historical/shares_float`, 'v4', params);\n }\n\n /**\n * Get earnings call transcript\n * https://site.financialmodelingprep.com/developer/docs#earnings-transcript-earnings-transcripts\n * @param symbol - The stock symbol to get the earnings call transcript for\n * @param year - The year of the earnings call\n * @param quarter - The quarter of the earnings call\n * @returns The FMP Earnings Call Transcript endpoint provides the transcript of a company's earnings call.\n */\n async getEarningsCallTranscript({\n symbol,\n year,\n quarter,\n }: {\n symbol: string;\n year: number;\n quarter: number;\n }): Promise<APIResponse<EarningsCallTranscript[]>> {\n const params: { year: number; quarter: number } = { year, quarter };\n return this.client.getSingle(`/earning_call_transcript/${symbol}`, 'v3', params);\n }\n\n /**\n * Get company transcript dates\n * https://site.financialmodelingprep.com/developer/docs#transcript-dates-earnings-transcripts\n * @param symbol - The stock symbol to get the transcript data for\n * @returns The FMP Company Transcript Data endpoint provides the transcript data for a company's earnings call.\n */\n async getCompanyTranscriptData({\n symbol,\n }: {\n symbol: string;\n }): Promise<APIResponse<CompanyTranscriptData[]>> {\n const params: { symbol: string } = { symbol };\n return this.client.getSingle(`/earning_call_transcript`, 'v4', params);\n }\n}\n","// Unified quote endpoints for FMP API - handles stocks, crypto, forex, commodities, and ETFs\n\nimport { FMPClient } from '@/client';\nimport { APIResponse, DateRangeParams } from '@/types/common';\nimport {\n Quote,\n QuoteParams,\n HistoricalPriceParams,\n HistoricalPriceResponse,\n HistoricalPriceData,\n IntradayParams,\n} from '@/types/quote';\n\nexport class QuoteEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get quote for any asset type (stock, crypto, forex, commodity, ETF)\n * @param params - Parameters for the quote request\n * @returns Quote data for the specified asset\n */\n async getQuote(params: QuoteParams): Promise<APIResponse<Quote>> {\n const { symbol } = params;\n\n // All asset types use the same /quote/{symbol} endpoint\n return this.client.getSingle(`/quote/${symbol}`, 'v3');\n }\n\n /**\n * Get historical prices for any asset type\n * @param params - Parameters for the historical price request\n * @returns Historical price data for the specified asset\n */\n async getHistoricalPrice(\n params: HistoricalPriceParams,\n ): Promise<APIResponse<HistoricalPriceResponse>> {\n const { symbol, from, to } = params;\n\n const queryParams: DateRangeParams = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.getSingle(`/historical-price-full/${symbol}`, 'v3', queryParams);\n }\n\n /**\n * Get multiple quotes for any asset type\n * @param symbols - Array of symbols to get quotes for\n * @returns Array of quote data\n */\n async getQuotes(symbols: string[]): Promise<APIResponse<Quote[]>> {\n const symbolsParam = symbols.join(',');\n return this.client.get(`/quote/${symbolsParam}`, 'v3');\n }\n\n /**\n * Get intraday data for any asset type\n * @param params - Parameters for the intraday request\n * @returns Intraday price data for the specified asset\n */\n async getIntraday(params: IntradayParams): Promise<APIResponse<HistoricalPriceData[]>> {\n const { symbol, interval, from, to } = params;\n\n const queryParams: DateRangeParams = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get(`/historical-chart/${interval}/${symbol}`, 'v3', queryParams);\n }\n}\n","// Senate and House trading endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n HouseTradingResponse,\n SenateHouseTradingParams,\n SenateHouseTradingRSSFeedParams,\n SenateHouseTradingByNameParams,\n SenateTradingResponse,\n SenateHouseTradingByNameResponse,\n} from '@/types/senate-house';\n\nexport class SenateHouseEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get senate trading data only\n * https://site.financialmodelingprep.com/developer/docs#senate-trading\n * @param symbol - The stock symbol to get the senate trading data for\n * @returns Senate trading data only\n */\n async getSenateTrading(\n params: SenateHouseTradingParams,\n ): Promise<APIResponse<SenateTradingResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/senate-trading`, 'v4', { symbol });\n }\n\n /** Get senate trading RSS feed\n * https://site.financialmodelingprep.com/developer/docs#senate-trading-rss-feed-senate\n * @param page - The page number to get\n * @returns Senate trading RSS feed\n */\n async getSenateTradingRSSFeed(\n params: SenateHouseTradingRSSFeedParams,\n ): Promise<APIResponse<SenateTradingResponse[]>> {\n const { page } = params;\n return this.client.get('/senate-trading-rss-feed', 'v4', { page });\n }\n\n /** Get Senate trades by name\n * https://site.financialmodelingprep.com/developer/docs/stable#senate-trading-by-name\n * @param name - The name of the senator to get the trades for\n * @returns Senate trades by name\n */\n async getSenateTradingByName(\n params: SenateHouseTradingByNameParams,\n ): Promise<APIResponse<SenateHouseTradingByNameResponse[]>> {\n const { name } = params;\n return this.client.get('/senate-trades-by-name', 'stable', { name });\n }\n\n /**\n * Get house trading data only\n * https://site.financialmodelingprep.com/developer/docs#house-disclosure\n * @param symbol - The stock symbol to get the house trading data for\n * @returns House trading data only\n */\n async getHouseTrading(\n params: SenateHouseTradingParams,\n ): Promise<APIResponse<HouseTradingResponse[]>> {\n const { symbol } = params;\n\n return this.client.get('/senate-disclosure', 'v4', { symbol });\n }\n\n /** Get house trading RSS feed\n * https://site.financialmodelingprep.com/developer/docs#house-disclosure-rss-feed-senate\n * @param page - The page number to get\n * @returns House trading RSS feed\n */\n async getHouseTradingRSSFeed(\n params: SenateHouseTradingRSSFeedParams,\n ): Promise<APIResponse<HouseTradingResponse[]>> {\n const { page } = params;\n return this.client.get('/senate-disclosure-rss-feed', 'v4', { page });\n }\n\n /** Get house trading by name\n * https://site.financialmodelingprep.com/developer/docs/stable#house-trading-by-name\n * @param name - The name of the representative to get the trades for\n * @returns House trading by name\n */\n async getHouseTradingByName(\n params: SenateHouseTradingByNameParams,\n ): Promise<APIResponse<SenateHouseTradingByNameResponse[]>> {\n const { name } = params;\n return this.client.get('/house-trades-by-name', 'stable', { name });\n }\n}\n","// Main FMP API client that combines all endpoints\n\nimport { FMPClient } from './client';\nimport { FMPConfig } from './types/common';\nimport { validateApiKey } from './utils/validation';\nimport { StockEndpoints } from './endpoints/stock';\nimport { FinancialEndpoints } from './endpoints/financial';\nimport { ForexEndpoints } from './endpoints/forex';\nimport { CryptoEndpoints } from './endpoints/crypto';\nimport { ETFEndpoints } from './endpoints/etf';\nimport { MutualFundEndpoints } from './endpoints/mutual-fund';\nimport { EconomicEndpoints } from './endpoints/economic';\nimport { MarketEndpoints } from './endpoints/market';\nimport { ListEndpoints } from './endpoints/list';\nimport { CalendarEndpoints } from './endpoints/calendar';\nimport { CompanyEndpoints } from './endpoints/company';\nimport { QuoteEndpoints } from './endpoints/quote';\nimport { SenateHouseEndpoints } from './endpoints/senate-house';\n\n/**\n * Main FMP API client that provides access to all endpoints\n *\n * @example\n * ```typescript\n * import { FMP } from 'fmp-node-api';\n *\n * const fmp = new FMP({ apiKey: 'your-api-key' });\n *\n * // Get stock quote\n * const quote = await fmp.stock.getQuote({ symbol: 'AAPL' });\n *\n * // Get financial statements\n * const incomeStatement = await fmp.financial.getIncomeStatement({\n * symbol: 'AAPL',\n * period: 'annual'\n * });\n *\n * // Get forex data\n * const forexQuote = await fmp.forex.getQuote({ symbol: 'EURUSD' });\n * ```\n */\nexport class FMP {\n public readonly stock: StockEndpoints;\n public readonly financial: FinancialEndpoints;\n public readonly forex: ForexEndpoints;\n public readonly crypto: CryptoEndpoints;\n public readonly etf: ETFEndpoints;\n public readonly mutualFund: MutualFundEndpoints;\n public readonly economic: EconomicEndpoints;\n public readonly market: MarketEndpoints;\n public readonly list: ListEndpoints;\n public readonly calendar: CalendarEndpoints;\n public readonly company: CompanyEndpoints;\n public readonly quote: QuoteEndpoints;\n public readonly senateHouse: SenateHouseEndpoints;\n\n constructor(config: FMPConfig) {\n // Validate API key at construction time\n validateApiKey(config.apiKey);\n\n const client = new FMPClient(config);\n\n this.stock = new StockEndpoints(client);\n this.financial = new FinancialEndpoints(client);\n this.crypto = new CryptoEndpoints(client);\n this.etf = new ETFEndpoints(client);\n this.market = new MarketEndpoints(client);\n this.list = new ListEndpoints(client);\n this.calendar = new CalendarEndpoints(client);\n this.company = new CompanyEndpoints(client);\n this.quote = new QuoteEndpoints(client);\n this.senateHouse = new SenateHouseEndpoints(client);\n\n this.forex = new ForexEndpoints(client);\n this.economic = new EconomicEndpoints(client);\n this.mutualFund = new MutualFundEndpoints(client);\n }\n\n /**\n * Get the underlying client instance for advanced usage\n */\n getClient(): FMPClient {\n return this.stock['client'];\n }\n}\n","// Common types used across all FMP API endpoints\n\n// Base API response wrapper - maintains backward compatibility\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n status?: number;\n}\n\n// More specific response types for better type safety (optional use)\nexport interface SuccessResponse<T> extends APIResponse<T> {\n success: true;\n data: T;\n status: number;\n}\n\nexport interface ErrorResponse extends APIResponse<never> {\n success: false;\n error: string;\n status: number;\n}\n\n// FMP API configuration\nexport interface FMPConfig {\n apiKey: string;\n baseURL?: string;\n timeout?: number;\n}\n\n// Common parameter interfaces\nexport interface SymbolParams {\n symbol: string;\n}\n\nexport interface DateRangeParams {\n from?: string;\n to?: string;\n}\n\nexport interface PaginationParams {\n limit?: number;\n page?: number;\n}\n\nexport interface PeriodParams {\n period?: 'annual' | 'quarter';\n}\n\n// Type-safe query parameters\nexport interface QueryParams {\n [key: string]: string | number | boolean | undefined;\n}\n\n// Common enums\nexport enum Period {\n ANNUAL = 'annual',\n QUARTER = 'quarter',\n}\n\nexport enum Exchange {\n NYSE = 'NYSE',\n NASDAQ = 'NASDAQ',\n AMEX = 'AMEX',\n TSX = 'TSX',\n LSE = 'LSE',\n ASX = 'ASX',\n NSE = 'NSE',\n BSE = 'BSE',\n}\n","// Formatting utilities for FMP API\n\n/**\n * Format currency value\n */\nexport function formatCurrency(value: number, currency: string = 'USD'): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n }).format(value);\n}\n\n/**\n * Format percentage value\n */\nexport function formatPercentage(value: number, decimals: number = 2): string {\n return `${value.toFixed(decimals)}%`;\n}\n\n/**\n * Format large numbers with K, M, B suffixes\n */\nexport function formatLargeNumber(value: number): string {\n if (value >= 1e12) {\n return `${(value / 1e12).toFixed(2)}T`;\n } else if (value >= 1e9) {\n return `${(value / 1e9).toFixed(2)}B`;\n } else if (value >= 1e6) {\n return `${(value / 1e6).toFixed(2)}M`;\n } else if (value >= 1e3) {\n return `${(value / 1e3).toFixed(2)}K`;\n }\n return value.toString();\n}\n\n/**\n * Format date to YYYY-MM-DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toISOString().split('T')[0];\n}\n\n/**\n * Format date to readable format\n */\nexport function formatReadableDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n\n/**\n * Format timestamp to readable format\n */\nexport function formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000);\n return date.toLocaleString('en-US');\n}\n\n/**\n * Format number with specified decimal places\n */\nexport function formatNumber(value: number, decimals: number = 2): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Format volume with appropriate units\n */\nexport function formatVolume(volume: number): string {\n if (volume >= 1e9) {\n return `${(volume / 1e9).toFixed(2)}B`;\n } else if (volume >= 1e6) {\n return `${(volume / 1e6).toFixed(2)}M`;\n } else if (volume >= 1e3) {\n return `${(volume / 1e3).toFixed(2)}K`;\n }\n return volume.toString();\n}\n","// Constants for FMP API\n\n// Default configuration\nexport const DEFAULT_TIMEOUT = 10000;\nexport const DEFAULT_LIMIT = 100;\nexport const MAX_LIMIT = 1000;\n\n// Common periods\nexport const PERIODS = {\n ANNUAL: 'annual',\n QUARTER: 'quarter',\n} as const;\n\n// Common exchanges\nexport const EXCHANGES = {\n NYSE: 'NYSE',\n NASDAQ: 'NASDAQ',\n AMEX: 'AMEX',\n TSX: 'TSX',\n LSE: 'LSE',\n ASX: 'ASX',\n NSE: 'NSE',\n BSE: 'BSE',\n} as const;\n\n// Common sectors\nexport const SECTORS = {\n TECHNOLOGY: 'Technology',\n HEALTHCARE: 'Healthcare',\n FINANCIAL: 'Financial',\n CONSUMER_DISCRETIONARY: 'Consumer Discretionary',\n CONSUMER_STAPLES: 'Consumer Staples',\n INDUSTRIALS: 'Industrials',\n ENERGY: 'Energy',\n MATERIALS: 'Materials',\n UTILITIES: 'Utilities',\n REAL_ESTATE: 'Real Estate',\n COMMUNICATION_SERVICES: 'Communication Services',\n} as const;\n\n// Common countries\nexport const COUNTRIES = {\n US: 'US',\n CA: 'CA',\n GB: 'GB',\n AU: 'AU',\n IN: 'IN',\n DE: 'DE',\n FR: 'FR',\n JP: 'JP',\n CN: 'CN',\n BR: 'BR',\n} as const;\n\n// Error messages\nexport const ERROR_MESSAGES = {\n API_KEY_REQUIRED: 'API key is required',\n SYMBOL_REQUIRED: 'Symbol is required',\n INVALID_SYMBOL: 'Invalid symbol format',\n INVALID_DATE: 'Invalid date format. Use YYYY-MM-DD',\n INVALID_PERIOD: 'Period must be either \"annual\" or \"quarter\"',\n INVALID_LIMIT: 'Limit must be between 1 and 1000',\n INVALID_PAGE: 'Page must be a non-negative number',\n REQUEST_FAILED: 'Request failed',\n RATE_LIMIT_EXCEEDED: 'Rate limit exceeded',\n UNAUTHORIZED: 'Unauthorized - Invalid API key',\n NOT_FOUND: 'Resource not found',\n} as const;\n\n// HTTP status codes\nexport const HTTP_STATUS = {\n OK: 200,\n CREATED: 201,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n} as const;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/utils/validation.ts","../src/endpoints/stock.ts","../src/endpoints/financial.ts","../src/endpoints/etf.ts","../src/endpoints/economic.ts","../src/endpoints/market.ts","../src/endpoints/list.ts","../src/endpoints/calendar.ts","../src/endpoints/company.ts","../src/endpoints/quote.ts","../src/endpoints/senate-house.ts","../src/endpoints/institutional.ts","../src/endpoints/insider.ts","../src/endpoints/sec.ts","../src/endpoints/mutual-fund.ts","../src/fmp.ts","../src/types/common.ts","../src/types/insider.ts","../src/utils/constants.ts","../src/utils/formatting.ts","../src/utils/helpers.ts","../src/utils/utils.ts","../src/utils/debug.ts"],"names":["axios","config","filteredData","Period","Exchange","TransactionType"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport { FMPConfig, APIResponse } from './types';\n\n/**\n * Utility function to unwrap single objects from arrays\n * Only unwraps if the response is an array with exactly one item\n * Otherwise, returns the original response\n */\nfunction unwrapSingleObject<T>(data: T): T {\n if (Array.isArray(data) && data.length === 1) {\n return data[0];\n }\n return data;\n}\n\n/**\n * Utility to normalize array responses: always returns an array (possibly empty)\n */\nfunction normalizeArrayResponse<T>(data: T | undefined | null): T {\n if (Array.isArray(data)) return data;\n if (data == null) return [] as unknown as T;\n return data;\n}\n\n/**\n * Utility to normalize object responses: always returns an object (possibly empty)\n */\nfunction normalizeObjectResponse<T>(data: T | undefined | null): T {\n if (data == null) return {} as unknown as T;\n if (Array.isArray(data) && data.length === 0) return {} as unknown as T;\n return data;\n}\n\nexport class FMPClient {\n private v3Client: AxiosInstance;\n private v4Client: AxiosInstance;\n private stableClient: AxiosInstance;\n private apiKey: string;\n\n constructor(config: FMPConfig) {\n // API key should be validated by the FMP class before calling this constructor\n if (!config.apiKey) {\n throw new Error('API key is required for FMPClient');\n }\n this.apiKey = config.apiKey;\n\n // Create separate clients for each version\n this.v3Client = axios.create({\n baseURL: 'https://financialmodelingprep.com/api/v3',\n timeout: config.timeout || 10000,\n headers: { 'Content-Type': 'application/json' },\n });\n\n this.v4Client = axios.create({\n baseURL: 'https://financialmodelingprep.com/api/v4',\n timeout: config.timeout || 10000,\n headers: { 'Content-Type': 'application/json' },\n });\n\n this.stableClient = axios.create({\n baseURL: 'https://financialmodelingprep.com/stable',\n timeout: config.timeout || 10000,\n headers: { 'Content-Type': 'application/json' },\n });\n\n // Add API key to all requests\n [this.v3Client, this.v4Client, this.stableClient].forEach(client => {\n client.interceptors.request.use(config => {\n config.params = { ...config.params, apikey: this.apiKey };\n return config;\n });\n });\n }\n\n /**\n * Standard get method - returns raw API response\n *\n * For endpoints that return arrays, this will always return an array (possibly empty) for `data` when success is true.\n * For endpoints that return objects, data is returned as-is.\n */\n async get<T>(\n endpoint: string,\n version: 'v3' | 'v4' | 'stable' = 'v3',\n params?: Record<string, any>,\n ): Promise<APIResponse<T>> {\n const client = this.getClientForVersion(version);\n\n try {\n const response = await client.get(endpoint, { params });\n let data = response.data;\n // If T is an array type, always return an array (never undefined/null)\n if (Array.isArray(data) || data == null) {\n data = normalizeArrayResponse<T>(data);\n }\n return {\n success: true,\n data,\n error: null,\n status: response.status,\n };\n } catch (error: any) {\n return {\n success: false,\n data: null,\n error: error.message || 'Unknown error occurred',\n status: error.response?.status || 500,\n };\n }\n }\n\n /**\n * Get method for single-object endpoints - unwraps single-item arrays\n *\n * For endpoints that return single objects, this will always return an object (possibly empty) for `data` when success is true.\n */\n async getSingle<T>(\n endpoint: string,\n version: 'v3' | 'v4' | 'stable' = 'v3',\n params?: Record<string, any>,\n ): Promise<APIResponse<T>> {\n const client = this.getClientForVersion(version);\n\n try {\n const response = await client.get(endpoint, { params });\n const data = normalizeObjectResponse<T>(unwrapSingleObject(response.data));\n return {\n success: true,\n data,\n error: null,\n status: response.status,\n };\n } catch (error: any) {\n return {\n success: false,\n data: null,\n error: error.message || 'Unknown error occurred',\n status: error.response?.status || 500,\n };\n }\n }\n\n private getClientForVersion(version: 'v3' | 'v4' | 'stable'): AxiosInstance {\n switch (version) {\n case 'v3':\n return this.v3Client;\n case 'v4':\n return this.v4Client;\n case 'stable':\n return this.stableClient;\n default:\n return this.v3Client; // Default to v3\n }\n }\n}\n","// Validation utilities for FMP API\n\nimport { APIResponse } from '../types/common';\n\n/**\n * Validation utilities for FMP API parameters and responses\n */\nexport class FMPValidation {\n /**\n * Validate stock symbol format\n * @param symbol - The symbol to validate\n * @returns True if the symbol format is valid\n */\n static isValidSymbol(symbol: string): boolean {\n if (!symbol || typeof symbol !== 'string') {\n return false;\n }\n // Basic stock symbol validation: 1-5 uppercase letters\n return /^[A-Z]{1,5}$/.test(symbol);\n }\n\n /**\n * Validate crypto symbol format\n * @param symbol - The crypto symbol to validate\n * @returns True if the crypto symbol format is valid\n */\n static isValidCryptoSymbol(symbol: string): boolean {\n if (!symbol || typeof symbol !== 'string') {\n return false;\n }\n // Crypto symbols typically end with USD, EUR, etc.\n return /^[A-Z]{2,10}(USD|EUR|GBP|JPY|CAD|AUD|CHF|CNY)$/.test(symbol);\n }\n\n /**\n * Validate forex pair format\n * @param symbol - The forex pair to validate\n * @returns True if the forex pair format is valid\n */\n static isValidForexPair(symbol: string): boolean {\n if (!symbol || typeof symbol !== 'string') {\n return false;\n }\n // Forex pairs: 6 characters, 3+3 format (e.g., EURUSD)\n return /^[A-Z]{3}[A-Z]{3}$/.test(symbol);\n }\n\n /**\n * Validate date format (YYYY-MM-DD)\n * @param date - The date string to validate\n * @returns True if the date format is valid\n */\n static isValidDate(date: string): boolean {\n if (!date || typeof date !== 'string') {\n return false;\n }\n\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(date)) {\n return false;\n }\n\n const dateObj = new Date(date);\n return !isNaN(dateObj.getTime()) && dateObj.toISOString().split('T')[0] === date;\n }\n\n /**\n * Validate date range\n * @param from - Start date\n * @param to - End date\n * @returns True if the date range is valid\n */\n static isValidDateRange(from: string, to: string): boolean {\n if (!this.isValidDate(from) || !this.isValidDate(to)) {\n return false;\n }\n\n const fromDate = new Date(from);\n const toDate = new Date(to);\n\n return fromDate <= toDate;\n }\n\n /**\n * Validate API response structure\n * @param response - The response to validate\n * @returns True if the response has the expected structure\n */\n static isValidResponse(response: any): response is APIResponse<any> {\n return Boolean(\n response && typeof response === 'object' && typeof response.success === 'boolean',\n );\n }\n\n /**\n * Validate API key format\n * @param apiKey - The API key to validate\n * @returns True if the API key format is valid\n */\n static isValidApiKey(apiKey: string): boolean {\n if (!apiKey || typeof apiKey !== 'string') {\n return false;\n }\n // FMP API keys are typically alphanumeric and at least 32 characters\n return /^[a-zA-Z0-9]{32,}$/.test(apiKey);\n }\n\n /**\n * Validate period parameter\n * @param period - The period to validate\n * @returns True if the period is valid\n */\n static isValidPeriod(period: string): boolean {\n if (!period || typeof period !== 'string') {\n return false;\n }\n return ['annual', 'quarter', 'fy'].includes(period.toLowerCase());\n }\n\n /**\n * Validate limit parameter\n * @param limit - The limit to validate\n * @returns True if the limit is valid\n */\n static isValidLimit(limit: number): boolean {\n return typeof limit === 'number' && Number.isInteger(limit) && limit > 0 && limit <= 1000;\n }\n\n /**\n * Get validation errors for quote parameters\n * @param params - The parameters to validate\n * @returns Array of validation error messages\n */\n static validateQuoteParams(params: any): string[] {\n const errors: string[] = [];\n\n if (!params) {\n errors.push('Parameters object is required');\n return errors;\n }\n\n if (!params.symbol) {\n errors.push('Symbol is required');\n } else if (\n !this.isValidSymbol(params.symbol) &&\n !this.isValidCryptoSymbol(params.symbol) &&\n !this.isValidForexPair(params.symbol)\n ) {\n errors.push('Invalid symbol format');\n }\n\n if (params.from && !this.isValidDate(params.from)) {\n errors.push('Invalid from date format (expected YYYY-MM-DD)');\n }\n\n if (params.to && !this.isValidDate(params.to)) {\n errors.push('Invalid to date format (expected YYYY-MM-DD)');\n }\n\n if (params.from && params.to && !this.isValidDateRange(params.from, params.to)) {\n errors.push('From date must be before or equal to to date');\n }\n\n return errors;\n }\n\n /**\n * Get validation errors for financial statement parameters\n * @param params - The parameters to validate\n * @returns Array of validation error messages\n */\n static validateFinancialParams(params: any): string[] {\n const errors: string[] = [];\n\n if (!params) {\n errors.push('Parameters object is required');\n return errors;\n }\n\n if (!params.symbol) {\n errors.push('Symbol is required');\n } else if (!this.isValidSymbol(params.symbol)) {\n errors.push('Invalid symbol format');\n }\n\n if (params.period && !this.isValidPeriod(params.period)) {\n errors.push('Invalid period (must be \"annual\", \"quarter\", or \"FY\")');\n }\n\n if (params.limit && !this.isValidLimit(params.limit)) {\n errors.push('Invalid limit (must be a positive integer <= 1000)');\n }\n\n return errors;\n }\n\n /**\n * Get validation errors for date range parameters\n * @param params - The parameters to validate\n * @returns Array of validation error messages\n */\n static validateDateRangeParams(params: any): string[] {\n const errors: string[] = [];\n\n if (!params) {\n errors.push('Parameters object is required');\n return errors;\n }\n\n if (params.from && !this.isValidDate(params.from)) {\n errors.push('Invalid from date format (expected YYYY-MM-DD)');\n }\n\n if (params.to && !this.isValidDate(params.to)) {\n errors.push('Invalid to date format (expected YYYY-MM-DD)');\n }\n\n if (params.from && params.to && !this.isValidDateRange(params.from, params.to)) {\n errors.push('From date must be before or equal to to date');\n }\n\n return errors;\n }\n\n /**\n * Validate and throw error if validation fails\n * @param errors - Array of validation errors\n * @param context - Context for the error message\n */\n static throwIfInvalid(errors: string[], context = 'Validation'): void {\n if (errors.length > 0) {\n throw new Error(`${context} failed: ${errors.join(', ')}`);\n }\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n MarketCap,\n StockSplitResponse,\n StockDividendResponse,\n StockRealTimePrice,\n StockRealTimePriceFull,\n StockListResponse,\n CompaniesPriceListResponse,\n} from '@/types/stock';\n\nexport class StockEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get current market capitalization for a stock\n *\n * Market capitalization represents the total value of a company's outstanding shares.\n * Calculated by multiplying the current share price by the number of outstanding shares.\n * This metric is crucial for understanding a company's size and market position.\n *\n * @param symbol - The stock symbol to get market cap for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n *\n * @returns Promise resolving to market cap data including symbol, date, and market cap value\n *\n * @example\n * ```typescript\n * // Get market cap for Apple\n * const marketCap = await fmp.stock.getMarketCap('AAPL');\n * console.log(`Apple's market cap: $${marketCap.data.marketCap.toLocaleString()}`);\n *\n * // Get market cap for Microsoft\n * const msftCap = await fmp.stock.getMarketCap('MSFT');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-cap-company-information|FMP Market Cap Documentation}\n */\n async getMarketCap(symbol: string): Promise<APIResponse<MarketCap>> {\n return this.client.getSingle(`/market-capitalization/${symbol}`, 'v3');\n }\n\n /**\n * Get historical stock splits for a company\n *\n * Stock splits occur when a company increases the number of shares by dividing existing shares.\n * This endpoint provides the complete history of stock splits including dates, ratios, and split types.\n * Useful for adjusting historical price data and understanding corporate actions.\n *\n * @param symbol - The stock symbol to get split history for (e.g., 'AAPL', 'TSLA', 'NVDA')\n *\n * @returns Promise resolving to historical stock splits with dates, labels, and split ratios\n *\n * @example\n * ```typescript\n * // Get Apple's split history\n * const splits = await fmp.stock.getStockSplits('AAPL');\n * splits.data.historical.forEach(split => {\n * console.log(`${split.date}: ${split.numerator}:${split.denominator} split`);\n * });\n *\n * // Get Tesla's split history\n * const teslaSplits = await fmp.stock.getStockSplits('TSLA');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#splits-historical-splits|FMP Stock Splits Documentation}\n */\n async getStockSplits(symbol: string): Promise<APIResponse<StockSplitResponse>> {\n return this.client.get(`/historical-price-full/stock_split/${symbol}`, 'v3');\n }\n\n /**\n * Get historical dividend payments for a stock\n *\n * Dividends are periodic payments made by companies to shareholders from profits.\n * This endpoint provides the complete dividend history including payment dates, amounts,\n * and important dates like ex-dividend, record, and declaration dates.\n *\n * @param symbol - The stock symbol to get dividend history for (e.g., 'KO', 'JNJ', 'PG')\n *\n * @returns Promise resolving to dividend history with payment details and important dates\n *\n * @example\n * ```typescript\n * // Get Coca-Cola's dividend history\n * const dividends = await fmp.stock.getDividendHistory('KO');\n * dividends.data.historical.forEach(dividend => {\n * console.log(`${dividend.date}: $${dividend.dividend} per share`);\n * });\n *\n * // Get Johnson & Johnson's dividend history\n * const jnjDividends = await fmp.stock.getDividendHistory('JNJ');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#dividends-historical-dividends|FMP Dividends Documentation}\n */\n async getDividendHistory(symbol: string): Promise<APIResponse<StockDividendResponse>> {\n return this.client.getSingle(`/historical-price-full/stock_dividend/${symbol}`, 'v3');\n }\n\n /**\n * Get real-time stock prices for multiple symbols\n *\n * Provides current market prices for stocks with minimal data overhead.\n * Returns basic price information including symbol and current price.\n * Ideal for quick price checks and portfolio monitoring.\n *\n * @param symbols - Array of stock symbols to get real-time prices for\n *\n * @returns Promise resolving to array of real-time price data with symbol and price\n *\n * @example\n * ```typescript\n * // Get prices for multiple tech stocks\n * const prices = await fmp.stock.getRealTimePrice([\n * 'AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA'\n * ]);\n *\n * prices.data.forEach(stock => {\n * console.log(`${stock.symbol}: $${stock.price}`);\n * });\n *\n * // Get price for single stock\n * const aaplPrice = await fmp.stock.getRealTimePrice(['AAPL']);\n * ```\n */\n async getRealTimePrice(symbols: string[]): Promise<APIResponse<StockRealTimePrice[]>> {\n const url = `stock/real-time-price/${symbols.join(',')}`;\n const result = await this.client.get(url, 'v3');\n if (result.success && result.data && !Array.isArray(result.data)) {\n const data = result.data as\n | StockListResponse<StockRealTimePrice>\n | CompaniesPriceListResponse<StockRealTimePrice>\n | StockRealTimePrice;\n\n // Check for companiesPriceList (when symbols are provided)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'companiesPriceList' in data &&\n Array.isArray(data.companiesPriceList)\n ) {\n const filteredData = data.companiesPriceList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // Check for stockList (when no symbols are provided - all stocks)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'stockList' in data &&\n Array.isArray(data.stockList)\n ) {\n const filteredData = data.stockList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // fallback: wrap single object in array if it has a symbol\n if ((data as StockRealTimePrice).symbol) {\n return { ...result, data: [data as StockRealTimePrice] };\n }\n\n if (symbols.length === 1) {\n console.warn(`No real-time price data found for symbol: ${symbols[0]}`);\n }\n return { ...result, data: [] };\n }\n const filteredData = (result.data as StockRealTimePrice[]).filter(item => item && item.symbol);\n return { ...result, data: filteredData };\n }\n\n /**\n * Get comprehensive real-time stock data for multiple symbols\n *\n * Provides detailed real-time market data including bid/ask prices, volume, trade sizes,\n * and timestamps. This endpoint offers much more information than the basic real-time price.\n * Perfect for trading applications, market analysis, and detailed price monitoring.\n *\n * @param symbols - Array of stock symbols to get detailed real-time data for\n *\n * @returns Promise resolving to array of detailed real-time data including bid/ask, volume, and timestamps\n *\n * @example\n * ```typescript\n * // Get detailed data for multiple stocks\n * const detailedData = await fmp.stock.getRealTimePriceForMultipleStocks([\n * 'AAPL', 'MSFT', 'GOOGL'\n * ]);\n *\n * detailedData.data.forEach(stock => {\n * console.log(`${stock.symbol}:`);\n * console.log(` Bid: $${stock.bidPrice} (${stock.bidSize} shares)`);\n * console.log(` Ask: $${stock.askPrice} (${stock.askSize} shares)`);\n * console.log(` Last: $${stock.lastSalePrice} (${stock.lastSaleSize} shares)`);\n * console.log(` Volume: ${stock.volume.toLocaleString()}`);\n * });\n *\n * // Get detailed data for single stock\n * const aaplDetailed = await fmp.stock.getRealTimePriceForMultipleStocks(['AAPL']);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#real-time-full-price-quote|FMP Real-Time Full Price Documentation}\n */\n async getRealTimePriceForMultipleStocks(\n symbols: string[],\n ): Promise<APIResponse<StockRealTimePriceFull[]>> {\n const url = `stock/full/real-time-price/${symbols.join(',')}`;\n const result = await this.client.get(url, 'v3');\n if (result.success && result.data && !Array.isArray(result.data)) {\n const data = result.data as\n | StockListResponse<StockRealTimePriceFull>\n | CompaniesPriceListResponse<StockRealTimePriceFull>\n | StockRealTimePriceFull;\n\n // Check for companiesPriceList (when symbols are provided)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'companiesPriceList' in data &&\n Array.isArray(data.companiesPriceList)\n ) {\n const filteredData = data.companiesPriceList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n // Check for stockList (when no symbols are provided - all stocks)\n if (\n typeof data === 'object' &&\n data !== null &&\n 'stockList' in data &&\n Array.isArray(data.stockList)\n ) {\n const filteredData = data.stockList.filter(item => item && item.symbol);\n if (filteredData.length > 0) {\n return { ...result, data: filteredData };\n }\n }\n\n if ((data as StockRealTimePriceFull).symbol) {\n return { ...result, data: [data as StockRealTimePriceFull] };\n }\n\n if (symbols.length === 1) {\n console.warn(`No full real-time price data found for symbol: ${symbols[0]}`);\n }\n return { ...result, data: [] };\n }\n const filteredData = (result.data as StockRealTimePriceFull[]).filter(\n item => item && item.symbol,\n );\n return { ...result, data: filteredData };\n }\n}\n","import { APIResponse } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n KeyMetrics,\n FinancialRatios,\n EnterpriseValue,\n CashflowGrowth,\n IncomeGrowth,\n BalanceSheetGrowth,\n FinancialGrowth,\n IncomeStatement,\n BalanceSheet,\n CashFlowStatement,\n EarningsSurprises,\n EarningsHistorical,\n} from '@/types/financial';\n\nexport class FinancialEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get income statement data\n *\n * Provides comprehensive income statement data including revenue, expenses,\n * net income, and earnings per share. Essential for analyzing company\n * profitability, revenue trends, and financial performance over time.\n *\n * @param params - Income statement request parameters\n * @param params.symbol - The stock symbol to get income statement for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of income statement data with financial metrics\n *\n * @example\n * ```typescript\n * // Get annual income statements for Apple\n * const incomeStatements = await fmp.financial.getIncomeStatement({ symbol: 'AAPL' });\n * incomeStatements.data.forEach(statement => {\n * console.log(`${statement.date}: Revenue $${statement.revenue.toLocaleString()}, Net Income $${statement.netIncome.toLocaleString()}`);\n * });\n *\n * // Get quarterly income statements for Microsoft\n * const quarterlyIncome = await fmp.financial.getIncomeStatement({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#income-statements-financial-statements|FMP Income Statement Documentation}\n */\n async getIncomeStatement(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<IncomeStatement[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/income-statement/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get balance sheet data\n *\n * Provides comprehensive balance sheet data including assets, liabilities,\n * and shareholder equity. Essential for analyzing company financial position,\n * liquidity, and capital structure.\n *\n * @param params - Balance sheet request parameters\n * @param params.symbol - The stock symbol to get balance sheet for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of balance sheet data with financial position metrics\n *\n * @example\n * ```typescript\n * // Get annual balance sheets for Apple\n * const balanceSheets = await fmp.financial.getBalanceSheet({ symbol: 'AAPL' });\n * balanceSheets.data.forEach(sheet => {\n * console.log(`${sheet.date}: Assets $${sheet.totalAssets.toLocaleString()}, Equity $${sheet.totalStockholdersEquity.toLocaleString()}`);\n * });\n *\n * // Get quarterly balance sheets for Microsoft\n * const quarterlyBalance = await fmp.financial.getBalanceSheet({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#balance-sheet-statements-financial-statements|FMP Balance Sheet Documentation}\n */\n async getBalanceSheet(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<BalanceSheet[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(\n `/balance-sheet-statement/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get cash flow statement data\n *\n * Provides comprehensive cash flow data including operating, investing,\n * and financing cash flows. Essential for analyzing company cash generation,\n * capital allocation, and financial sustainability.\n *\n * @param params - Cash flow statement request parameters\n * @param params.symbol - The stock symbol to get cash flow statement for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of cash flow statement data with cash flow metrics\n *\n * @example\n * ```typescript\n * // Get annual cash flow statements for Apple\n * const cashFlows = await fmp.financial.getCashFlowStatement({ symbol: 'AAPL' });\n * cashFlows.data.forEach(flow => {\n * console.log(`${flow.date}: Operating CF $${flow.operatingCashFlow.toLocaleString()}, Free CF $${flow.freeCashFlow.toLocaleString()}`);\n * });\n *\n * // Get quarterly cash flow statements for Microsoft\n * const quarterlyCashFlow = await fmp.financial.getCashFlowStatement({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cashflow-statements-financial-statements|FMP Cash Flow Statement Documentation}\n */\n async getCashFlowStatement(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<CashFlowStatement[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/cash-flow-statement/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get key financial metrics\n *\n * Provides essential financial metrics including revenue, net income,\n * P/E ratio, and other key performance indicators. Essential for\n * fundamental analysis and company valuation.\n *\n * @param params - Key metrics request parameters\n * @param params.symbol - The stock symbol to get key metrics for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of key metrics data with financial indicators\n *\n * @example\n * ```typescript\n * // Get key metrics for Apple\n * const keyMetrics = await fmp.financial.getKeyMetrics({ symbol: 'AAPL' });\n * keyMetrics.data.forEach(metric => {\n * console.log(`${metric.date}: P/E ${metric.peRatio}, ROE ${metric.roe}%`);\n * });\n *\n * // Get quarterly key metrics for Microsoft\n * const quarterlyMetrics = await fmp.financial.getKeyMetrics({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#key-metrics-statement-analysis|FMP Key Metrics Documentation}\n */\n async getKeyMetrics(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<KeyMetrics[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/key-metrics/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get financial ratios\n *\n * Provides comprehensive financial ratios including P/B ratio, ROE,\n * debt-to-equity, and other important ratios. Essential for analyzing\n * company financial health and comparing with peers.\n *\n * @param params - Financial ratios request parameters\n * @param params.symbol - The stock symbol to get financial ratios for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of financial ratios data with ratio metrics\n *\n * @example\n * ```typescript\n * // Get financial ratios for Apple\n * const ratios = await fmp.financial.getFinancialRatios({ symbol: 'AAPL' });\n * ratios.data.forEach(ratio => {\n * console.log(`${ratio.date}: P/B ${ratio.priceToBookRatio}, Debt/Equity ${ratio.debtToEquity}`);\n * });\n *\n * // Get quarterly ratios for Microsoft\n * const quarterlyRatios = await fmp.financial.getFinancialRatios({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#ratios-statement-analysis|FMP Financial Ratios Documentation}\n */\n async getFinancialRatios(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<FinancialRatios[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/ratios/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get enterprise value data\n *\n * Provides enterprise value metrics including total enterprise value,\n * market cap, and debt information. Essential for company valuation\n * and comparing companies with different capital structures.\n *\n * @param params - Enterprise value request parameters\n * @param params.symbol - The stock symbol to get enterprise value for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of enterprise value data with valuation metrics\n *\n * @example\n * ```typescript\n * // Get enterprise value for Apple\n * const enterpriseValue = await fmp.financial.getEnterpriseValue({ symbol: 'AAPL' });\n * enterpriseValue.data.forEach(ev => {\n * console.log(`${ev.date}: EV $${ev.enterpriseValue.toLocaleString()}, Market Cap $${ev.marketCapitalization.toLocaleString()}`);\n * });\n *\n * // Get quarterly enterprise value for Microsoft\n * const quarterlyEV = await fmp.financial.getEnterpriseValue({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#enterprise-values-statement-analysis|FMP Enterprise Value Documentation}\n */\n async getEnterpriseValue(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<EnterpriseValue[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/enterprise-value/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get cash flow growth data\n *\n * Provides cash flow growth rates showing how quickly a company's\n * cash flows are growing over time. Essential for analyzing cash\n * generation trends and financial sustainability.\n *\n * @param params - Cash flow growth request parameters\n * @param params.symbol - The stock symbol to get cash flow growth for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of cash flow growth data with growth metrics\n *\n * @example\n * ```typescript\n * // Get cash flow growth for Apple\n * const cashFlowGrowth = await fmp.financial.getCashflowGrowth({ symbol: 'AAPL' });\n * cashFlowGrowth.data.forEach(growth => {\n * console.log(`${growth.date}: Operating CF Growth ${growth.operatingCashFlowGrowth}%`);\n * });\n *\n * // Get quarterly cash flow growth for Microsoft\n * const quarterlyGrowth = await fmp.financial.getCashflowGrowth({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cashflow-growth-statement-analysis|FMP Cash Flow Growth Documentation}\n */\n async getCashflowGrowth(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<CashflowGrowth[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(\n `/cash-flow-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get income growth data\n *\n * Provides income growth rates showing how quickly a company's\n * revenue and net income are growing over time. Essential for\n * analyzing profitability trends and business momentum.\n *\n * @param params - Income growth request parameters\n * @param params.symbol - The stock symbol to get income growth for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of income growth data with growth metrics\n *\n * @example\n * ```typescript\n * // Get income growth for Apple\n * const incomeGrowth = await fmp.financial.getIncomeGrowth({ symbol: 'AAPL' });\n * incomeGrowth.data.forEach(growth => {\n * console.log(`${growth.date}: Revenue Growth ${growth.revenueGrowth}%, Net Income Growth ${growth.netIncomeGrowth}%`);\n * });\n *\n * // Get quarterly income growth for Microsoft\n * const quarterlyGrowth = await fmp.financial.getIncomeGrowth({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#income-growth-statement-analysis|FMP Income Growth Documentation}\n */\n async getIncomeGrowth(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<IncomeGrowth[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(\n `/income-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get balance sheet growth data\n *\n * Provides balance sheet growth rates showing how quickly a company's\n * assets, liabilities, and equity are growing over time. Essential for\n * analyzing capital structure trends and financial position changes.\n *\n * @param params - Balance sheet growth request parameters\n * @param params.symbol - The stock symbol to get balance sheet growth for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of balance sheet growth data with growth metrics\n *\n * @example\n * ```typescript\n * // Get balance sheet growth for Apple\n * const balanceSheetGrowth = await fmp.financial.getBalanceSheetGrowth({ symbol: 'AAPL' });\n * balanceSheetGrowth.data.forEach(growth => {\n * console.log(`${growth.date}: Assets Growth ${growth.totalAssetsGrowth}%, Equity Growth ${growth.totalStockholdersEquityGrowth}%`);\n * });\n *\n * // Get quarterly balance sheet growth for Microsoft\n * const quarterlyGrowth = await fmp.financial.getBalanceSheetGrowth({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#balance-sheet-growth-statement-analysis|FMP Balance Sheet Growth Documentation}\n */\n async getBalanceSheetGrowth(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<BalanceSheetGrowth[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(\n `/balance-sheet-statement-growth/${symbol}?period=${period}&limit=${limit}`,\n 'v3',\n );\n }\n\n /**\n * Get financial growth data\n *\n * Provides comprehensive financial growth rates across all key\n * financial metrics. Essential for analyzing overall financial\n * performance trends and business momentum.\n *\n * @param params - Financial growth request parameters\n * @param params.symbol - The stock symbol to get financial growth for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.period - The reporting period: 'annual' or 'quarter' (default: 'annual')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of financial growth data with comprehensive growth metrics\n *\n * @example\n * ```typescript\n * // Get financial growth for Apple\n * const financialGrowth = await fmp.financial.getFinancialGrowth({ symbol: 'AAPL' });\n * financialGrowth.data.forEach(growth => {\n * console.log(`${growth.date}: Revenue Growth ${growth.revenueGrowth}%, EPS Growth ${growth.epsGrowth}%`);\n * });\n *\n * // Get quarterly financial growth for Microsoft\n * const quarterlyGrowth = await fmp.financial.getFinancialGrowth({ symbol: 'MSFT', period: 'quarter', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#financial-growth-statement-analysis|FMP Financial Growth Documentation}\n */\n async getFinancialGrowth(params: {\n symbol: string;\n period?: 'annual' | 'quarter';\n limit?: number;\n }): Promise<APIResponse<FinancialGrowth[]>> {\n const { symbol, period = 'annual', limit = 5 } = params;\n return this.client.get(`/financial-growth/${symbol}?period=${period}&limit=${limit}`, 'v3');\n }\n\n /**\n * Get historical earnings data\n *\n * Provides historical and upcoming earnings announcements including\n * dates, estimated EPS, and actual EPS. Essential for analyzing\n * earnings trends and tracking company performance.\n *\n * @param params - Earnings historical request parameters\n * @param params.symbol - The stock symbol to get earnings history for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params.limit - Number of periods to retrieve (default: 5)\n *\n * @returns Promise resolving to array of historical earnings data with announcement details\n *\n * @example\n * ```typescript\n * // Get earnings history for Apple\n * const earningsHistory = await fmp.financial.getEarningsHistorical({ symbol: 'AAPL', limit: 10 });\n * earningsHistory.data.forEach(earning => {\n * console.log(`${earning.date}: Est. ${earning.estimatedEps}, Actual ${earning.actualEps}`);\n * });\n *\n * // Get earnings history for Microsoft\n * const msftEarnings = await fmp.financial.getEarningsHistorical({ symbol: 'MSFT', limit: 8 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#earnings-historical-earnings|FMP Earnings Historical Documentation}\n */\n async getEarningsHistorical(params: {\n symbol: string;\n limit?: number;\n }): Promise<APIResponse<EarningsHistorical[]>> {\n const { symbol, limit = 5 } = params;\n return this.client.get(`/historical/earning_calendar/${symbol}?limit=${limit}`, 'v3');\n }\n\n /**\n * Get earnings surprises data\n *\n * Provides earnings announcements that exceeded or fell short of\n * analyst estimates. Essential for analyzing earnings quality and\n * market reactions to earnings releases.\n *\n * @param symbol - The stock symbol to get earnings surprises for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n *\n * @returns Promise resolving to array of earnings surprises data with surprise details\n *\n * @example\n * ```typescript\n * // Get earnings surprises for Apple\n * const earningsSurprises = await fmp.financial.getEarningsSurprises('AAPL');\n * earningsSurprises.data.forEach(surprise => {\n * console.log(`${surprise.date}: Est. ${surprise.estimatedEps}, Actual ${surprise.actualEps}, Surprise ${surprise.surprisePercentage}%`);\n * });\n *\n * // Get earnings surprises for Microsoft\n * const msftSurprises = await fmp.financial.getEarningsSurprises('MSFT');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#earnings-surprises-earnings|FMP Earnings Surprises Documentation}\n */\n async getEarningsSurprises(symbol: string): Promise<APIResponse<EarningsSurprises[]>> {\n return this.client.get(`/earnings-surprises/${symbol}`, 'v3');\n }\n}\n","// ETF endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n ETFProfile,\n ETFHolding,\n ETFHoldingDates,\n ETFHolder,\n ETFStockExposure,\n ETFWeighting,\n ETFCountryWeighting,\n} from '@/types/etf';\n\nexport class ETFEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get available ETF holding dates\n *\n * Provides a list of dates when ETF holdings are updated and available.\n * Useful for determining when the most recent holdings data is available\n * and ensuring you're working with current portfolio information.\n *\n * @param symbol - ETF symbol to get holding dates for (e.g., 'SPY', 'VOO', 'QQQ')\n *\n * @returns Promise resolving to array of available holding dates\n *\n * @example\n * ```typescript\n * // Get holding dates for specific ETF\n * const spyDates = await fmp.etf.getHoldingDates('SPY');\n * spyDates.data.forEach(date => {\n * console.log(`Holdings available: ${date.date}`);\n * });\n *\n * // Get VOO holding dates\n * const vooDates = await fmp.etf.getHoldingDates('VOO');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-holding-dates-etf-holdings|FMP ETF Holding Dates Documentation}\n */\n async getHoldingDates(symbol: string): Promise<APIResponse<ETFHoldingDates[]>> {\n return this.client.get('/etf-holdings/portfolio-date', 'v4', { symbol });\n }\n\n /**\n * Get ETF holdings for specific date\n *\n * Provides detailed holdings information for an ETF on a specific date.\n * Includes individual stocks, their weights, shares held, and market values.\n * Essential for understanding ETF composition and portfolio analysis.\n *\n * @param params - ETF holdings request parameters\n * @param params.symbol - The ETF symbol to get holdings for (e.g., 'SPY', 'VOO', 'QQQ')\n * @param params.date - The date to get holdings for in YYYY-MM-DD format\n *\n * @returns Promise resolving to array of ETF holdings with detailed stock information\n *\n * @example\n * ```typescript\n * // Get SPY holdings for specific date\n * const holdings = await fmp.etf.getHoldings({ symbol: 'SPY', date: '2024-01-15' });\n * holdings.data.forEach(holding => {\n * console.log(`${holding.asset}: ${holding.weight}% (${holding.sharesNumber} shares)`);\n * });\n *\n * // Get VOO holdings\n * const vooHoldings = await fmp.etf.getHoldings({ symbol: 'VOO', date: '2024-01-15' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-holdings-etf-holdings|FMP ETF Holdings Documentation}\n */\n async getHoldings(params: { symbol: string; date: string }): Promise<APIResponse<ETFHolding[]>> {\n const { symbol, date } = params;\n const queryParams: { symbol?: string; date?: string } = {};\n if (symbol) queryParams.symbol = symbol;\n if (date) queryParams.date = date;\n return this.client.get('/etf-holdings', 'v4', queryParams);\n }\n\n /**\n * Get ETF holdings and components\n *\n * Provides all stocks held by a specific ETF including assets, share numbers,\n * and weight percentages. Essential for understanding ETF composition and\n * finding which ETFs hold specific stocks.\n *\n * @param symbol - The ETF symbol to get holdings for (e.g., 'SPY', 'VOO', 'QQQ')\n *\n * @returns Promise resolving to array of ETF holdings with stock details\n *\n * @example\n * ```typescript\n * // Get SPY holdings\n * const spyHoldings = await fmp.etf.getHolder('SPY');\n * spyHoldings.data.forEach(holding => {\n * console.log(`${holding.asset}: ${holding.weight}% (${holding.sharesNumber} shares)`);\n * });\n *\n * // Get VOO holdings\n * const vooHoldings = await fmp.etf.getHolder('VOO');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-holder-etf-holdings|FMP ETF Holder Documentation}\n */\n async getHolder(symbol: string): Promise<APIResponse<ETFHolder[]>> {\n return this.client.get(`/etf-holder/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF profile and information\n *\n * Provides comprehensive information about an ETF including ticker symbol,\n * name, expense ratio, assets under management, and other key metrics.\n * Essential for ETF comparison and due diligence.\n *\n * @param symbol - ETF symbol to get profile for (e.g., 'SPY', 'VOO', 'QQQ')\n *\n * @returns Promise resolving to ETF profile with detailed information\n *\n * @example\n * ```typescript\n * // Get SPY profile\n * const spyProfile = await fmp.etf.getProfile('SPY');\n * console.log(`SPY AUM: $${spyProfile.data.aum.toLocaleString()}`);\n * console.log(`Expense Ratio: ${spyProfile.data.expenseRatio}%`);\n *\n * // Get VOO profile\n * const vooProfile = await fmp.etf.getProfile('VOO');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-information-etf-holdings|FMP ETF Information Documentation}\n */\n async getProfile(symbol: string): Promise<APIResponse<ETFProfile>> {\n return this.client.getSingle('/etf-info', 'v4', { symbol });\n }\n\n /**\n * Get ETF sector weighting and exposure\n *\n * Provides a breakdown of an ETF's sector allocation showing the percentage\n * of assets invested in each sector. Essential for understanding sector\n * exposure and diversification analysis.\n *\n * @param symbol - The ETF symbol to get sector weighting for (e.g., 'SPY', 'VOO', 'QQQ')\n *\n * @returns Promise resolving to array of sector weightings with percentage allocations\n *\n * @example\n * ```typescript\n * // Get SPY sector weightings\n * const sectorWeightings = await fmp.etf.getSectorWeighting('SPY');\n * sectorWeightings.data.forEach(sector => {\n * console.log(`${sector.sector}: ${sector.weight}%`);\n * });\n *\n * // Get QQQ sector exposure (tech-heavy)\n * const qqqSectors = await fmp.etf.getSectorWeighting('QQQ');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-sector-weighting-etf-holdings|FMP ETF Sector Weighting Documentation}\n */\n async getSectorWeighting(symbol: string): Promise<APIResponse<ETFWeighting[]>> {\n return this.client.get(`/etf-sector-weightings/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF country weighting and exposure\n *\n * Provides a breakdown of an ETF's geographic allocation showing the percentage\n * of assets invested in each country. Essential for understanding international\n * exposure and geographic diversification.\n *\n * @param symbol - The ETF symbol to get country weighting for (e.g., 'SPY', 'VOO', 'EFA')\n *\n * @returns Promise resolving to array of country weightings with percentage allocations\n *\n * @example\n * ```typescript\n * // Get SPY country weightings\n * const countryWeightings = await fmp.etf.getCountryWeighting('SPY');\n * countryWeightings.data.forEach(country => {\n * console.log(`${country.country}: ${country.weight}%`);\n * });\n *\n * // Get international ETF exposure\n * const efaCountries = await fmp.etf.getCountryWeighting('EFA');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-country-weighting-etf-holdings|FMP ETF Country Weighting Documentation}\n */\n async getCountryWeighting(symbol: string): Promise<APIResponse<ETFCountryWeighting[]>> {\n return this.client.get(`/etf-country-weightings/${symbol}`, 'v3');\n }\n\n /**\n * Get ETF stock exposure and holdings\n *\n * Provides detailed exposure information for a specific stock across all ETFs\n * that hold it. Includes market value, share numbers, and weight percentages.\n * Useful for finding which ETFs have exposure to specific stocks.\n *\n * @param symbol - The stock symbol to get ETF exposure for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n *\n * @returns Promise resolving to array of ETF exposures with detailed holding information\n *\n * @example\n * ```typescript\n * // Find ETFs that hold Apple\n * const appleExposure = await fmp.etf.getStockExposure('AAPL');\n * appleExposure.data.forEach(etf => {\n * console.log(`${etf.etfSymbol}: ${etf.weight}% (${etf.sharesNumber} shares)`);\n * });\n *\n * // Find ETFs that hold Microsoft\n * const msftExposure = await fmp.etf.getStockExposure('MSFT');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#etf-sector-exposure-etf-holdings|FMP ETF Stock Exposure Documentation}\n */\n async getStockExposure(symbol: string): Promise<APIResponse<ETFStockExposure[]>> {\n return this.client.get(`/etf-stock-exposure/${symbol}`, 'v3');\n }\n}\n","// Economic endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport { TreasuryRate, EconomicIndicator } from '@/types/economic';\n\nexport class EconomicEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get treasury rates data\n *\n * Provides historical treasury rates for various maturities including\n * 1-month, 3-month, 6-month, 1-year, 2-year, 3-year, 5-year, 7-year,\n * 10-year, 20-year, and 30-year treasury bonds. Essential for analyzing\n * interest rate trends, yield curves, and fixed income investments.\n *\n * @param params - Treasury rates request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to 1 year ago)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to today)\n *\n * @returns Promise resolving to array of treasury rates data with yield information\n *\n * @example\n * ```typescript\n * // Get treasury rates for the last year\n * const treasuryRates = await fmp.economic.getTreasuryRates({\n * from: '2023-01-01',\n * to: '2023-12-31'\n * });\n * treasuryRates.data.forEach(rate => {\n * console.log(`${rate.date}: 10Y ${rate.tenY}%, 2Y ${rate.twoY}%`);\n * });\n *\n * // Get recent treasury rates\n * const recentRates = await fmp.economic.getTreasuryRates({\n * from: '2024-01-01'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#treasury-rates-economics-data|FMP Treasury Rates Documentation}\n */\n async getTreasuryRates(params: {\n from?: string;\n to?: string;\n }): Promise<APIResponse<TreasuryRate[]>> {\n const { from, to } = params;\n\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n return this.client.get('/treasury', 'v4', queryParams);\n }\n\n /**\n * Get economic indicators data\n *\n * Provides real-time and historical economic data for a wide variety of\n * economic indicators including GDP, unemployment, inflation, retail sales,\n * and many others. Essential for macroeconomic analysis and understanding\n * economic trends and cycles.\n *\n * @param params - Economic indicators request parameters\n * @param params.name - The economic indicator to retrieve\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to 1 year ago)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to today)\n *\n * @returns Promise resolving to array of economic indicator data with historical values\n *\n * @example\n * ```typescript\n * // Get GDP data for the last year\n * const gdpData = await fmp.economic.getEconomicIndicators({\n * name: 'GDP',\n * from: '2023-01-01',\n * to: '2023-12-31'\n * });\n * gdpData.data.forEach(gdp => {\n * console.log(`${gdp.date}: GDP $${gdp.value.toLocaleString()} billion`);\n * });\n *\n * // Get unemployment rate data\n * const unemploymentData = await fmp.economic.getEconomicIndicators({\n * name: 'unemploymentRate',\n * from: '2024-01-01'\n * });\n *\n * // Get inflation rate data\n * const inflationData = await fmp.economic.getEconomicIndicators({\n * name: 'inflationRate',\n * from: '2023-01-01',\n * to: '2023-12-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#economic-indicators-economics-data|FMP Economic Indicators Documentation}\n */\n async getEconomicIndicators(params: {\n name:\n | 'GDP'\n | 'realGDP'\n | 'nominalPotentialGDP'\n | 'realGDPPerCapita'\n | 'federalFunds'\n | 'CPI'\n | 'inflationRate'\n | 'inflation'\n | 'retailSales'\n | 'consumerSentiment'\n | 'durableGoods'\n | 'unemploymentRate'\n | 'totalNonfarmPayroll'\n | 'initialClaims'\n | 'industrialProductionTotalIndex'\n | 'newPrivatelyOwnedHousingUnitsStartedTotalUnits'\n | 'totalVehicleSales'\n | 'retailMoneyFunds'\n | 'smoothedUSRecessionProbabilities'\n | '3MonthOr90DayRatesAndYieldsCertificatesOfDeposit'\n | 'commercialBankInterestRateOnCreditCardPlansAllAccounts'\n | '30YearFixedRateMortgageAverage'\n | '15YearFixedRateMortgageAverage';\n from?: string;\n to?: string;\n }): Promise<APIResponse<EconomicIndicator[]>> {\n const { name, from, to } = params;\n\n const queryParams: { name: string; from?: string; to?: string } = { name };\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get(`/economic`, 'v4', queryParams);\n }\n}\n","// Market endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n MarketHours,\n MarketPerformance,\n MarketSectorPerformance,\n MarketIndex,\n} from '@/types/market';\n\nexport class MarketEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get current market hours and trading status\n *\n * Provides real-time information about market trading hours, including\n * whether markets are currently open or closed, trading session times,\n * and upcoming market holidays. Essential for determining trading\n * availability and market status.\n *\n * @returns Promise resolving to market hours data with trading status and session information\n *\n * @example\n * ```typescript\n * // Get current market status\n * const marketHours = await fmp.market.getMarketHours();\n * console.log(`Market is ${marketHours.data.isTheStockMarketOpen ? 'OPEN' : 'CLOSED'}`);\n * console.log(`Current time: ${marketHours.data.currentTime}`);\n * console.log(`Next trading day: ${marketHours.data.nextTradingDay}`);\n *\n * // Check if it's a trading day\n * if (marketHours.data.isTheStockMarketOpen) {\n * console.log('Markets are currently open for trading');\n * } else {\n * console.log('Markets are closed');\n * }\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-hours|FMP Market Hours Documentation}\n */\n async getMarketHours(): Promise<APIResponse<MarketHours>> {\n return this.client.get('/market-hours', 'v3');\n }\n\n /**\n * Get overall market performance data\n *\n * Provides comprehensive market performance data including major indices,\n * market breadth, and key performance metrics. Essential for understanding\n * overall market sentiment, trends, and daily market activity.\n *\n * @returns Promise resolving to array of market performance data with indices and metrics\n *\n * @example\n * ```typescript\n * // Get overall market performance\n * const marketPerformance = await fmp.market.getMarketPerformance();\n * marketPerformance.data.forEach(market => {\n * console.log(`${market.index}: ${market.change} (${market.changesPercentage}%)`);\n * console.log(` Open: $${market.open}, High: $${market.dayHigh}, Low: $${market.dayLow}`);\n * });\n *\n * // Find specific indices\n * const sp500 = marketPerformance.data.find(market => market.index === 'S&P 500');\n * console.log(`S&P 500 performance: ${sp500?.changesPercentage}%`);\n *\n * // Check market sentiment\n * const gainers = marketPerformance.data.filter(market => market.changesPercentage > 0);\n * const losers = marketPerformance.data.filter(market => market.changesPercentage < 0);\n * console.log(`Gaining indices: ${gainers.length}, Losing indices: ${losers.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-performance|FMP Market Performance Documentation}\n */\n async getMarketPerformance(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/market-performance', 'v3');\n }\n\n /**\n * Get top gaining stocks for the current trading day\n *\n * Provides a list of stocks that have gained the most value during the\n * current trading session. Essential for identifying momentum stocks,\n * tracking market movers, and discovering potential investment opportunities.\n * Useful for day trading, momentum strategies, and market analysis.\n *\n * @returns Promise resolving to array of top gaining stocks with price and percentage change data\n *\n * @example\n * ```typescript\n * // Get top gainers for the day\n * const gainers = await fmp.market.getGainers();\n * console.log(`Top ${gainers.data.length} gaining stocks today:`);\n *\n * gainers.data.forEach((stock, index) => {\n * console.log(`${index + 1}. ${stock.symbol} (${stock.name})`);\n * console.log(` Price: $${stock.price} | Change: +${stock.change} (${stock.changesPercentage}%)`);\n * console.log(` Volume: ${stock.volume.toLocaleString()}`);\n * });\n *\n * // Find stocks with >10% gains\n * const bigGainers = gainers.data.filter(stock => stock.changesPercentage > 10);\n * console.log(`Stocks with >10% gains: ${bigGainers.length}`);\n *\n * // Check volume leaders among gainers\n * const highVolumeGainers = gainers.data.filter(stock => stock.volume > 1000000);\n * console.log(`High volume gainers (>1M shares): ${highVolumeGainers.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-biggest-gainers-market-overview|FMP Market Biggest Gainers Documentation}\n */\n async getGainers(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/gainers', 'v3');\n }\n\n /**\n * Get top losing stocks for the current trading day\n *\n * Provides a list of stocks that have lost the most value during the\n * current trading session. Essential for identifying underperforming stocks,\n * tracking market decliners, and discovering potential contrarian opportunities.\n * Useful for risk management, short selling strategies, and market analysis.\n *\n * @returns Promise resolving to array of top losing stocks with price and percentage change data\n *\n * @example\n * ```typescript\n * // Get top losers for the day\n * const losers = await fmp.market.getLosers();\n * console.log(`Top ${losers.data.length} losing stocks today:`);\n *\n * losers.data.forEach((stock, index) => {\n * console.log(`${index + 1}. ${stock.symbol} (${stock.name})`);\n * console.log(` Price: $${stock.price} | Change: ${stock.change} (${stock.changesPercentage}%)`);\n * console.log(` Volume: ${stock.volume.toLocaleString()}`);\n * });\n *\n * // Find stocks with >10% losses\n * const bigLosers = losers.data.filter(stock => stock.changesPercentage < -10);\n * console.log(`Stocks with >10% losses: ${bigLosers.length}`);\n *\n * // Check for potential oversold conditions\n * const highVolumeLosers = losers.data.filter(stock => stock.volume > 1000000);\n * console.log(`High volume losers (>1M shares): ${highVolumeLosers.length}`);\n *\n * // Look for potential bounce candidates\n * const oversoldStocks = losers.data.filter(stock =>\n * stock.changesPercentage < -5 && stock.volume > 500000\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-biggest-losers-market-overview|FMP Market Biggest Losers Documentation}\n */\n async getLosers(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/losers', 'v3');\n }\n\n /**\n * Get most actively traded stocks for the current trading day\n *\n * Provides a list of stocks with the highest trading volume during the\n * current trading session. Essential for identifying stocks with high\n * liquidity, tracking market interest, and discovering stocks with\n * significant trading activity. Useful for day trading and liquidity analysis.\n *\n * @returns Promise resolving to array of most active stocks with volume and price data\n *\n * @example\n * ```typescript\n * // Get most active stocks for the day\n * const mostActive = await fmp.market.getMostActive();\n * console.log(`Top ${mostActive.data.length} most active stocks today:`);\n *\n * mostActive.data.forEach((stock, index) => {\n * console.log(`${index + 1}. ${stock.symbol} (${stock.name})`);\n * console.log(` Volume: ${stock.volume.toLocaleString()} shares`);\n * console.log(` Price: $${stock.price} | Change: ${stock.change} (${stock.changesPercentage}%)`);\n * console.log(` Avg Volume: ${stock.avgVolume?.toLocaleString() || 'N/A'}`);\n * });\n *\n * // Find stocks with unusual volume (>2x average)\n * const unusualVolume = mostActive.data.filter(stock =>\n * stock.avgVolume && stock.volume > stock.avgVolume * 2\n * );\n * console.log(`Stocks with unusual volume: ${unusualVolume.length}`);\n *\n * // Check for high volume gainers\n * const highVolumeGainers = mostActive.data.filter(stock =>\n * stock.changesPercentage > 0 && stock.volume > 1000000\n * );\n * console.log(`High volume gainers: ${highVolumeGainers.length}`);\n *\n * // Find penny stocks with high volume\n * const pennyStocks = mostActive.data.filter(stock =>\n * stock.price < 5 && stock.volume > 500000\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-most-actives|FMP Market Most Actives Documentation}\n */\n async getMostActive(): Promise<APIResponse<MarketPerformance[]>> {\n return this.client.get('/stock_market/actives', 'v3');\n }\n\n /**\n * Get sector performance data for the current trading day\n *\n * Provides performance data for all major market sectors including\n * technology, healthcare, financials, energy, and others. Essential for\n * sector rotation analysis, identifying leading/lagging sectors, and\n * understanding market breadth and sector-specific trends.\n *\n * @returns Promise resolving to array of sector performance data with percentage changes\n *\n * @example\n * ```typescript\n * // Get sector performance for the day\n * const sectorPerformance = await fmp.market.getSectorPerformance();\n * console.log(`Sector performance for ${sectorPerformance.data.length} sectors:`);\n *\n * sectorPerformance.data.forEach(sector => {\n * const changeColor = sector.changesPercentage >= 0 ? 'green' : 'red';\n * console.log(`${sector.sector}: ${sector.changesPercentage}%`);\n * console.log(` Change: ${sector.changesPercentage >= 0 ? '+' : ''}${sector.changesPercentage}%`);\n * });\n *\n * // Find best performing sectors\n * const topSectors = sectorPerformance.data\n * .sort((a, b) => b.changesPercentage - a.changesPercentage)\n * .slice(0, 3);\n * console.log('Top 3 performing sectors:');\n * topSectors.forEach((sector, index) => {\n * console.log(`${index + 1}. ${sector.sector}: ${sector.changesPercentage}%`);\n * });\n *\n * // Find worst performing sectors\n * const bottomSectors = sectorPerformance.data\n * .sort((a, b) => a.changesPercentage - b.changesPercentage)\n * .slice(0, 3);\n * console.log('Bottom 3 performing sectors:');\n * bottomSectors.forEach((sector, index) => {\n * console.log(`${index + 1}. ${sector.sector}: ${sector.changesPercentage}%`);\n * });\n *\n * // Check for sector rotation\n * const gainingSectors = sectorPerformance.data.filter(sector => sector.changesPercentage > 0);\n * const losingSectors = sectorPerformance.data.filter(sector => sector.changesPercentage < 0);\n * console.log(`Sectors gaining: ${gainingSectors.length}, Sectors losing: ${losingSectors.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#sector-performance-market-overview|FMP Sector Performance Documentation}\n */\n async getSectorPerformance(): Promise<APIResponse<MarketSectorPerformance[]>> {\n return this.client.get('/sector-performance', 'v3');\n }\n\n /**\n * Get real-time data for major market indices\n *\n * Provides real-time quote data for all major stock market indices including\n * S&P 500, Dow Jones Industrial Average, NASDAQ Composite, and other global\n * indices. Essential for tracking overall market performance, understanding\n * market sentiment, and identifying broad market trends.\n *\n * @returns Promise resolving to array of market index data with real-time quotes\n *\n * @example\n * ```typescript\n * // Get real-time market indices\n * const marketIndices = await fmp.market.getMarketIndex();\n * console.log(`Real-time data for ${marketIndices.data.length} major indices:`);\n *\n * marketIndices.data.forEach(index => {\n * console.log(`${index.symbol} (${index.name}):`);\n * console.log(` Price: $${index.price}`);\n * console.log(` Change: ${index.change} (${index.changesPercentage}%)`);\n * console.log(` Day Range: $${index.dayLow} - $${index.dayHigh}`);\n * console.log(` Volume: ${index.volume?.toLocaleString() || 'N/A'}`);\n * });\n *\n * // Find specific major indices\n * const sp500 = marketIndices.data.find(index => index.symbol === '^GSPC');\n * const nasdaq = marketIndices.data.find(index => index.symbol === '^IXIC');\n * const dowJones = marketIndices.data.find(index => index.symbol === '^DJI');\n *\n * console.log(`S&P 500: ${sp500?.price} (${sp500?.changesPercentage}%)`);\n * console.log(`NASDAQ: ${nasdaq?.price} (${nasdaq?.changesPercentage}%)`);\n * console.log(`Dow Jones: ${dowJones?.price} (${dowJones?.changesPercentage}%)`);\n *\n * // Check market breadth\n * const gainingIndices = marketIndices.data.filter(index => index.changesPercentage > 0);\n * const losingIndices = marketIndices.data.filter(index => index.changesPercentage < 0);\n * console.log(`Indices gaining: ${gainingIndices.length}, Indices losing: ${losingIndices.length}`);\n *\n * // Find international indices\n * const internationalIndices = marketIndices.data.filter(index =>\n * !index.symbol.startsWith('^') ||\n * index.name.toLowerCase().includes('europe') ||\n * index.name.toLowerCase().includes('asia')\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#market-index-market-overview|FMP Market Index Documentation}\n */\n async getMarketIndex(): Promise<APIResponse<MarketIndex[]>> {\n return this.client.get('/quotes/index', 'v3');\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport { StockList, ETFList, CryptoList, ForexList, AvailableIndexesList } from '@/types/list';\n\nexport class ListEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get comprehensive list of all available stocks\n *\n * Provides a complete list of all stocks available on major exchanges including\n * NYSE, NASDAQ, and other global markets. Essential for discovering available\n * symbols, building watchlists, or creating stock screening applications.\n *\n * @returns Promise resolving to array of stock data with symbol, name, exchange, and price information\n *\n * @example\n * ```typescript\n * // Get all available stocks\n * const stocks = await fmp.list.getStockList();\n * console.log(`Total stocks available: ${stocks.data.length}`);\n *\n * // Find specific stocks\n * const appleStock = stocks.data.find(stock => stock.symbol === 'AAPL');\n * console.log(`Apple: ${appleStock?.name} (${appleStock?.exchange})`);\n *\n * // Filter by exchange\n * const nasdaqStocks = stocks.data.filter(stock => stock.exchange === 'NASDAQ');\n * console.log(`NASDAQ stocks: ${nasdaqStocks.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#symbol-list-stock-list|FMP Stock List Documentation}\n */\n async getStockList(): Promise<APIResponse<StockList[]>> {\n return this.client.get('/stock/list');\n }\n\n /**\n * Get comprehensive list of all available ETFs\n *\n * Provides a complete list of all Exchange-Traded Funds (ETFs) available for trading.\n * Includes ETFs from various asset classes including equity, bond, commodity, and\n * sector-specific funds. Essential for ETF research and portfolio construction.\n *\n * @returns Promise resolving to array of ETF data with symbol, name, exchange, and asset class information\n *\n * @example\n * ```typescript\n * // Get all available ETFs\n * const etfs = await fmp.list.getETFList();\n * console.log(`Total ETFs available: ${etfs.data.length}`);\n *\n * // Find specific ETFs\n * const spyETF = etfs.data.find(etf => etf.symbol === 'SPY');\n * console.log(`SPY: ${spyETF?.name} (${spyETF?.assetClass})`);\n *\n * // Filter by asset class\n * const equityETFs = etfs.data.filter(etf => etf.assetClass === 'Equity');\n * console.log(`Equity ETFs: ${equityETFs.length}`);\n *\n * // Find sector ETFs\n * const techETFs = etfs.data.filter(etf =>\n * etf.name.toLowerCase().includes('technology') ||\n * etf.name.toLowerCase().includes('tech')\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#exchange-traded-fund-search-stock-list|FMP ETF List Documentation}\n */\n async getETFList(): Promise<APIResponse<ETFList[]>> {\n return this.client.get('/etf/list');\n }\n\n /**\n * Get comprehensive list of all available cryptocurrencies\n *\n * Provides a complete list of all cryptocurrencies available for trading.\n * Includes major cryptocurrencies like Bitcoin, Ethereum, and thousands of altcoins\n * with their trading pairs against USD and other major currencies.\n *\n * @returns Promise resolving to array of cryptocurrency data with symbol, name, and exchange information\n *\n * @example\n * ```typescript\n * // Get all available cryptocurrencies\n * const cryptos = await fmp.list.getCryptoList();\n * console.log(`Total cryptocurrencies available: ${cryptos.data.length}`);\n *\n * // Find major cryptocurrencies\n * const bitcoin = cryptos.data.find(crypto => crypto.symbol === 'BTCUSD');\n * console.log(`Bitcoin: ${bitcoin?.name} (${bitcoin?.exchange})`);\n *\n * const ethereum = cryptos.data.find(crypto => crypto.symbol === 'ETHUSD');\n * console.log(`Ethereum: ${ethereum?.name} (${ethereum?.exchange})`);\n *\n * // Filter by exchange\n * const binanceCryptos = cryptos.data.filter(crypto => crypto.exchange === 'Binance');\n * console.log(`Binance cryptocurrencies: ${binanceCryptos.length}`);\n *\n * // Find altcoins\n * const altcoins = cryptos.data.filter(crypto =>\n * !['BTCUSD', 'ETHUSD', 'USDTUSD', 'USDCUSD'].includes(crypto.symbol)\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cryptocurrencies-list-crypto|FMP Cryptocurrency List Documentation}\n */\n async getCryptoList(): Promise<APIResponse<CryptoList[]>> {\n return this.client.get('/symbol/available-cryptocurrencies');\n }\n\n /**\n * Get comprehensive list of all available forex currency pairs\n *\n * Provides a complete list of all foreign exchange currency pairs available for trading.\n * Includes major, minor, and exotic currency pairs with their base and quote currencies.\n * Essential for forex trading, currency analysis, and international market research.\n *\n * @returns Promise resolving to array of forex data with currency pair symbols and exchange information\n *\n * @example\n * ```typescript\n * // Get all available forex pairs\n * const forexPairs = await fmp.list.getForexList();\n * console.log(`Total forex pairs available: ${forexPairs.data.length}`);\n *\n * // Find major currency pairs\n * const eurUsd = forexPairs.data.find(pair => pair.symbol === 'EURUSD');\n * console.log(`EUR/USD: ${eurUsd?.name} (${eurUsd?.exchange})`);\n *\n * const gbpUsd = forexPairs.data.find(pair => pair.symbol === 'GBPUSD');\n * console.log(`GBP/USD: ${gbpUsd?.name} (${gbpUsd?.exchange})`);\n *\n * // Filter major pairs (USD as quote currency)\n * const majorPairs = forexPairs.data.filter(pair =>\n * pair.symbol.endsWith('USD') && pair.symbol.length === 6\n * );\n * console.log(`Major pairs: ${majorPairs.length}`);\n *\n * // Find exotic pairs\n * const exoticPairs = forexPairs.data.filter(pair =>\n * pair.symbol.includes('ZAR') || pair.symbol.includes('TRY') || pair.symbol.includes('BRL')\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#forex-list-forex|FMP Forex List Documentation}\n */\n async getForexList(): Promise<APIResponse<ForexList[]>> {\n return this.client.get('/symbol/available-forex-currency-pairs');\n }\n\n /**\n * Get comprehensive list of all available market indexes\n *\n * Provides a complete list of all market indexes available for tracking and analysis.\n * Includes major global indexes like S&P 500, NASDAQ, Dow Jones, as well as\n * international indexes, sector indexes, and specialized market benchmarks.\n *\n * @returns Promise resolving to array of index data with symbol, name, and exchange information\n *\n * @example\n * ```typescript\n * // Get all available indexes\n * const indexes = await fmp.list.getAvailableIndexes();\n * console.log(`Total indexes available: ${indexes.data.length}`);\n *\n * // Find major US indexes\n * const sp500 = indexes.data.find(index => index.symbol === '^GSPC');\n * console.log(`S&P 500: ${sp500?.name} (${sp500?.exchange})`);\n *\n * const nasdaq = indexes.data.find(index => index.symbol === '^IXIC');\n * console.log(`NASDAQ: ${nasdaq?.name} (${nasdaq?.exchange})`);\n *\n * const dowJones = indexes.data.find(index => index.symbol === '^DJI');\n * console.log(`Dow Jones: ${dowJones?.name} (${dowJones?.exchange})`);\n *\n * // Filter by exchange\n * const nyseIndexes = indexes.data.filter(index => index.exchange === 'NYSE');\n * console.log(`NYSE indexes: ${nyseIndexes.length}`);\n *\n * // Find sector indexes\n * const techIndexes = indexes.data.filter(index =>\n * index.name.toLowerCase().includes('technology') ||\n * index.name.toLowerCase().includes('tech')\n * );\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#available-indexes|FMP Available Indexes Documentation}\n */\n async getAvailableIndexes(): Promise<APIResponse<AvailableIndexesList[]>> {\n return this.client.get('/symbol/available-indexes');\n }\n}\n","import { APIResponse } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n EarningsCalendar,\n DividendsCalendar,\n EconomicsCalendar,\n IPOCalendar,\n SplitsCalendar,\n EarningsConfirmed,\n} from '@/types/calendar';\n\nexport class CalendarEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get earnings calendar data\n *\n * Provides upcoming earnings announcements for all publicly traded companies\n * within a specified date range. Essential for tracking earnings season,\n * market events, and investment timing decisions.\n *\n * @param params - Earnings calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of earnings calendar data with announcement details\n *\n * @example\n * ```typescript\n * // Get earnings calendar for next week\n * const earningsCalendar = await fmp.calendar.getEarningsCalendar({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * earningsCalendar.data.forEach(earning => {\n * console.log(`${earning.date}: ${earning.symbol} - Est. EPS: ${earning.estimatedEps}`);\n * });\n *\n * // Get earnings calendar for current month\n * const monthlyEarnings = await fmp.calendar.getEarningsCalendar({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#earnings-calendar-earnings|FMP Earnings Calendar Documentation}\n */\n async getEarningsCalendar(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<EarningsCalendar[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/earning_calendar', 'v3', queryParams);\n }\n\n /**\n * Get confirmed earnings calendar data\n *\n * Provides confirmed earnings announcements with verified dates and times.\n * These are earnings announcements that have been officially confirmed\n * by companies, providing more reliable scheduling information.\n *\n * @param params - Confirmed earnings calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of confirmed earnings calendar data\n *\n * @example\n * ```typescript\n * // Get confirmed earnings for next week\n * const confirmedEarnings = await fmp.calendar.getEarningsConfirmed({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * confirmedEarnings.data.forEach(earning => {\n * console.log(`${earning.date}: ${earning.symbol} - Confirmed: ${earning.time}`);\n * });\n *\n * // Get confirmed earnings for current month\n * const monthlyConfirmed = await fmp.calendar.getEarningsConfirmed({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#earnings-confirmed-earnings|FMP Earnings Confirmed Documentation}\n */\n async getEarningsConfirmed(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<EarningsConfirmed[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/earning-calendar-confirmed', 'v4', queryParams);\n }\n\n /**\n * Get dividends calendar data\n *\n * Provides upcoming dividend payments and ex-dividend dates for all\n * publicly traded companies within a specified date range. Essential\n * for dividend investors and income-focused strategies.\n *\n * @param params - Dividends calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of dividends calendar data with payment details\n *\n * @example\n * ```typescript\n * // Get dividends calendar for next week\n * const dividendsCalendar = await fmp.calendar.getDividendsCalendar({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * dividendsCalendar.data.forEach(dividend => {\n * console.log(`${dividend.date}: ${dividend.symbol} - Amount: $${dividend.amount}`);\n * });\n *\n * // Get dividends calendar for current month\n * const monthlyDividends = await fmp.calendar.getDividendsCalendar({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#dividends-calendar-dividends|FMP Dividends Calendar Documentation}\n */\n async getDividendsCalendar(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<DividendsCalendar[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/stock_dividend_calendar', 'v3', queryParams);\n }\n\n /**\n * Get economic calendar data\n *\n * Provides upcoming economic events, indicators, and data releases\n * that can impact financial markets. Essential for understanding\n * market-moving events and economic trends.\n *\n * @param params - Economic calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of economic calendar data with event details\n *\n * @example\n * ```typescript\n * // Get economic calendar for next week\n * const economicCalendar = await fmp.calendar.getEconomicsCalendar({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * economicCalendar.data.forEach(event => {\n * console.log(`${event.date}: ${event.event} - Country: ${event.country}`);\n * });\n *\n * // Get economic calendar for current month\n * const monthlyEconomic = await fmp.calendar.getEconomicsCalendar({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#economics-calendar-economics-data|FMP Economic Calendar Documentation}\n */\n async getEconomicsCalendar(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<EconomicsCalendar[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/economic_calendar', 'v3', queryParams);\n }\n\n /**\n * Get IPO calendar data\n *\n * Provides upcoming initial public offerings (IPOs) and their details\n * within a specified date range. Essential for tracking new market\n * entrants and investment opportunities in newly public companies.\n *\n * @param params - IPO calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of IPO calendar data with offering details\n *\n * @example\n * ```typescript\n * // Get IPO calendar for next week\n * const ipoCalendar = await fmp.calendar.getIPOCalendar({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * ipoCalendar.data.forEach(ipo => {\n * console.log(`${ipo.date}: ${ipo.symbol} - Price: $${ipo.price}, Shares: ${ipo.shares.toLocaleString()}`);\n * });\n *\n * // Get IPO calendar for current month\n * const monthlyIPOs = await fmp.calendar.getIPOCalendar({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#ipo-calender-by-ipo-calendar|FMP IPO Calendar Documentation}\n */\n async getIPOCalendar(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<IPOCalendar[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/ipo_calendar', 'v3', queryParams);\n }\n\n /**\n * Get stock splits calendar data\n *\n * Provides upcoming stock splits for publicly traded companies within\n * a specified date range. Essential for understanding corporate actions\n * that affect share prices and trading dynamics.\n *\n * @param params - Stock splits calendar request parameters\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to today)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to 30 days from today)\n *\n * @returns Promise resolving to array of stock splits calendar data with split details\n *\n * @example\n * ```typescript\n * // Get stock splits calendar for next week\n * const splitsCalendar = await fmp.calendar.getSplitsCalendar({\n * from: '2024-01-15',\n * to: '2024-01-22'\n * });\n * splitsCalendar.data.forEach(split => {\n * console.log(`${split.date}: ${split.symbol} - Ratio: ${split.numerator}:${split.denominator}`);\n * });\n *\n * // Get stock splits calendar for current month\n * const monthlySplits = await fmp.calendar.getSplitsCalendar({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#splits-calendar-splits|FMP Stock Splits Calendar Documentation}\n */\n async getSplitsCalendar(\n params: {\n from?: string;\n to?: string;\n } = {},\n ): Promise<APIResponse<SplitsCalendar[]>> {\n const { from, to } = params;\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get('/stock_split_calendar', 'v3', queryParams);\n }\n}\n","import { APIResponse } from '@/types';\nimport { FMPClient } from '@/client';\nimport {\n CompanyNotes,\n CompanyProfile,\n CompanyTranscriptData,\n EarningsCallTranscript,\n ExecutiveCompensation,\n HistoricalEmployeeCount,\n HistoricalSharesFloat,\n SharesFloat,\n} from '@/types/company';\n\nexport class CompanyEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get comprehensive company profile and information\n *\n * Provides detailed company information including financial metrics, business description,\n * headquarters location, and key performance indicators. Essential for fundamental analysis\n * and understanding a company's business model and market position.\n *\n * @param symbol - The stock symbol to get the profile for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n *\n * @returns Promise resolving to comprehensive company profile with financial and business information\n *\n * @example\n * ```typescript\n * // Get Apple's company profile\n * const profile = await fmp.company.getCompanyProfile('AAPL');\n * console.log(`Company: ${profile.data.companyName}`);\n * console.log(`Industry: ${profile.data.industry}`);\n * console.log(`Market Cap: $${profile.data.mktCap.toLocaleString()}`);\n * console.log(`Description: ${profile.data.description.substring(0, 100)}...`);\n *\n * // Get Microsoft's profile\n * const msftProfile = await fmp.company.getCompanyProfile('MSFT');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#company-profile-company-information|FMP Company Profile Documentation}\n */\n async getCompanyProfile(symbol: string): Promise<APIResponse<CompanyProfile>> {\n return this.client.getSingle(`/profile/${symbol}`, 'v3');\n }\n\n /**\n * Get executive compensation and governance information\n *\n * Provides detailed compensation data for company executives including salary, bonuses,\n * stock options, and other benefits. Essential for governance analysis and understanding\n * executive pay structures and alignment with shareholder interests.\n *\n * @param symbol - The stock symbol to get executive compensation for (e.g., 'AAPL', 'MSFT', 'TSLA')\n *\n * @returns Promise resolving to array of executive compensation data with detailed pay information\n *\n * @example\n * ```typescript\n * // Get Apple's executive compensation\n * const compensation = await fmp.company.getExecutiveCompensation('AAPL');\n * compensation.data.forEach(exec => {\n * console.log(`${exec.name} (${exec.title}):`);\n * console.log(` Salary: $${exec.salary.toLocaleString()}`);\n * console.log(` Bonus: $${exec.bonus.toLocaleString()}`);\n * console.log(` Stock Options: $${exec.stockAwards.toLocaleString()}`);\n * });\n *\n * // Get Tesla's executive compensation\n * const teslaComp = await fmp.company.getExecutiveCompensation('TSLA');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#executive-compensation-company-information|FMP Executive Compensation Documentation}\n */\n async getExecutiveCompensation(symbol: string): Promise<APIResponse<ExecutiveCompensation[]>> {\n return this.client.get(`/governance/executive_compensation`, 'v4', { symbol });\n }\n\n /**\n * Get company notes and financial disclosures\n *\n * Provides important notes and disclosures from company financial statements.\n * These notes contain critical information about accounting policies, risks,\n * contingencies, and other material information that affects financial analysis.\n *\n * @param symbol - The stock symbol to get notes for (e.g., 'AAPL', 'MSFT', 'JPM')\n *\n * @returns Promise resolving to array of company notes with detailed disclosure information\n *\n * @example\n * ```typescript\n * // Get Apple's company notes\n * const notes = await fmp.company.getCompanyNotes('AAPL');\n * notes.data.forEach(note => {\n * console.log(`Note ${note.noteNumber}: ${note.noteTitle}`);\n * console.log(` Content: ${note.noteContent.substring(0, 100)}...`);\n * });\n *\n * // Get JPMorgan's notes\n * const jpmNotes = await fmp.company.getCompanyNotes('JPM');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#company-notes-company-information|FMP Company Notes Documentation}\n */\n async getCompanyNotes(symbol: string): Promise<APIResponse<CompanyNotes[]>> {\n return this.client.get(`/company-notes`, 'v4', { symbol });\n }\n\n /**\n * Get historical employee count data\n *\n * Provides historical data on company employee counts over time.\n * Useful for analyzing company growth, operational efficiency, and workforce trends.\n * Employee count is often a key indicator of company expansion or contraction.\n *\n * @param symbol - The stock symbol to get historical employee count for (e.g., 'AAPL', 'MSFT', 'AMZN')\n *\n * @returns Promise resolving to array of historical employee count data with year-by-year information\n *\n * @example\n * ```typescript\n * // Get Apple's employee count history\n * const employees = await fmp.company.getHistoricalEmployeeCount('AAPL');\n * employees.data.forEach(year => {\n * console.log(`${year.year}: ${year.employeeCount.toLocaleString()} employees`);\n * });\n *\n * // Get Amazon's employee growth\n * const amazonEmployees = await fmp.company.getHistoricalEmployeeCount('AMZN');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#historical-employee-company-information|FMP Historical Employee Count Documentation}\n */\n async getHistoricalEmployeeCount(\n symbol: string,\n ): Promise<APIResponse<HistoricalEmployeeCount[]>> {\n return this.client.get(`/historical/employee_count`, 'v4', { symbol });\n }\n\n /**\n * Get current shares float information\n *\n * Provides the total number of shares that are publicly traded (float) for a company.\n * The float is calculated by subtracting restricted shares from total outstanding shares.\n * Important for understanding liquidity, volatility, and trading dynamics.\n *\n * @param symbol - The stock symbol to get shares float for (e.g., 'AAPL', 'TSLA', 'NVDA')\n *\n * @returns Promise resolving to shares float data with current float information\n *\n * @example\n * ```typescript\n * // Get Apple's shares float\n * const float = await fmp.company.getSharesFloat('AAPL');\n * console.log(`Float: ${float.data.sharesFloat.toLocaleString()} shares`);\n * console.log(`Outstanding: ${float.data.sharesOutstanding.toLocaleString()} shares`);\n * console.log(`Restricted: ${float.data.restrictedShares.toLocaleString()} shares`);\n *\n * // Get Tesla's float\n * const teslaFloat = await fmp.company.getSharesFloat('TSLA');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#company-share-float-share-float|FMP Shares Float Documentation}\n */\n async getSharesFloat(symbol: string): Promise<APIResponse<SharesFloat>> {\n return this.client.getSingle(`/shares_float`, 'v4', { symbol });\n }\n\n /**\n * Get historical shares float data\n *\n * Provides historical data on company shares float over time.\n * Useful for analyzing changes in liquidity, share issuance, and corporate actions\n * that affect the number of publicly traded shares.\n *\n * @param symbol - The stock symbol to get historical shares float for (e.g., 'AAPL', 'TSLA', 'NVDA')\n *\n * @returns Promise resolving to array of historical shares float data with date-by-date information\n *\n * @example\n * ```typescript\n * // Get Apple's historical float\n * const historicalFloat = await fmp.company.getHistoricalSharesFloat('AAPL');\n * historicalFloat.data.forEach(entry => {\n * console.log(`${entry.date}: ${entry.sharesFloat.toLocaleString()} shares`);\n * });\n *\n * // Get Tesla's float history\n * const teslaHistory = await fmp.company.getHistoricalSharesFloat('TSLA');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#company-historical-share-float|FMP Historical Shares Float Documentation}\n */\n async getHistoricalSharesFloat(symbol: string): Promise<APIResponse<HistoricalSharesFloat[]>> {\n return this.client.get(`/historical/shares_float`, 'v4', { symbol });\n }\n\n /**\n * Get earnings call transcript for specific quarter\n *\n * Provides the full transcript of a company's earnings conference call.\n * Contains detailed Q&A sessions, management commentary, and insights into\n * company performance, strategy, and future outlook.\n *\n * @param params - Earnings call transcript request parameters\n * @param params.symbol - The stock symbol to get transcript for (e.g., 'AAPL', 'MSFT', 'TSLA')\n * @param params.year - The year of the earnings call (e.g., 2024)\n * @param params.quarter - The quarter of the earnings call (1, 2, 3, or 4)\n *\n * @returns Promise resolving to earnings call transcript with full text content\n *\n * @example\n * ```typescript\n * // Get Apple's Q1 2024 earnings call\n * const transcript = await fmp.company.getEarningsCallTranscript({\n * symbol: 'AAPL',\n * year: 2024,\n * quarter: 1\n * });\n * console.log(`Transcript: ${transcript.data[0].content.substring(0, 200)}...`);\n *\n * // Get Tesla's Q4 2023 earnings call\n * const teslaTranscript = await fmp.company.getEarningsCallTranscript({\n * symbol: 'TSLA',\n * year: 2023,\n * quarter: 4\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#earnings-transcript-earnings-transcripts|FMP Earnings Call Transcript Documentation}\n */\n async getEarningsCallTranscript(params: {\n symbol: string;\n year: number;\n quarter: number;\n }): Promise<APIResponse<EarningsCallTranscript[]>> {\n const { symbol, year, quarter } = params;\n return this.client.getSingle(`/earning_call_transcript/${symbol}`, 'v3', { year, quarter });\n }\n\n /**\n * Get available earnings call transcript dates\n *\n * Provides a list of all available earnings call transcript dates for a company.\n * Useful for discovering which quarters have transcripts available before\n * requesting the full transcript content.\n *\n * @param symbol - The stock symbol to get transcript dates for (e.g., 'AAPL', 'MSFT', 'TSLA')\n *\n * @returns Promise resolving to array of available transcript dates with quarter information\n *\n * @example\n * ```typescript\n * // Get Apple's available transcript dates\n * const transcriptDates = await fmp.company.getCompanyTranscriptData('AAPL');\n * transcriptDates.data.forEach(date => {\n * console.log(`Q${date.quarter} ${date.year}: ${date.date}`);\n * });\n *\n * // Get Microsoft's transcript availability\n * const msftDates = await fmp.company.getCompanyTranscriptData('MSFT');\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#transcript-dates-earnings-transcripts|FMP Company Transcript Data Documentation}\n */\n async getCompanyTranscriptData(symbol: string): Promise<APIResponse<CompanyTranscriptData[]>> {\n return this.client.getSingle(`/earning_call_transcript`, 'v4', { symbol });\n }\n}\n","// Unified quote endpoints for FMP API - handles stocks, crypto, forex, commodities, and ETFs\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport { Quote, HistoricalPriceResponse, HistoricalPriceData } from '@/types/quote';\n\nexport class QuoteEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get real-time quote data for any asset type (stocks, crypto, forex, commodities, ETFs)\n *\n * This endpoint provides current market data including price, volume, market cap, and key metrics.\n * Works with any valid symbol across all supported asset classes.\n *\n * @param symbol - The trading symbol (e.g., 'AAPL', 'BTCUSD', 'EURUSD', 'GCUSD', 'SPY')\n *\n * @returns Promise resolving to quote data with current price, volume, market cap, and performance metrics\n *\n * @example\n * ```typescript\n * // Get stock quote\n * const aaplQuote = await fmp.quote.getQuote('AAPL');\n *\n * // Get crypto quote\n * const btcQuote = await fmp.quote.getQuote('BTCUSD');\n *\n * // Get forex quote\n * const eurQuote = await fmp.quote.getQuote('EURUSD');\n * ```\n */\n async getQuote(symbol: string): Promise<APIResponse<Quote>> {\n // All asset types use the same /quote/{symbol} endpoint\n return this.client.getSingle(`/quote/${symbol}`, 'v3');\n }\n\n /**\n * Get historical price data for any asset type with customizable date range\n *\n * Retrieves daily OHLCV (Open, High, Low, Close, Volume) data for the specified symbol.\n * Data includes adjusted close prices, volume, and percentage changes.\n *\n * @param params - Historical price request parameters\n * @param params.symbol - The trading symbol to get historical data for\n * @param params.from - Start date in YYYY-MM-DD format (optional, defaults to 1 year ago)\n * @param params.to - End date in YYYY-MM-DD format (optional, defaults to today)\n *\n * @returns Promise resolving to historical price data with daily OHLCV information\n *\n * @example\n * ```typescript\n * // Get last year's data\n * const history = await fmp.quote.getHistoricalPrice({\n * symbol: 'AAPL',\n * from: '2023-01-01',\n * to: '2023-12-31'\n * });\n *\n * // Get recent data (last 30 days)\n * const recent = await fmp.quote.getHistoricalPrice({\n * symbol: 'BTCUSD',\n * from: '2024-01-01'\n * });\n * ```\n */\n async getHistoricalPrice(params: {\n symbol: string;\n from?: string;\n to?: string;\n }): Promise<APIResponse<HistoricalPriceResponse>> {\n const { symbol, from, to } = params;\n\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.getSingle(`/historical-price-full/${symbol}`, 'v3', queryParams);\n }\n\n /**\n * Get real-time quotes for multiple symbols in a single request\n *\n * Efficiently retrieve quote data for multiple assets across different asset classes.\n * Useful for portfolio tracking, market monitoring, or batch data collection.\n *\n * @param symbols - Array of trading symbols to get quotes for\n *\n * @returns Promise resolving to an array of quote data for all requested symbols\n *\n * @example\n * ```typescript\n * // Get quotes for a mixed portfolio\n * const quotes = await fmp.quote.getQuotes([\n * 'AAPL', // Stock\n * 'BTCUSD', // Crypto\n * 'EURUSD', // Forex\n * 'SPY' // ETF\n * ]);\n *\n * // Get quotes for tech stocks\n * const techQuotes = await fmp.quote.getQuotes([\n * 'AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA'\n * ]);\n * ```\n */\n async getQuotes(symbols: string[]): Promise<APIResponse<Quote[]>> {\n const symbolsParam = symbols.join(',');\n return this.client.get(`/quote/${symbolsParam}`, 'v3');\n }\n\n /**\n * Get intraday price data with customizable time intervals\n *\n * Retrieves intraday OHLCV data at specified intervals (1min to 4hour).\n * Perfect for technical analysis, day trading, or short-term price monitoring.\n *\n * @param params - Intraday request parameters\n * @param params.symbol - The trading symbol to get intraday data for\n * @param params.interval - Time interval: '1min', '5min', '15min', '30min', '1hour', or '4hour'\n * @param params.from - Start date in YYYY-MM-DD format (optional)\n * @param params.to - End date in YYYY-MM-DD format (optional)\n *\n * @returns Promise resolving to intraday price data with OHLCV information at specified intervals\n *\n * @example\n * ```typescript\n * // Get 5-minute intraday data for today\n * const intraday = await fmp.quote.getIntraday({\n * symbol: 'AAPL',\n * interval: '5min',\n * from: '2024-01-15'\n * });\n *\n * // Get 1-hour data for crypto\n * const cryptoIntraday = await fmp.quote.getIntraday({\n * symbol: 'BTCUSD',\n * interval: '1hour',\n * from: '2024-01-10',\n * to: '2024-01-15'\n * });\n * ```\n */\n async getIntraday(params: {\n symbol: string;\n interval: '1min' | '5min' | '15min' | '30min' | '1hour' | '4hour';\n from?: string;\n to?: string;\n }): Promise<APIResponse<HistoricalPriceData[]>> {\n const { symbol, interval, from, to } = params;\n\n const queryParams: { from?: string; to?: string } = {};\n if (from) queryParams.from = from;\n if (to) queryParams.to = to;\n\n return this.client.get(`/historical-chart/${interval}/${symbol}`, 'v3', queryParams);\n }\n}\n","// Senate and House trading endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n HouseTradingResponse,\n SenateTradingResponse,\n SenateHouseTradingByNameResponse,\n} from '@/types/senate-house';\n\nexport class SenateHouseEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get senate trading data for a specific stock symbol\n *\n * Provides detailed information about senate members' trading activities for a specific stock.\n * Includes transaction details, amounts, dates, and ownership information for transparency\n * and compliance with the STOCK Act (Stop Trading on Congressional Knowledge).\n *\n * @param params - Senate trading request parameters\n * @param params.symbol - The stock symbol to get senate trading data for (e.g., 'AAPL', 'MSFT', 'TSLA')\n *\n * @returns Promise resolving to array of senate trading data with transaction details\n *\n * @example\n * ```typescript\n * // Get senate trading data for Apple\n * const appleSenateTrading = await fmp.senateHouse.getSenateTrading({ symbol: 'AAPL' });\n * appleSenateTrading.data.forEach(trade => {\n * console.log(`${trade.firstName} ${trade.lastName} (${trade.office}):`);\n * console.log(` ${trade.type} ${trade.amount} of ${trade.assetDescription}`);\n * console.log(` Transaction Date: ${trade.transactionDate}`);\n * });\n *\n * // Get senate trading data for Tesla\n * const teslaSenateTrading = await fmp.senateHouse.getSenateTrading({ symbol: 'TSLA' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#senate-trading|FMP Senate Trading Documentation}\n */\n async getSenateTrading(params: {\n symbol: string;\n }): Promise<APIResponse<SenateTradingResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/senate-trading`, 'v4', { symbol });\n }\n\n /**\n * Get senate trading RSS feed with pagination\n *\n * Provides a paginated RSS feed of all senate trading activities across all stocks.\n * Useful for monitoring congressional trading activities, compliance tracking,\n * and transparency reporting. Returns recent trading disclosures from senate members.\n *\n * @param params - Senate trading RSS feed request parameters\n * @param params.page - The page number to retrieve (starts from 0)\n *\n * @returns Promise resolving to array of senate trading data from RSS feed\n *\n * @example\n * ```typescript\n * // Get first page of senate trading RSS feed\n * const firstPage = await fmp.senateHouse.getSenateTradingRSSFeed({ page: 0 });\n * console.log(`First page: ${firstPage.data.length} trading activities`);\n *\n * // Get second page of senate trading RSS feed\n * const secondPage = await fmp.senateHouse.getSenateTradingRSSFeed({ page: 1 });\n * console.log(`Second page: ${secondPage.data.length} trading activities`);\n *\n * // Get recent senate trading activities\n * const recentTrades = await fmp.senateHouse.getSenateTradingRSSFeed({ page: 0 });\n * recentTrades.data.forEach(trade => {\n * console.log(`${trade.firstName} ${trade.lastName}: ${trade.type} ${trade.amount}`);\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#senate-trading-rss-feed-senate|FMP Senate Trading RSS Feed Documentation}\n */\n async getSenateTradingRSSFeed(params: {\n page: number;\n }): Promise<APIResponse<SenateTradingResponse[]>> {\n const { page } = params;\n return this.client.get('/senate-trading-rss-feed', 'v4', { page });\n }\n\n /**\n * Get senate trading data for a specific senator by name\n *\n * Provides detailed trading activities for a specific senate member across all stocks.\n * Useful for tracking individual senator's trading patterns, compliance monitoring,\n * and transparency reporting. Returns all trading disclosures for the specified senator.\n *\n * @param params - Senate trading by name request parameters\n * @param params.name - The name of the senator to get trading data for (e.g., 'John Smith', 'Jane Doe')\n *\n * @returns Promise resolving to array of senate trading data for the specified senator\n *\n * @example\n * ```typescript\n * // Get trading data for Senator John Smith\n * const johnSmithTrades = await fmp.senateHouse.getSenateTradingByName({ name: 'John Smith' });\n * johnSmithTrades.data.forEach(trade => {\n * console.log(`${trade.symbol}: ${trade.type} ${trade.amount}`);\n * console.log(` Transaction Date: ${trade.transactionDate}`);\n * console.log(` Asset: ${trade.assetDescription}`);\n * });\n *\n * // Get trading data for Senator Jane Doe\n * const janeDoeTrades = await fmp.senateHouse.getSenateTradingByName({ name: 'Jane Doe' });\n * console.log(`Jane Doe has ${janeDoeTrades.data.length} trading activities`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs/stable#senate-trading-by-name|FMP Senate Trading by Name Documentation}\n */\n async getSenateTradingByName(params: {\n name: string;\n }): Promise<APIResponse<SenateHouseTradingByNameResponse[]>> {\n const { name } = params;\n return this.client.get('/senate-trades-by-name', 'stable', { name });\n }\n\n /**\n * Get house trading data for a specific stock symbol\n *\n * Provides detailed information about house representatives' trading activities for a specific stock.\n * Includes transaction details, amounts, dates, and district information for transparency\n * and compliance with the STOCK Act (Stop Trading on Congressional Knowledge).\n *\n * @param params - House trading request parameters\n * @param params.symbol - The stock symbol to get house trading data for (e.g., 'AAPL', 'MSFT', 'TSLA')\n *\n * @returns Promise resolving to array of house trading data with transaction details\n *\n * @example\n * ```typescript\n * // Get house trading data for Apple\n * const appleHouseTrading = await fmp.senateHouse.getHouseTrading({ symbol: 'AAPL' });\n * appleHouseTrading.data.forEach(trade => {\n * console.log(`${trade.representative} (District ${trade.district}):`);\n * console.log(` ${trade.type} ${trade.amount} of ${trade.assetDescription}`);\n * console.log(` Transaction Date: ${trade.transactionDate}`);\n * });\n *\n * // Get house trading data for Microsoft\n * const msftHouseTrading = await fmp.senateHouse.getHouseTrading({ symbol: 'MSFT' });\n * console.log(`Microsoft house trading activities: ${msftHouseTrading.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#house-disclosure|FMP House Trading Documentation}\n */\n async getHouseTrading(params: { symbol: string }): Promise<APIResponse<HouseTradingResponse[]>> {\n const { symbol } = params;\n\n return this.client.get('/senate-disclosure', 'v4', { symbol });\n }\n\n /**\n * Get house trading RSS feed with pagination\n *\n * Provides a paginated RSS feed of all house trading activities across all stocks.\n * Useful for monitoring congressional trading activities, compliance tracking,\n * and transparency reporting. Returns recent trading disclosures from house representatives.\n *\n * @param params - House trading RSS feed request parameters\n * @param params.page - The page number to retrieve (starts from 0)\n *\n * @returns Promise resolving to array of house trading data from RSS feed\n *\n * @example\n * ```typescript\n * // Get first page of house trading RSS feed\n * const firstPage = await fmp.senateHouse.getHouseTradingRSSFeed({ page: 0 });\n * console.log(`First page: ${firstPage.data.length} trading activities`);\n *\n * // Get second page of house trading RSS feed\n * const secondPage = await fmp.senateHouse.getHouseTradingRSSFeed({ page: 1 });\n * console.log(`Second page: ${secondPage.data.length} trading activities`);\n *\n * // Get recent house trading activities\n * const recentTrades = await fmp.senateHouse.getHouseTradingRSSFeed({ page: 0 });\n * recentTrades.data.forEach(trade => {\n * console.log(`${trade.representative} (District ${trade.district}): ${trade.type} ${trade.amount}`);\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#house-disclosure-rss-feed-senate|FMP House Trading RSS Feed Documentation}\n */\n async getHouseTradingRSSFeed(params: {\n page: number;\n }): Promise<APIResponse<HouseTradingResponse[]>> {\n const { page } = params;\n return this.client.get('/senate-disclosure-rss-feed', 'v4', { page });\n }\n\n /**\n * Get house trading data for a specific representative by name\n *\n * Provides detailed trading activities for a specific house representative across all stocks.\n * Useful for tracking individual representative's trading patterns, compliance monitoring,\n * and transparency reporting. Returns all trading disclosures for the specified representative.\n *\n * @param params - House trading by name request parameters\n * @param params.name - The name of the representative to get trading data for (e.g., 'John Smith', 'Jane Doe')\n *\n * @returns Promise resolving to array of house trading data for the specified representative\n *\n * @example\n * ```typescript\n * // Get trading data for Representative John Smith\n * const johnSmithTrades = await fmp.senateHouse.getHouseTradingByName({ name: 'John Smith' });\n * johnSmithTrades.data.forEach(trade => {\n * console.log(`${trade.symbol}: ${trade.type} ${trade.amount}`);\n * console.log(` Transaction Date: ${trade.transactionDate}`);\n * console.log(` Asset: ${trade.assetDescription}`);\n * console.log(` District: ${trade.district}`);\n * });\n *\n * // Get trading data for Representative Jane Doe\n * const janeDoeTrades = await fmp.senateHouse.getHouseTradingByName({ name: 'Jane Doe' });\n * console.log(`Jane Doe has ${janeDoeTrades.data.length} trading activities`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs/stable#house-trading-by-name|FMP House Trading by Name Documentation}\n */\n async getHouseTradingByName(params: {\n name: string;\n }): Promise<APIResponse<SenateHouseTradingByNameResponse[]>> {\n const { name } = params;\n return this.client.get('/house-trades-by-name', 'stable', { name });\n }\n}\n","// Institutional trading endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport { Form13FResponse, InstitutionalHolderResponse } from '@/types/institutional';\n\nexport class InstitutionalEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get Form 13F institutional stock ownership data\n *\n * Provides Form 13F institutional stock ownership data for investment\n * managers with over $100 million in assets under management. Essential\n * for analyzing institutional investment patterns and holdings.\n *\n * @param params - Form 13F request parameters\n * @param params.cik - Central Index Key (CIK) of the investment manager\n * @param params.date - Specific date in YYYY-MM-DD format (optional, defaults to most recent filing)\n *\n * @returns Promise resolving to array of Form 13F institutional ownership data\n *\n * @example\n * ```typescript\n * // Get Berkshire Hathaway's Form 13F data\n * const berkshire13F = await fmp.institutional.getForm13F({\n * cik: '0001067983'\n * });\n * berkshire13F.data.forEach(holding => {\n * console.log(`${holding.issuerName}: ${holding.value.toLocaleString()} shares, $${holding.value.toLocaleString()}`);\n * });\n *\n * // Get Form 13F data for specific date\n * const historical13F = await fmp.institutional.getForm13F({\n * cik: '0001067983',\n * date: '2023-12-31'\n * });\n *\n * // Get BlackRock's Form 13F data\n * const blackrock13F = await fmp.institutional.getForm13F({\n * cik: '0001364742'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#form-13f-13f---institutional-stock-ownership|FMP Form 13F Documentation}\n */\n async getForm13F(params: {\n cik: string;\n date?: string;\n }): Promise<APIResponse<Form13FResponse[]>> {\n const { cik, date } = params;\n const queryParams: Record<string, any> = {};\n\n if (date) queryParams.date = date;\n\n return this.client.get(`/form-thirteen/${cik}`, 'v3', queryParams);\n }\n\n /**\n * Get Form 13F filing dates for an investment manager\n *\n * Provides available filing dates for Form 13F submissions by a specific\n * investment manager. Essential for discovering historical filing dates\n * before requesting detailed Form 13F data.\n *\n * @param params - Form 13F dates request parameters\n * @param params.cik - Central Index Key (CIK) of the investment manager\n *\n * @returns Promise resolving to array of available Form 13F filing dates\n *\n * @example\n * ```typescript\n * // Get Berkshire Hathaway's Form 13F filing dates\n * const berkshireDates = await fmp.institutional.getForm13FDates({\n * cik: '0001067983'\n * });\n * berkshireDates.data.forEach(date => {\n * console.log(`Filing date: ${date}`);\n * });\n *\n * // Get BlackRock's filing dates\n * const blackrockDates = await fmp.institutional.getForm13FDates({\n * cik: '0001364742'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#form-13f-dates-13f---institutional-stock-ownership|FMP Form 13F Dates Documentation}\n */\n async getForm13FDates(params: { cik: string }): Promise<APIResponse<string[]>> {\n const { cik } = params;\n return this.client.get(`/form-thirteen-date/${cik}`, 'v3');\n }\n\n /**\n * Get institutional holders for a company\n *\n * Provides data on institutional investors holding shares in a specific\n * company. Essential for understanding institutional ownership patterns,\n * major shareholders, and investment sentiment.\n *\n * @param params - Institutional holders request parameters\n * @param params.symbol - Stock symbol to get institutional holders for\n *\n * @returns Promise resolving to array of institutional holders data\n *\n * @example\n * ```typescript\n * // Get Apple's institutional holders\n * const appleHolders = await fmp.institutional.getInstitutionalHolders({\n * symbol: 'AAPL'\n * });\n * appleHolders.data.forEach(holder => {\n * console.log(`${holder.holder}: ${holder.shares.toLocaleString()} shares (${holder.weight}%)`);\n * });\n *\n * // Get Microsoft's institutional holders\n * const msftHolders = await fmp.institutional.getInstitutionalHolders({\n * symbol: 'MSFT'\n * });\n *\n * // Get Tesla's institutional holders\n * const teslaHolders = await fmp.institutional.getInstitutionalHolders({\n * symbol: 'TSLA'\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#institutional-holder-13f---institutional-stock-ownership|FMP Institutional Holders Documentation}\n */\n async getInstitutionalHolders(params: {\n symbol: string;\n }): Promise<APIResponse<InstitutionalHolderResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/institutional-holder/${symbol}`, 'v3');\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n InsiderTradingRSSResponse,\n InsiderTradingSearchResponse,\n TransactionTypesResponse,\n InsidersBySymbolResponse,\n InsiderTradeStatisticsResponse,\n CikMapperResponse,\n CikMapperBySymbolResponse,\n BeneficialOwnershipResponse,\n FailToDeliverResponse,\n TransactionType,\n} from '@/types/insider';\n\nexport class InsiderEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get insider trading RSS feed data\n *\n * Provides real-time RSS feed of insider trading activities across all\n * publicly traded companies. Essential for monitoring insider trading\n * patterns, corporate governance, and potential market-moving events.\n *\n * @param params - RSS feed request parameters\n * @param params.page - Page number for pagination (default: 0)\n *\n * @returns Promise resolving to array of insider trading RSS feed data\n *\n * @example\n * ```typescript\n * // Get first page of insider trading RSS feed\n * const rssFeed = await fmp.insider.getInsiderTradingRSS({ page: 0 });\n * rssFeed.data.forEach(trade => {\n * console.log(`${trade.date}: ${trade.symbol} - ${trade.insiderName} ${trade.transactionType}`);\n * });\n *\n * // Get second page of RSS feed\n * const nextPage = await fmp.insider.getInsiderTradingRSS({ page: 1 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#insider-trades-rss-insider-trading|FMP Insider Trading RSS Documentation}\n */\n async getInsiderTradingRSS(params: {\n page?: number;\n }): Promise<APIResponse<InsiderTradingRSSResponse[]>> {\n const { page = 0 } = params;\n return this.client.get(`/insider-trading-rss-feed`, 'v4', { page });\n }\n\n /**\n * Search for insider trades with advanced filtering\n *\n * Provides comprehensive insider trading data with multiple filtering options\n * including symbol, CIK numbers, and transaction types. Essential for detailed\n * analysis of insider trading patterns and corporate governance.\n *\n * @param params - Insider trading search parameters\n * @param params.symbol - Stock symbol to filter by (optional)\n * @param params.reportingCik - Reporting CIK to filter by (optional)\n * @param params.companyCik - Company CIK to filter by (optional)\n * @param params.transactionType - Transaction type to filter by (optional)\n * @param params.page - Page number for pagination (default: 0)\n *\n * @returns Promise resolving to array of insider trading search results\n *\n * @example\n * ```typescript\n * // Search for Apple insider trades\n * const appleTrades = await fmp.insider.searchInsiderTrading({\n * symbol: 'AAPL',\n * page: 0\n * });\n * appleTrades.data.forEach(trade => {\n * console.log(`${trade.date}: ${trade.insiderName} - ${trade.transactionType} ${trade.sharesTraded} shares`);\n * });\n *\n * // Search by transaction type\n * const purchases = await fmp.insider.searchInsiderTrading({\n * transactionType: 'P-Purchase',\n * page: 0\n * });\n *\n * // Search by CIK\n * const cikTrades = await fmp.insider.searchInsiderTrading({\n * companyCik: '0000320193',\n * page: 0\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#insider-trades-search-insider-trading|FMP Insider Trading Search Documentation}\n */\n async searchInsiderTrading(params: {\n symbol?: string;\n reportingCik?: string;\n companyCik?: string;\n transactionType?: string;\n page?: number;\n }): Promise<APIResponse<InsiderTradingSearchResponse[]>> {\n const { symbol, reportingCik, companyCik, transactionType, page = 0 } = params;\n const queryParams: Record<string, string | number> = { page };\n\n if (symbol) queryParams.symbol = symbol;\n if (reportingCik) queryParams.reportingCik = reportingCik;\n if (companyCik) queryParams.companyCik = companyCik;\n if (transactionType) queryParams.transactionType = transactionType;\n\n return this.client.get(`/insider-trading`, 'v4', queryParams);\n }\n\n /**\n * Get all available transaction types\n *\n * Provides a comprehensive list of all insider trading transaction types\n * used in SEC filings. Essential for understanding different types of\n * insider trading activities and filtering search results.\n *\n * @returns Promise resolving to array of transaction types with descriptions\n *\n * @example\n * ```typescript\n * // Get all transaction types\n * const transactionTypes = await fmp.insider.getTransactionTypes();\n * transactionTypes.data.forEach(type => {\n * console.log(`${type.code}: ${type.description}`);\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#transaction-types-insider-trading|FMP Transaction Types Documentation}\n */\n async getTransactionTypes(): Promise<APIResponse<TransactionTypesResponse>> {\n return this.client.get(`/insider-trading-transaction-type`, 'v4');\n }\n\n /**\n * Get insiders roster for a specific company\n *\n * Provides a list of all insiders (officers, directors, and beneficial owners)\n * for a specific company. Essential for understanding corporate governance\n * structure and identifying key personnel.\n *\n * @param params - Insiders request parameters\n * @param params.symbol - Stock symbol to get insiders for\n *\n * @returns Promise resolving to array of insiders data for the company\n *\n * @example\n * ```typescript\n * // Get Apple's insiders roster\n * const appleInsiders = await fmp.insider.getInsidersBySymbol({ symbol: 'AAPL' });\n * appleInsiders.data.forEach(insider => {\n * console.log(`${insider.name} - ${insider.title} (${insider.cik})`);\n * });\n *\n * // Get Microsoft's insiders\n * const msftInsiders = await fmp.insider.getInsidersBySymbol({ symbol: 'MSFT' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#insiders-by-symbol-insider-trading|FMP Insiders by Symbol Documentation}\n */\n async getInsidersBySymbol(params: {\n symbol: string;\n }): Promise<APIResponse<InsidersBySymbolResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/insider-roaster`, 'v4', { symbol });\n }\n\n /**\n * Get insider trade statistics for a company\n *\n * Provides comprehensive statistics on insider trading activity for a\n * specific company including total trades, volume, and value metrics.\n * Essential for analyzing insider trading patterns and sentiment.\n *\n * @param params - Statistics request parameters\n * @param params.symbol - Stock symbol to get statistics for\n *\n * @returns Promise resolving to array of insider trade statistics data\n *\n * @example\n * ```typescript\n * // Get Apple's insider trade statistics\n * const appleStats = await fmp.insider.getInsiderTradeStatistics({ symbol: 'AAPL' });\n * appleStats.data.forEach(stat => {\n * console.log(`${stat.insiderName}: ${stat.totalTrades} trades, ${stat.totalShares} shares`);\n * });\n *\n * // Get Microsoft's statistics\n * const msftStats = await fmp.insider.getInsiderTradeStatistics({ symbol: 'MSFT' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#insider-trade-statistics-insider-trading|FMP Insider Trade Statistics Documentation}\n */\n async getInsiderTradeStatistics(params: {\n symbol: string;\n }): Promise<APIResponse<InsiderTradeStatisticsResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/insider-roaster-statistic`, 'v4', { symbol });\n }\n\n /**\n * Get CIK mapper data\n *\n * Provides a mapping between CIK (Central Index Key) numbers and company\n * names. Essential for converting between CIK numbers and company\n * identifiers in insider trading analysis.\n *\n * @param params - CIK mapper request parameters\n * @param params.page - Page number for pagination (default: 0)\n *\n * @returns Promise resolving to array of CIK mapper data\n *\n * @example\n * ```typescript\n * // Get first page of CIK mapper\n * const cikMapper = await fmp.insider.getCikMapper({ page: 0 });\n * cikMapper.data.forEach(mapping => {\n * console.log(`CIK: ${mapping.cik} - Company: ${mapping.name}`);\n * });\n *\n * // Get second page\n * const nextPage = await fmp.insider.getCikMapper({ page: 1 });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cik-mapper-insider-trading|FMP CIK Mapper Documentation}\n */\n async getCikMapper(params: { page?: number }): Promise<APIResponse<CikMapperResponse[]>> {\n const { page = 0 } = params;\n return this.client.get(`/mapper-cik-name`, 'v4', { page });\n }\n\n /**\n * Get CIK mapper by name search\n *\n * Provides CIK numbers and company names matching a search term.\n * Useful for finding companies by partial name matches and\n * converting company names to CIK numbers.\n *\n * @param params - CIK mapper by name request parameters\n * @param params.name - Company name or partial name to search for\n * @param params.page - Page number for pagination (default: 0)\n *\n * @returns Promise resolving to array of CIK mapper data matching the search\n *\n * @example\n * ```typescript\n * // Search for Apple by name\n * const appleCik = await fmp.insider.getCikMapperByName({\n * name: 'Apple',\n * page: 0\n * });\n * appleCik.data.forEach(mapping => {\n * console.log(`CIK: ${mapping.cik} - Company: ${mapping.name}`);\n * });\n *\n * // Search for Microsoft\n * const msftCik = await fmp.insider.getCikMapperByName({\n * name: 'Microsoft',\n * page: 0\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cik-mapper-by-name-insider-trading|FMP CIK Mapper by Name Documentation}\n */\n async getCikMapperByName(params: {\n name: string;\n page?: number;\n }): Promise<APIResponse<CikMapperResponse[]>> {\n const { name, page = 0 } = params;\n return this.client.get(`/mapper-cik-name`, 'v4', { name, page });\n }\n\n /**\n * Get CIK mapper by symbol\n *\n * Provides CIK number and company name for a specific stock symbol.\n * Essential for converting stock symbols to CIK numbers for use\n * in insider trading searches and analysis.\n *\n * @param params - CIK mapper by symbol request parameters\n * @param params.symbol - Stock symbol to get CIK for\n *\n * @returns Promise resolving to CIK mapper data for the symbol\n *\n * @example\n * ```typescript\n * // Get Apple's CIK by symbol\n * const appleCik = await fmp.insider.getCikMapperBySymbol({ symbol: 'AAPL' });\n * console.log(`Apple CIK: ${appleCik.data.cik} - ${appleCik.data.name}`);\n *\n * // Get Microsoft's CIK\n * const msftCik = await fmp.insider.getCikMapperBySymbol({ symbol: 'MSFT' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#cik-mapper-company-insider-trading|FMP CIK Mapper by Symbol Documentation}\n */\n async getCikMapperBySymbol(params: {\n symbol: string;\n }): Promise<APIResponse<CikMapperBySymbolResponse>> {\n const { symbol } = params;\n return this.client.getSingle(`/mapper-cik-company/${symbol}`, 'v4');\n }\n\n /**\n * Get beneficial ownership acquisitions\n *\n * Provides data on acquisitions of beneficial ownership for a specific\n * company. Essential for tracking significant ownership changes and\n * corporate governance events.\n *\n * @param params - Beneficial ownership request parameters\n * @param params.symbol - Stock symbol to get beneficial ownership data for\n *\n * @returns Promise resolving to array of beneficial ownership acquisition data\n *\n * @example\n * ```typescript\n * // Get Apple's beneficial ownership acquisitions\n * const appleOwnership = await fmp.insider.getBeneficialOwnership({ symbol: 'AAPL' });\n * appleOwnership.data.forEach(acquisition => {\n * console.log(`${acquisition.date}: ${acquisition.insiderName} acquired ${acquisition.sharesAcquired} shares`);\n * });\n *\n * // Get Microsoft's beneficial ownership\n * const msftOwnership = await fmp.insider.getBeneficialOwnership({ symbol: 'MSFT' });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#acquisition-of-beneficial-ownership|FMP Beneficial Ownership Documentation}\n */\n async getBeneficialOwnership(params: {\n symbol: string;\n }): Promise<APIResponse<BeneficialOwnershipResponse[]>> {\n const { symbol } = params;\n return this.client.get(`/insider/ownership/acquisition_of_beneficial_ownership`, 'v4', {\n symbol,\n });\n }\n\n /**\n * Get fail to deliver data\n *\n * Provides fail to deliver data for a specific company, which indicates\n * when market participants fail to deliver securities on settlement date.\n * Important for understanding market mechanics and potential short interest.\n *\n * @param params - Fail to deliver request parameters\n * @param params.symbol - Stock symbol to get fail to deliver data for\n * @param params.page - Page number for pagination (default: 0)\n *\n * @returns Promise resolving to array of fail to deliver data\n *\n * @example\n * ```typescript\n * // Get Apple's fail to deliver data\n * const appleFailToDeliver = await fmp.insider.getFailToDeliver({\n * symbol: 'AAPL',\n * page: 0\n * });\n * appleFailToDeliver.data.forEach(entry => {\n * console.log(`${entry.date}: ${entry.shares} shares failed to deliver`);\n * });\n *\n * // Get Microsoft's fail to deliver data\n * const msftFailToDeliver = await fmp.insider.getFailToDeliver({\n * symbol: 'MSFT',\n * page: 0\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#fail-to-deliver|FMP Fail to Deliver Documentation}\n */\n async getFailToDeliver(params: {\n symbol: string;\n page?: number;\n }): Promise<APIResponse<FailToDeliverResponse[]>> {\n const { symbol, page = 0 } = params;\n return this.client.get(`/fail_to_deliver`, 'v4', { symbol, page });\n }\n\n /**\n * Get all insider trades for a symbol (convenience method)\n * @param symbol - The stock symbol to get insider trades for\n * @param page - Page number for pagination (default: 0)\n * @returns A list of insider trades for the specified symbol\n */\n async getInsiderTradesBySymbol(\n symbol: string,\n page: number = 0,\n ): Promise<APIResponse<InsiderTradingSearchResponse[]>> {\n return this.searchInsiderTrading({ symbol, page });\n }\n\n /**\n * Get insider trades by transaction type (convenience method)\n * @param transactionType - The transaction type to filter by\n * @param page - Page number for pagination (default: 0)\n * @returns A list of insider trades filtered by transaction type\n */\n async getInsiderTradesByType(\n transactionType: TransactionType | string,\n page: number = 0,\n ): Promise<APIResponse<InsiderTradingSearchResponse[]>> {\n return this.searchInsiderTrading({ transactionType, page });\n }\n\n /**\n * Get insider trades by reporting CIK (convenience method)\n * @param reportingCik - The reporting CIK to filter by\n * @param page - Page number for pagination (default: 0)\n * @returns A list of insider trades filtered by reporting CIK\n */\n async getInsiderTradesByReportingCik(\n reportingCik: string,\n page: number = 0,\n ): Promise<APIResponse<InsiderTradingSearchResponse[]>> {\n return this.searchInsiderTrading({ reportingCik, page });\n }\n\n /**\n * Get insider trades by company CIK (convenience method)\n * @param companyCik - The company CIK to filter by\n * @param page - Page number for pagination (default: 0)\n * @returns A list of insider trades filtered by company CIK\n */\n async getInsiderTradesByCompanyCik(\n companyCik: string,\n page: number = 0,\n ): Promise<APIResponse<InsiderTradingSearchResponse[]>> {\n return this.searchInsiderTrading({ companyCik, page });\n }\n}\n","import { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport {\n RSSFeedItem,\n RSSFeedV3Item,\n RSSFeed8KItem,\n SECFiling,\n IndustryClassification,\n IndustryClassificationCode,\n RSSFeedAllItem,\n} from '@/types/sec';\n\nexport class SECEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get RSS feed of SEC filings\n *\n * Provides a real-time feed of SEC filings from publicly traded companies,\n * including filing types, links to SEC pages, and direct links to filings.\n * Essential for staying up-to-date on the latest SEC filings for all companies\n * or for monitoring specific companies' regulatory activities.\n *\n * @param params - RSS feed parameters (optional)\n * @returns Promise resolving to array of RSS feed items with SEC filing information\n *\n * @example\n * ```typescript\n * // Get all recent SEC filings\n * const allFilings = await fmp.sec.getRSSFeed();\n * console.log(`Recent SEC filings: ${allFilings.data.length}`);\n *\n * // Get specific filing type\n * const form4Filings = await fmp.sec.getRSSFeed({ type: '4' });\n * console.log(`Form 4 filings: ${form4Filings.data.length}`);\n *\n * // Get filings with date range\n * const recentFilings = await fmp.sec.getRSSFeed({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * console.log(`Recent filings: ${recentFilings.data.length}`);\n *\n * // Get limited results\n * const limitedFilings = await fmp.sec.getRSSFeed({ limit: 10 });\n * console.log(`Limited filings: ${limitedFilings.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#rss-feed-securities-and-exchange-commission-(s.e.c)|FMP RSS Feed Documentation}\n */\n async getRSSFeed(params?: {\n limit?: number;\n type?: string;\n from?: string;\n to?: string;\n isDone?: boolean;\n }): Promise<APIResponse<RSSFeedItem[]>> {\n return this.client.get('/rss_feed', 'v4', params);\n }\n\n /**\n * Get comprehensive RSS feed of all SEC filings\n *\n * Provides a comprehensive real-time feed of all SEC filings from publicly\n * traded companies in the latest RSS feed format. This endpoint offers the\n * most complete overview of SEC filings with enhanced metadata and formatting.\n *\n * @param params - RSS feed all parameters (optional)\n * @returns Promise resolving to array of comprehensive RSS feed items with enhanced SEC filing information\n *\n * @example\n * ```typescript\n * // Get all comprehensive SEC filings\n * const allFilings = await fmp.sec.getRSSFeedAll();\n * console.log(`Comprehensive SEC filings: ${allFilings.data.length}`);\n *\n * // Get paginated results\n * const page2Filings = await fmp.sec.getRSSFeedAll({ page: 1 });\n * console.log(`Page 2 filings: ${page2Filings.data.length}`);\n *\n * // Get specific data type\n * const specificData = await fmp.sec.getRSSFeedAll({ datatype: 'json' });\n * console.log(`Specific data type filings: ${specificData.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#rss-feed-all-securities-and-exchange-commission-(s.e.c)|FMP RSS Feed All Documentation}\n */\n async getRSSFeedAll(params?: {\n page?: number;\n datatype?: string;\n }): Promise<APIResponse<RSSFeedAllItem[]>> {\n return this.client.get('/rss_feed_all', 'v4', params);\n }\n\n /**\n * Get RSS feed V3 of SEC filings\n *\n * Provides a real-time feed of SEC filings from publicly traded companies\n * in the V3 RSS feed format. This version offers enhanced metadata and\n * improved structure for better parsing and analysis of SEC filings.\n *\n * @param params - RSS feed V3 parameters (optional)\n * @returns Promise resolving to array of V3 RSS feed items with enhanced SEC filing information\n *\n * @example\n * ```typescript\n * // Get V3 format SEC filings\n * const v3Filings = await fmp.sec.getRSSFeedV3();\n * console.log(`V3 SEC filings: ${v3Filings.data.length}`);\n *\n * // Get paginated V3 results\n * const page2V3 = await fmp.sec.getRSSFeedV3({ page: 1 });\n * console.log(`Page 2 V3 filings: ${page2V3.data.length}`);\n *\n * // Get specific data type\n * const specificV3 = await fmp.sec.getRSSFeedV3({ datatype: 'json' });\n * console.log(`Specific V3 data type: ${specificV3.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#rss-feed-v3-securities-and-exchange-commission-(s.e.c)|FMP RSS Feed V3 Documentation}\n */\n async getRSSFeedV3(params?: {\n page?: number;\n datatype?: string;\n }): Promise<APIResponse<RSSFeedV3Item[]>> {\n return this.client.get('/rss_feed', 'v3', params);\n }\n\n /**\n * Get RSS feed of 8-K SEC filings\n *\n * Provides a real-time feed specifically for 8-K SEC filings from publicly\n * traded companies. 8-K filings are used to announce major events that\n * shareholders should know about, such as earnings releases, mergers,\n * acquisitions, and other material events.\n *\n * @param params - RSS feed 8-K parameters (optional)\n * @returns Promise resolving to array of 8-K RSS feed items with material event information\n *\n * @example\n * ```typescript\n * // Get all 8-K filings\n * const form8KFilings = await fmp.sec.getRSSFeed8K();\n * console.log(`8-K filings: ${form8KFilings.data.length}`);\n *\n * // Get 8-K filings with date range\n * const recent8K = await fmp.sec.getRSSFeed8K({\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n * console.log(`Recent 8-K filings: ${recent8K.data.length}`);\n *\n * // Get 8-K filings with financials\n * const financial8K = await fmp.sec.getRSSFeed8K({ hasFinancial: true });\n * console.log(`8-K filings with financials: ${financial8K.data.length}`);\n *\n * // Get limited 8-K results\n * const limited8K = await fmp.sec.getRSSFeed8K({ limit: 10 });\n * console.log(`Limited 8-K filings: ${limited8K.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#rss-feed-8-k-securities-and-exchange-commission-(s.e.c)|FMP RSS Feed 8-K Documentation}\n */\n async getRSSFeed8K(params?: {\n page?: number;\n from?: string;\n to?: string;\n hasFinancial?: boolean;\n limit?: number;\n }): Promise<APIResponse<RSSFeed8KItem[]>> {\n return this.client.get('/rss_feed_8k', 'v4', params);\n }\n\n /**\n * Get SEC filings for a specific company\n *\n * Provides direct access to SEC filings for a specific company, including\n * filing types, links to SEC pages, and direct links to specific filings.\n * Essential for monitoring a company's regulatory compliance and staying\n * informed about important corporate events and disclosures.\n *\n * @param symbol - The stock symbol to get SEC filings for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n * @param params - SEC filings parameters (optional)\n * @returns Promise resolving to array of SEC filings with detailed filing information\n *\n * @example\n * ```typescript\n * // Get all SEC filings for Apple\n * const appleFilings = await fmp.sec.getSECFilings({ symbol: 'AAPL' });\n * console.log(`Apple SEC filings: ${appleFilings.data.length}`);\n *\n * // Get specific filing type for Microsoft\n * const msftForm4 = await fmp.sec.getSECFilings({\n * symbol: 'MSFT',\n * params: { type: '4' }\n * });\n * console.log(`Microsoft Form 4 filings: ${msftForm4.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#sec-filings-securities-and-exchange-commission-(s.e.c)|FMP SEC Filings Documentation}\n */\n async getSECFilings({\n symbol,\n params,\n }: {\n symbol: string;\n params?: {\n type?: string;\n page?: number;\n };\n }): Promise<APIResponse<SECFiling[]>> {\n return this.client.get(`/sec_filings/${symbol}`, 'v3', params);\n }\n\n /**\n * Get individual industry classification for a company\n *\n * Provides the industry classification for a specific company based on the\n * Standard Industrial Classification (SIC) system. Essential for understanding\n * a company's business sector, industry peers, and market positioning.\n *\n * @param params - Industry classification parameters\n * @returns Promise resolving to industry classification data with SIC code and description\n *\n * @example\n * ```typescript\n * // Get Apple's industry classification by symbol\n * const appleIndustry = await fmp.sec.getIndividualIndustryClassification({ symbol: 'AAPL' });\n * console.log(`Apple Industry: ${appleIndustry.data.industryTitle}`);\n * console.log(`SIC Code: ${appleIndustry.data.sicCode}`);\n *\n * // Get industry classification by CIK\n * const cikIndustry = await fmp.sec.getIndividualIndustryClassification({ cik: 320193 });\n * console.log(`CIK Industry: ${cikIndustry.data.industryTitle}`);\n *\n * // Get industry classification by SIC code\n * const sicIndustry = await fmp.sec.getIndividualIndustryClassification({ sicCode: 3571 });\n * console.log(`SIC Industry: ${sicIndustry.data.industryTitle}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#individual-industry-classification-standard-industrial-classification|FMP Individual Industry Classification Documentation}\n */\n async getIndividualIndustryClassification(params: {\n symbol?: string;\n cik?: string;\n sicCode?: number;\n }): Promise<APIResponse<IndustryClassification>> {\n return this.client.getSingle('/standard_industrial_classification', 'v4', params);\n }\n\n /**\n * Get all industry classifications\n *\n * Provides a comprehensive overview of all industries classified according\n * to the Standard Industrial Classification (SIC) system. Essential for\n * understanding industry categories, sector analysis, and market research.\n *\n * @returns Promise resolving to array of all industry classifications with SIC codes and descriptions\n *\n * @example\n * ```typescript\n * // Get all industry classifications\n * const allIndustries = await fmp.sec.getAllIndustryClassifications();\n * console.log(`Total industries: ${allIndustries.data.length}`);\n *\n * allIndustries.data.forEach((industry, index) => {\n * console.log(`${index + 1}. ${industry.industryTitle}`);\n * console.log(` SIC Code: ${industry.sicCode}`);\n * });\n *\n * // Find specific industry\n * const techIndustry = allIndustries.data.find(industry =>\n * industry.industryTitle.toLowerCase().includes('computer')\n * );\n * console.log(`Tech Industry: ${techIndustry?.industryTitle}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#all-industry-classification-standard-industrial-classification|FMP All Industry Classifications Documentation}\n */\n async getAllIndustryClassifications(): Promise<APIResponse<IndustryClassification[]>> {\n return this.client.get('/standard_industrial_classification/all', 'v4');\n }\n\n /**\n * Get industry classification codes\n *\n * Provides detailed information about the Standard Industrial Classification\n * (SIC) system and helps identify SIC codes for specific industries.\n * Essential for understanding industry categorization and sector analysis.\n *\n * @param params - Industry classification codes parameters\n * @returns Promise resolving to array of industry classification codes with detailed information\n *\n * @example\n * ```typescript\n * // Get all industry classification codes\n * const allCodes = await fmp.sec.getIndustryClassificationCodes({});\n * console.log(`Total SIC codes: ${allCodes.data.length}`);\n *\n * // Search for specific SIC code\n * const code3571 = await fmp.sec.getIndustryClassificationCodes({ sicCode: 3571 });\n * console.log(`SIC 3571: ${code3571.data[0]?.industryTitle}`);\n *\n * // Search for industry by title\n * const computerIndustry = await fmp.sec.getIndustryClassificationCodes({ industryTitle: 'Computer' });\n * console.log(`Computer-related industries: ${computerIndustry.data.length}`);\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#industry-classification-codes-standard-industrial-classification|FMP Industry Classification Codes Documentation}\n */\n async getIndustryClassificationCodes(params: {\n industryTitle?: string;\n sicCode?: number;\n }): Promise<APIResponse<IndustryClassificationCode[]>> {\n return this.client.get('/standard_industrial_classification_list', 'v4', params);\n }\n}\n","// Mutual fund endpoints for FMP API\n\nimport { FMPClient } from '@/client';\nimport { APIResponse } from '@/types/common';\nimport { MutualFundHolding } from '@/types/mutual-fund';\n\nexport class MutualFundEndpoints {\n constructor(private client: FMPClient) {}\n\n /**\n * Get mutual fund holders of a specific stock\n *\n * Provides data on mutual funds that hold shares in a specific stock.\n * Essential for understanding mutual fund ownership patterns and\n * which mutual funds are invested in particular companies.\n *\n * @param symbol - The stock symbol to get mutual fund holders for (e.g., 'AAPL', 'MSFT', 'GOOGL')\n *\n * @returns Promise resolving to array of mutual fund holders with position details\n *\n * @example\n * ```typescript\n * // Get mutual funds that hold Apple stock\n * const appleHolders = await fmp.mutualFund.getHolders('AAPL');\n * console.log(`${appleHolders.data.length} mutual funds hold AAPL`);\n *\n * appleHolders.data.forEach((holder, index) => {\n * console.log(`${index + 1}. ${holder.holder}`);\n * console.log(` Shares: ${holder.shares?.toLocaleString() || 'N/A'}`);\n * console.log(` Weight: ${holder.weightPercent}% | Change: ${holder.change}`);\n * });\n *\n * // Get mutual funds that hold Microsoft stock\n * const msftHolders = await fmp.mutualFund.getHolders('MSFT');\n *\n * // Find top mutual fund holders by shares\n * const topHolders = msftHolders.data\n * .sort((a, b) => (b.shares || 0) - (a.shares || 0))\n * .slice(0, 10);\n * console.log('Top 10 mutual fund holders by shares:');\n * topHolders.forEach((holder, index) => {\n * console.log(`${index + 1}. ${holder.holder}: ${holder.shares.toLocaleString()} shares`);\n * });\n *\n * // Get mutual funds that hold Google stock\n * const googlHolders = await fmp.mutualFund.getHolders('GOOGL');\n *\n * // Analyze mutual fund concentration\n * const totalShares = googlHolders.data.reduce((sum, holder) => sum + (holder.shares || 0), 0);\n * console.log(`Total shares held by mutual funds: ${totalShares.toLocaleString()}`);\n *\n * googlHolders.data.forEach(holder => {\n * const percentage = ((holder.shares || 0) / totalShares * 100).toFixed(2);\n * console.log(`${holder.holder}: ${percentage}% of total mutual fund holdings`);\n * });\n * ```\n *\n * @see {@link https://site.financialmodelingprep.com/developer/docs#mutual-fund-holder-mutual-funds-holdings|FMP Mutual Fund Holders Documentation}\n */\n async getHolders(symbol: string): Promise<APIResponse<MutualFundHolding[]>> {\n return this.client.get(`/mutual-fund-holder/${symbol}`, 'v3');\n }\n}\n","// Main FMP API client that combines all endpoints\n\nimport { FMPClient } from './client';\nimport { FMPConfig } from './types/common';\nimport { FMPValidation } from './utils/validation';\nimport { StockEndpoints } from './endpoints/stock';\nimport { FinancialEndpoints } from './endpoints/financial';\nimport { ETFEndpoints } from './endpoints/etf';\nimport { EconomicEndpoints } from './endpoints/economic';\nimport { MarketEndpoints } from './endpoints/market';\nimport { ListEndpoints } from './endpoints/list';\nimport { CalendarEndpoints } from './endpoints/calendar';\nimport { CompanyEndpoints } from './endpoints/company';\nimport { QuoteEndpoints } from './endpoints/quote';\nimport { SenateHouseEndpoints } from './endpoints/senate-house';\nimport { InstitutionalEndpoints } from './endpoints/institutional';\nimport { InsiderEndpoints } from './endpoints/insider';\nimport { SECEndpoints } from './endpoints/sec';\nimport { MutualFundEndpoints } from './endpoints/mutual-fund';\n\n/**\n * Main FMP API client that provides access to all endpoints\n *\n * @example\n * ```typescript\n * import { FMP } from 'fmp-node-api';\n *\n * // Option 1: Provide API key directly\n * const fmp = new FMP({ apiKey: 'your-api-key' });\n *\n * // Option 2: Use environment variable (FMP_API_KEY)\n * const fmp = new FMP();\n *\n * // Option 3: Provide partial config with environment variable fallback\n * const fmp = new FMP({ timeout: 15000 });\n *\n * // Get quote for any asset type\n * const quote = await fmp.quote.getQuote({ symbol: 'AAPL' });\n *\n * // Get stock-specific data\n * const marketCap = await fmp.stock.getMarketCap({ symbol: 'AAPL' });\n *\n * // Get financial statements\n * const incomeStatement = await fmp.financial.getIncomeStatement({\n * symbol: 'AAPL',\n * period: 'annual'\n * });\n *\n * ```\n */\nexport class FMP {\n public readonly stock: StockEndpoints;\n public readonly financial: FinancialEndpoints;\n public readonly etf: ETFEndpoints;\n public readonly economic: EconomicEndpoints;\n public readonly market: MarketEndpoints;\n public readonly list: ListEndpoints;\n public readonly calendar: CalendarEndpoints;\n public readonly company: CompanyEndpoints;\n public readonly quote: QuoteEndpoints;\n public readonly senateHouse: SenateHouseEndpoints;\n public readonly institutional: InstitutionalEndpoints;\n public readonly insider: InsiderEndpoints;\n public readonly sec: SECEndpoints;\n public readonly mutualFund: MutualFundEndpoints;\n\n constructor(config: FMPConfig = {}) {\n // Get API key from config or environment variable\n const apiKey = config.apiKey || process.env.FMP_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'FMP API key is required. Please provide it in the config or set the FMP_API_KEY environment variable.',\n );\n }\n\n // Validate API key at construction time\n if (!FMPValidation.isValidApiKey(apiKey)) {\n throw new Error('Invalid API key format');\n }\n\n const client = new FMPClient({ ...config, apiKey });\n\n this.stock = new StockEndpoints(client);\n this.financial = new FinancialEndpoints(client);\n this.etf = new ETFEndpoints(client);\n this.economic = new EconomicEndpoints(client);\n this.market = new MarketEndpoints(client);\n this.list = new ListEndpoints(client);\n this.calendar = new CalendarEndpoints(client);\n this.company = new CompanyEndpoints(client);\n this.quote = new QuoteEndpoints(client);\n this.senateHouse = new SenateHouseEndpoints(client);\n this.institutional = new InstitutionalEndpoints(client);\n this.insider = new InsiderEndpoints(client);\n this.sec = new SECEndpoints(client);\n this.mutualFund = new MutualFundEndpoints(client);\n }\n\n /**\n * Get the underlying client instance for advanced usage\n */\n getClient(): FMPClient {\n return this.stock['client'];\n }\n}\n","// Common types used across all FMP API endpoints\n\n// Base API response wrapper - consistent structure with nullable fields\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data: T | null;\n error: string | null;\n status: number;\n}\n\n// FMP API configuration\nexport interface FMPConfig {\n apiKey?: string; // Optional since we support FMP_API_KEY environment variable\n timeout?: number;\n}\n\n// Common parameter interfaces\nexport interface SymbolParams {\n symbol: string;\n}\n\nexport interface DateRangeParams {\n from?: string;\n to?: string;\n}\n\nexport interface PaginationParams {\n limit?: number;\n page?: number;\n}\n\nexport interface PeriodParams {\n period?: 'annual' | 'quarter';\n}\n\n// Type-safe query parameters\nexport interface QueryParams {\n [key: string]: string | number | boolean | undefined;\n}\n\n// Common enums\nexport enum Period {\n ANNUAL = 'annual',\n QUARTER = 'quarter',\n}\n\nexport enum Exchange {\n NYSE = 'NYSE',\n NASDAQ = 'NASDAQ',\n AMEX = 'AMEX',\n TSX = 'TSX',\n LSE = 'LSE',\n ASX = 'ASX',\n NSE = 'NSE',\n BSE = 'BSE',\n}\n","// Insider Trading Types\n\n// RSS Feed Response\nexport interface InsiderTradingRSSResponse {\n title: string;\n fillingDate: string;\n symbol: string;\n link: string;\n reportingCik: string;\n issuerCik: string;\n}\n\n// Insider Trading Search Response\nexport interface InsiderTradingSearchResponse {\n symbol: string;\n filingDate: string;\n transactionDate: string;\n reportingCik: string;\n transactionType: string;\n securitiesOwned: number;\n securitiesTransacted: number;\n companyCik: string;\n reportingName: string;\n typeOfOwner: string;\n link: string;\n securityName: string;\n price: number;\n formType: string;\n acquistionOrDisposition: string;\n}\n\n// Transaction Types Response\nexport type TransactionTypesResponse = string[];\n\n// Insiders By Symbol Response\nexport interface InsidersBySymbolResponse {\n typeOfOwner: string;\n transactionDate: string;\n owner: string;\n}\n\n// Insider Trade Statistics Response\nexport interface InsiderTradeStatisticsResponse {\n symbol: string;\n cik: string;\n year: number;\n quarter: number;\n purchases: number;\n sales: number;\n buySellRatio: number;\n totalBought: number;\n totalSold: number;\n averageBought: number;\n averageSold: number;\n pPurchases: number;\n sSales: number;\n}\n\n// CIK Mapper Response\nexport interface CikMapperResponse {\n reportingCik: string;\n reportingName: string;\n}\n\n// CIK Mapper By Symbol Response\nexport interface CikMapperBySymbolResponse {\n symbol: string;\n companyCik: string;\n}\n\n// Beneficial Ownership Response\nexport interface BeneficialOwnershipResponse {\n cik: string;\n symbol: string;\n filingDate: string;\n acceptedDate: string;\n cusip: string;\n nameOfReportingPerson: string;\n citizenshipOrPlaceOfOrganization: string;\n soleVotingPower: string;\n sharedVotingPower: string;\n soleDispositivePower: string;\n sharedDispositivePower: string;\n amountBeneficiallyOwned: string;\n percentOfClass: string;\n typeOfReportingPerson: string;\n url: string;\n}\n\n// Fail to Deliver Response\nexport interface FailToDeliverResponse {\n symbol: string;\n date: string;\n price: number;\n quantity: number;\n cusip: string;\n name: string;\n}\n\n// Transaction type enum for better type safety\nexport enum TransactionType {\n AWARD = 'A-Award',\n CONVERSION = 'C-Conversion',\n RETURN = 'D-Return',\n EXPIRE_SHORT = 'E-ExpireShort',\n IN_KIND = 'F-InKind',\n GIFT = 'G-Gift',\n EXPIRE_LONG = 'H-ExpireLong',\n DISCRETIONARY = 'I-Discretionary',\n OTHER = 'J-Other',\n SMALL = 'L-Small',\n EXEMPT = 'M-Exempt',\n OUT_OF_THE_MONEY = 'O-OutOfTheMoney',\n PURCHASE = 'P-Purchase',\n SALE = 'S-Sale',\n TENDER = 'U-Tender',\n WILL = 'W-Will',\n IN_THE_MONEY = 'X-InTheMoney',\n TRUST = 'Z-Trust',\n}\n","// Constants for FMP API\n\n// Default configuration\nexport const DEFAULT_TIMEOUT = 10000;\nexport const DEFAULT_LIMIT = 100;\nexport const MAX_LIMIT = 1000;\n\n// Common periods\nexport const PERIODS = {\n ANNUAL: 'annual',\n QUARTER: 'quarter',\n} as const;\n\n// Common exchanges\nexport const EXCHANGES = {\n NYSE: 'NYSE',\n NASDAQ: 'NASDAQ',\n AMEX: 'AMEX',\n TSX: 'TSX',\n LSE: 'LSE',\n ASX: 'ASX',\n NSE: 'NSE',\n BSE: 'BSE',\n} as const;\n\n// Common sectors\nexport const SECTORS = {\n TECHNOLOGY: 'Technology',\n HEALTHCARE: 'Healthcare',\n FINANCIAL: 'Financial',\n CONSUMER_DISCRETIONARY: 'Consumer Discretionary',\n CONSUMER_STAPLES: 'Consumer Staples',\n INDUSTRIALS: 'Industrials',\n ENERGY: 'Energy',\n MATERIALS: 'Materials',\n UTILITIES: 'Utilities',\n REAL_ESTATE: 'Real Estate',\n COMMUNICATION_SERVICES: 'Communication Services',\n} as const;\n\n// Common countries\nexport const COUNTRIES = {\n US: 'US',\n CA: 'CA',\n GB: 'GB',\n AU: 'AU',\n IN: 'IN',\n DE: 'DE',\n FR: 'FR',\n JP: 'JP',\n CN: 'CN',\n BR: 'BR',\n} as const;\n\n// Error messages\nexport const ERROR_MESSAGES = {\n API_KEY_REQUIRED: 'API key is required',\n SYMBOL_REQUIRED: 'Symbol is required',\n INVALID_SYMBOL: 'Invalid symbol format',\n INVALID_DATE: 'Invalid date format. Use YYYY-MM-DD',\n INVALID_PERIOD: 'Period must be either \"annual\" or \"quarter\"',\n INVALID_LIMIT: 'Limit must be between 1 and 1000',\n INVALID_PAGE: 'Page must be a non-negative number',\n REQUEST_FAILED: 'Request failed',\n RATE_LIMIT_EXCEEDED: 'Rate limit exceeded',\n UNAUTHORIZED: 'Unauthorized - Invalid API key',\n NOT_FOUND: 'Resource not found',\n} as const;\n\n// HTTP status codes\nexport const HTTP_STATUS = {\n OK: 200,\n CREATED: 201,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n} as const;\n","// Formatting utilities for FMP API\n\n/**\n * Format currency value\n */\nexport function formatCurrency(value: number, currency: string = 'USD'): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n }).format(value);\n}\n\n/**\n * Format percentage value\n */\nexport function formatPercentage(value: number, decimals: number = 2): string {\n return `${value.toFixed(decimals)}%`;\n}\n\n/**\n * Format large numbers with K, M, B suffixes\n */\nexport function formatLargeNumber(value: number): string {\n if (value >= 1e12) {\n return `${(value / 1e12).toFixed(2)}T`;\n } else if (value >= 1e9) {\n return `${(value / 1e9).toFixed(2)}B`;\n } else if (value >= 1e6) {\n return `${(value / 1e6).toFixed(2)}M`;\n } else if (value >= 1e3) {\n return `${(value / 1e3).toFixed(2)}K`;\n }\n return value.toString();\n}\n\n/**\n * Format date to YYYY-MM-DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toISOString().split('T')[0];\n}\n\n/**\n * Format date to readable format\n */\nexport function formatReadableDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n\n/**\n * Format timestamp to readable format\n */\nexport function formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000);\n return date.toLocaleString('en-US');\n}\n\n/**\n * Format number with specified decimal places\n */\nexport function formatNumber(value: number, decimals: number = 2): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Format volume with appropriate units\n */\nexport function formatVolume(volume: number): string {\n if (volume >= 1e9) {\n return `${(volume / 1e9).toFixed(2)}B`;\n } else if (volume >= 1e6) {\n return `${(volume / 1e6).toFixed(2)}M`;\n } else if (volume >= 1e3) {\n return `${(volume / 1e3).toFixed(2)}K`;\n }\n return volume.toString();\n}\n","import { FMP } from '../fmp';\n\n/**\n * Helper utilities for exploring and working with the FMP API client\n */\nexport class FMPHelpers {\n /**\n * Get all available endpoint categories from the FMP client\n * @param fmp - The FMP client instance\n * @returns Array of endpoint category names\n */\n static getEndpointCategories(fmp: FMP): string[] {\n return Object.keys(fmp).filter(\n key =>\n typeof fmp[key as keyof FMP] === 'object' &&\n fmp[key as keyof FMP] !== null &&\n key !== 'constructor',\n );\n }\n\n /**\n * Get all methods for a specific endpoint category\n * @param fmp - The FMP client instance\n * @param endpoint - The endpoint category name\n * @returns Array of method names\n */\n static getEndpointMethods(fmp: FMP, endpoint: string): string[] {\n const endpointObj = fmp[endpoint as keyof FMP];\n if (!endpointObj || typeof endpointObj !== 'object') {\n return [];\n }\n\n return Object.getOwnPropertyNames(endpointObj).filter(\n name => typeof (endpointObj as any)[name] === 'function' && name !== 'constructor',\n );\n }\n\n /**\n * Get all available methods across all endpoint categories\n * @param fmp - The FMP client instance\n * @returns Object mapping endpoint categories to their methods\n */\n static getAllMethods(fmp: FMP): Record<string, string[]> {\n const methods: Record<string, string[]> = {};\n const categories = this.getEndpointCategories(fmp);\n\n categories.forEach(category => {\n methods[category] = this.getEndpointMethods(fmp, category);\n });\n\n return methods;\n }\n\n /**\n * Get a summary of the API structure\n * @param fmp - The FMP client instance\n * @returns Summary object with endpoint and method counts\n */\n static getApiSummary(fmp: FMP): {\n totalEndpoints: number;\n totalMethods: number;\n categories: string[];\n methodCounts: Record<string, number>;\n } {\n const categories = this.getEndpointCategories(fmp);\n const allMethods = this.getAllMethods(fmp);\n const totalMethods = Object.values(allMethods).reduce(\n (sum, methods) => sum + methods.length,\n 0,\n );\n\n const methodCounts: Record<string, number> = {};\n categories.forEach(category => {\n methodCounts[category] = allMethods[category]?.length || 0;\n });\n\n return {\n totalEndpoints: categories.length,\n totalMethods,\n categories,\n methodCounts,\n };\n }\n\n /**\n * Check if a specific method exists on an endpoint\n * @param fmp - The FMP client instance\n * @param endpoint - The endpoint category name\n * @param method - The method name\n * @returns True if the method exists\n */\n static hasMethod(fmp: FMP, endpoint: string, method: string): boolean {\n const methods = this.getEndpointMethods(fmp, endpoint);\n return methods.includes(method);\n }\n\n /**\n * Get method signature information (basic introspection)\n * @param fmp - The FMP client instance\n * @param endpoint - The endpoint category name\n * @param method - The method name\n * @returns Method information or null if not found\n */\n static getMethodInfo(\n fmp: FMP,\n endpoint: string,\n method: string,\n ): {\n name: string;\n type: 'function';\n async: boolean;\n } | null {\n const endpointObj = fmp[endpoint as keyof FMP];\n if (!endpointObj || typeof endpointObj !== 'object') {\n return null;\n }\n\n const methodFn = (endpointObj as any)[method];\n if (typeof methodFn !== 'function') {\n return null;\n }\n\n return {\n name: method,\n type: 'function',\n async: methodFn.constructor.name === 'AsyncFunction',\n };\n }\n}\n","/**\n * Utility functions for common financial data processing and formatting\n */\nexport class FMPUtils {\n /**\n * Format currency values\n * @param value - The numeric value to format\n * @param currency - The currency code (default: USD)\n * @param locale - The locale for formatting (default: en-US)\n * @returns Formatted currency string\n */\n static formatCurrency(value: number, currency = 'USD', locale = 'en-US'): string {\n if (typeof value !== 'number' || isNaN(value)) {\n return 'N/A';\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n } catch (error) {\n // Fallback formatting\n return `${currency} ${value.toFixed(2)}`;\n }\n }\n\n /**\n * Format percentages\n * @param value - The percentage value (as decimal, e.g., 0.15 for 15%)\n * @param decimals - Number of decimal places (default: 2)\n * @returns Formatted percentage string\n */\n static formatPercentage(value: number, decimals = 2): string {\n if (typeof value !== 'number' || isNaN(value)) {\n return 'N/A';\n }\n return `${value.toFixed(decimals)}%`;\n }\n\n /**\n * Format large numbers with abbreviations (K, M, B, T)\n * @param value - The numeric value to format\n * @param decimals - Number of decimal places (default: 1)\n * @returns Formatted number string\n */\n static formatLargeNumber(value: number, decimals = 1): string {\n if (typeof value !== 'number' || isNaN(value)) {\n return 'N/A';\n }\n\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n if (absValue >= 1e12) {\n return `${sign}${(absValue / 1e12).toFixed(decimals)}T`;\n } else if (absValue >= 1e9) {\n return `${sign}${(absValue / 1e9).toFixed(decimals)}B`;\n } else if (absValue >= 1e6) {\n return `${sign}${(absValue / 1e6).toFixed(decimals)}M`;\n } else if (absValue >= 1e3) {\n return `${sign}${(absValue / 1e3).toFixed(decimals)}K`;\n } else {\n return `${sign}${absValue.toFixed(decimals)}`;\n }\n }\n\n /**\n * Convert date string to Date object\n * @param dateString - The date string in YYYY-MM-DD format\n * @returns Date object or null if invalid\n */\n static parseDate(dateString: string): Date | null {\n if (!dateString || typeof dateString !== 'string') {\n return null;\n }\n\n // Parse date in UTC to avoid timezone issues\n const [year, month, day] = dateString.split('-').map(Number);\n if (isNaN(year) || isNaN(month) || isNaN(day)) {\n return null;\n }\n\n // Validate date components\n if (month < 1 || month > 12) {\n return null;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n\n // Check if the date is valid (handles cases like 2024-02-30)\n if (isNaN(date.getTime())) {\n return null;\n }\n\n // Verify the parsed date matches the input (handles cases like 2024-02-30 becoming 2024-03-01)\n const parsedYear = date.getUTCFullYear();\n const parsedMonth = date.getUTCMonth() + 1;\n const parsedDay = date.getUTCDate();\n\n if (parsedYear !== year || parsedMonth !== month || parsedDay !== day) {\n return null;\n }\n\n return date;\n }\n\n /**\n * Format date to readable string\n * @param date - Date object or date string\n * @param format - Format style ('short', 'long', 'iso')\n * @returns Formatted date string\n */\n static formatDate(date: Date | string, format: 'short' | 'long' | 'iso' = 'short'): string {\n const dateObj = typeof date === 'string' ? this.parseDate(date) : date;\n\n if (!dateObj) {\n return 'Invalid Date';\n }\n\n switch (format) {\n case 'long':\n return dateObj.toLocaleDateString('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n case 'iso':\n return dateObj.toISOString().split('T')[0];\n case 'short':\n default:\n return dateObj.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n }\n\n /**\n * Calculate working days between two dates (excluding weekends)\n * @param from - Start date\n * @param to - End date\n * @returns Number of working days\n */\n static getWorkingDays(from: string | Date, to: string | Date): number {\n const startDate = typeof from === 'string' ? this.parseDate(from) : from;\n const endDate = typeof to === 'string' ? this.parseDate(to) : to;\n\n if (!startDate || !endDate) {\n return 0;\n }\n\n let workingDays = 0;\n const currentDate = new Date(startDate);\n\n // Normalize to start of day in UTC for consistent comparison\n const endDateNormalized = new Date(\n Date.UTC(endDate.getUTCFullYear(), endDate.getUTCMonth(), endDate.getUTCDate()),\n );\n\n while (currentDate <= endDateNormalized) {\n const dayOfWeek = currentDate.getUTCDay();\n if (dayOfWeek !== 0 && dayOfWeek !== 6) {\n // Not Sunday (0) or Saturday (6)\n workingDays++;\n }\n currentDate.setUTCDate(currentDate.getUTCDate() + 1);\n }\n\n return workingDays;\n }\n\n /**\n * Calculate percentage change between two values\n * @param oldValue - The original value\n * @param newValue - The new value\n * @param decimals - Number of decimal places (default: 2)\n * @returns Percentage change as a number\n */\n static calculatePercentageChange(oldValue: number, newValue: number, decimals = 2): number {\n if (\n typeof oldValue !== 'number' ||\n typeof newValue !== 'number' ||\n isNaN(oldValue) ||\n isNaN(newValue) ||\n oldValue === 0\n ) {\n return 0;\n }\n\n const change = ((newValue - oldValue) / oldValue) * 100;\n return Number(change.toFixed(decimals));\n }\n\n /**\n * Batch API calls with rate limiting\n * @param calls - Array of async functions to execute\n * @param delayMs - Delay between calls in milliseconds (default: 100)\n * @param maxConcurrent - Maximum concurrent calls (default: 1)\n * @returns Array of results\n */\n static async batchCalls<T>(\n calls: (() => Promise<T>)[],\n delayMs = 100,\n maxConcurrent = 1,\n ): Promise<T[]> {\n const results: T[] = [];\n\n if (maxConcurrent === 1) {\n // Sequential execution with delay\n for (const call of calls) {\n results.push(await call());\n if (delayMs > 0) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n } else {\n // Concurrent execution with rate limiting\n const chunks = this.chunkArray(calls, maxConcurrent);\n\n for (const chunk of chunks) {\n const chunkResults = await Promise.all(chunk.map(call => call()));\n results.push(...chunkResults);\n\n if (delayMs > 0) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n return results;\n }\n\n /**\n * Split array into chunks\n * @param array - The array to split\n * @param chunkSize - Size of each chunk\n * @returns Array of chunks\n */\n static chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n /**\n * Retry a function with exponential backoff\n * @param fn - The function to retry\n * @param maxRetries - Maximum number of retries (default: 3)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @returns Function result\n */\n static async retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries = 3,\n baseDelay = 1000,\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Debounce a function\n * @param func - The function to debounce\n * @param wait - Wait time in milliseconds\n * @returns Debounced function\n */\n static debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n }\n\n /**\n * Throttle a function\n * @param func - The function to throttle\n * @param limit - Time limit in milliseconds\n * @returns Throttled function\n */\n static throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number,\n ): (...args: Parameters<T>) => void {\n let inThrottle: boolean;\n\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n }\n}\n","import { FMP } from '../fmp';\nimport { FMPHelpers } from './helpers';\n\n/**\n * Debugging utilities for FMP API development and troubleshooting\n */\nexport class FMPDebug {\n private static isDevelopment = process.env.NODE_ENV === 'development';\n private static isDebugEnabled = process.env.FMP_DEBUG === 'true';\n\n /**\n * Log API calls for debugging (only in development)\n * @param endpoint - The endpoint being called\n * @param params - The parameters passed to the endpoint\n * @param response - The response received\n * @param duration - The duration of the call in milliseconds\n */\n static logApiCall(endpoint: string, params: any, response: any, duration?: number): void {\n if (!this.isDevelopment && !this.isDebugEnabled) {\n return;\n }\n\n const logData = {\n timestamp: new Date().toISOString(),\n endpoint,\n params,\n success: response?.success,\n status: response?.status,\n duration: duration ? `${duration}ms` : undefined,\n };\n\n console.log('🔍 FMP API Call:', logData);\n }\n\n /**\n * Log API errors for debugging\n * @param endpoint - The endpoint that failed\n * @param params - The parameters that were passed\n * @param error - The error that occurred\n */\n static logApiError(endpoint: string, params: any, error: any): void {\n if (!this.isDevelopment && !this.isDebugEnabled) {\n return;\n }\n\n console.error('❌ FMP API Error:', {\n timestamp: new Date().toISOString(),\n endpoint,\n params,\n error: error?.message || error,\n stack: error?.stack,\n });\n }\n\n /**\n * Get comprehensive API usage statistics\n * @param fmp - The FMP client instance\n * @returns Detailed API statistics\n */\n static getApiStats(fmp: FMP): {\n totalEndpoints: number;\n totalMethods: number;\n categories: string[];\n methodCounts: Record<string, number>;\n estimatedApiCalls: number;\n } {\n const summary = FMPHelpers.getApiSummary(fmp);\n\n // Estimate API calls based on typical usage patterns\n const estimatedApiCalls = Object.values(summary.methodCounts).reduce(\n (total, count) => total + count * 2, // Assume 2 calls per method on average\n 0,\n );\n\n return {\n ...summary,\n estimatedApiCalls,\n };\n }\n\n /**\n * Validate API key format and provide feedback\n * @param apiKey - The API key to validate\n * @returns Validation result with details\n */\n static validateApiKey(apiKey: string): {\n isValid: boolean;\n length: number;\n format: string;\n suggestions: string[];\n } {\n const length = apiKey?.length || 0;\n const format = apiKey?.match(/^[a-zA-Z0-9]+$/) ? 'alphanumeric' : 'invalid';\n const isValid = length >= 32 && format === 'alphanumeric';\n\n const suggestions: string[] = [];\n if (length < 32) {\n suggestions.push('API key should be at least 32 characters long');\n }\n if (format !== 'alphanumeric') {\n suggestions.push('API key should contain only letters and numbers');\n }\n if (!apiKey) {\n suggestions.push('API key is required');\n }\n\n return {\n isValid,\n length,\n format,\n suggestions,\n };\n }\n\n /**\n * Check API key environment variable\n * @returns Environment check result\n */\n static checkApiKeyEnvironment(): {\n hasEnvVar: boolean;\n envVarName: string;\n isValid: boolean;\n suggestions: string[];\n } {\n const envVarName = 'FMP_API_KEY';\n const apiKey = process.env[envVarName];\n const hasEnvVar = !!apiKey;\n const validation = this.validateApiKey(apiKey || '');\n\n const suggestions: string[] = [];\n if (!hasEnvVar) {\n suggestions.push(`Set ${envVarName} environment variable`);\n suggestions.push('Add to your .env file: FMP_API_KEY=your_api_key_here');\n } else if (!validation.isValid) {\n suggestions.push(...validation.suggestions);\n }\n\n return {\n hasEnvVar,\n envVarName,\n isValid: validation.isValid,\n suggestions,\n };\n }\n\n /**\n * Get performance metrics for API calls\n * @param fmp - The FMP client instance\n * @returns Performance information\n */\n static getPerformanceInfo(): {\n nodeVersion: string;\n platform: string;\n memoryUsage: NodeJS.MemoryUsage;\n uptime: number;\n } {\n return {\n nodeVersion: process.version,\n platform: process.platform,\n memoryUsage: process.memoryUsage(),\n uptime: process.uptime(),\n };\n }\n\n /**\n * Create a debug configuration object\n * @param fmp - The FMP client instance\n * @returns Debug configuration\n */\n static createDebugConfig(fmp: FMP): {\n apiStats: ReturnType<typeof FMPDebug.getApiStats>;\n envCheck: ReturnType<typeof FMPDebug.checkApiKeyEnvironment>;\n performance: ReturnType<typeof FMPDebug.getPerformanceInfo>;\n timestamp: string;\n } {\n return {\n apiStats: this.getApiStats(fmp),\n envCheck: this.checkApiKeyEnvironment(),\n performance: this.getPerformanceInfo(),\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Print debug information to console\n * @param fmp - The FMP client instance\n */\n static printDebugInfo(fmp: FMP): void {\n if (!this.isDevelopment && !this.isDebugEnabled) {\n return;\n }\n\n const config = this.createDebugConfig(fmp);\n\n console.log('🔧 FMP Debug Information:');\n console.log('📊 API Stats:', config.apiStats);\n console.log('🔑 Environment Check:', config.envCheck);\n console.log('⚡ Performance:', config.performance);\n console.log('🕒 Timestamp:', config.timestamp);\n }\n\n /**\n * Enable debug mode programmatically\n */\n static enableDebugMode(): void {\n process.env.FMP_DEBUG = 'true';\n this.isDebugEnabled = true;\n console.log('🔧 FMP Debug mode enabled');\n }\n\n /**\n * Disable debug mode programmatically\n */\n static disableDebugMode(): void {\n process.env.FMP_DEBUG = 'false';\n this.isDebugEnabled = false;\n console.log('🔧 FMP Debug mode disabled');\n }\n\n /**\n * Check if debug mode is enabled\n * @returns True if debug mode is enabled\n */\n static isDebugMode(): boolean {\n return this.isDevelopment || this.isDebugEnabled;\n }\n\n /**\n * Create a debug wrapper for API calls\n * @param fmp - The FMP client instance\n * @returns FMP client with debug logging\n */\n static createDebugWrapper(fmp: FMP): FMP {\n if (!this.isDebugMode()) {\n return fmp;\n }\n\n // Create a proxy to intercept method calls\n return new Proxy(fmp, {\n get(target, prop) {\n const value = target[prop as keyof FMP];\n\n if (typeof value === 'object' && value !== null) {\n // Wrap endpoint objects\n return new Proxy(value, {\n get(endpointTarget, methodName) {\n const method = endpointTarget[methodName as keyof typeof endpointTarget];\n\n if (typeof method === 'function') {\n return async (...args: any[]) => {\n const startTime = Date.now();\n const endpoint = `${String(prop)}.${String(methodName)}`;\n\n // Construct proper parameter object based on method signature\n let params: any;\n if (\n methodName === 'getQuote' &&\n args.length === 1 &&\n typeof args[0] === 'string'\n ) {\n params = { symbol: args[0] };\n } else if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n params = args[0];\n } else {\n params = args;\n }\n\n try {\n FMPDebug.logApiCall(endpoint, params, null);\n const result = await (method as (...args: any[]) => any).apply(\n endpointTarget,\n args,\n );\n const duration = Date.now() - startTime;\n FMPDebug.logApiCall(endpoint, params, result, duration);\n return result;\n } catch (error) {\n FMPDebug.logApiError(endpoint, params, error);\n throw error;\n }\n };\n }\n\n return method;\n },\n });\n }\n\n return value;\n },\n });\n }\n}\n"]}
|