@newyorkcompute/kalshi-tui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +35 -0
  2. package/dist/App.d.ts +2 -1
  3. package/dist/App.d.ts.map +1 -1
  4. package/dist/App.js +43 -36
  5. package/dist/App.js.map +1 -1
  6. package/dist/cache.d.ts +34 -0
  7. package/dist/cache.d.ts.map +1 -0
  8. package/dist/cache.js +60 -0
  9. package/dist/cache.js.map +1 -0
  10. package/dist/cache.test.d.ts +2 -0
  11. package/dist/cache.test.d.ts.map +1 -0
  12. package/dist/cache.test.js +73 -0
  13. package/dist/cache.test.js.map +1 -0
  14. package/dist/cli.d.ts +2 -2
  15. package/dist/cli.js +31 -35
  16. package/dist/cli.js.map +1 -1
  17. package/dist/components/ErrorBoundary.d.ts +20 -0
  18. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/components/ErrorBoundary.js +28 -0
  20. package/dist/components/ErrorBoundary.js.map +1 -0
  21. package/dist/components/Footer.d.ts +6 -0
  22. package/dist/components/Footer.d.ts.map +1 -0
  23. package/dist/components/Footer.js +10 -0
  24. package/dist/components/Footer.js.map +1 -0
  25. package/dist/components/Header.d.ts +10 -2
  26. package/dist/components/Header.d.ts.map +1 -1
  27. package/dist/components/Header.js +18 -9
  28. package/dist/components/Header.js.map +1 -1
  29. package/dist/components/Markets.d.ts +21 -0
  30. package/dist/components/Markets.d.ts.map +1 -0
  31. package/dist/components/Markets.js +25 -0
  32. package/dist/components/Markets.js.map +1 -0
  33. package/dist/components/Orderbook.d.ts +18 -5
  34. package/dist/components/Orderbook.d.ts.map +1 -1
  35. package/dist/components/Orderbook.js +25 -36
  36. package/dist/components/Orderbook.js.map +1 -1
  37. package/dist/components/Positions.d.ts +13 -2
  38. package/dist/components/Positions.d.ts.map +1 -1
  39. package/dist/components/Positions.js +10 -17
  40. package/dist/components/Positions.js.map +1 -1
  41. package/dist/components/PriceChart.d.ts +18 -0
  42. package/dist/components/PriceChart.d.ts.map +1 -0
  43. package/dist/components/PriceChart.js +103 -0
  44. package/dist/components/PriceChart.js.map +1 -0
  45. package/dist/components/index.d.ts +10 -10
  46. package/dist/components/index.d.ts.map +1 -1
  47. package/dist/components/index.js +10 -11
  48. package/dist/components/index.js.map +1 -1
  49. package/dist/hooks/index.d.ts +4 -4
  50. package/dist/hooks/index.d.ts.map +1 -1
  51. package/dist/hooks/index.js +4 -4
  52. package/dist/hooks/index.js.map +1 -1
  53. package/dist/hooks/useKalshi.d.ts +30 -12
  54. package/dist/hooks/useKalshi.d.ts.map +1 -1
  55. package/dist/hooks/useKalshi.js +249 -19
  56. package/dist/hooks/useKalshi.js.map +1 -1
  57. package/dist/utils.d.ts +33 -0
  58. package/dist/utils.d.ts.map +1 -0
  59. package/dist/utils.js +88 -0
  60. package/dist/utils.js.map +1 -0
  61. package/dist/utils.test.d.ts +2 -0
  62. package/dist/utils.test.d.ts.map +1 -0
  63. package/dist/utils.test.js +115 -0
  64. package/dist/utils.test.js.map +1 -0
  65. package/package.json +8 -8
  66. package/dist/components/HelpModal.d.ts +0 -5
  67. package/dist/components/HelpModal.d.ts.map +0 -1
  68. package/dist/components/HelpModal.js +0 -19
  69. package/dist/components/HelpModal.js.map +0 -1
  70. package/dist/components/MarketList.d.ts +0 -5
  71. package/dist/components/MarketList.d.ts.map +0 -1
  72. package/dist/components/MarketList.js +0 -68
  73. package/dist/components/MarketList.js.map +0 -1
  74. package/dist/components/OrderEntry.d.ts +0 -9
  75. package/dist/components/OrderEntry.d.ts.map +0 -1
  76. package/dist/components/OrderEntry.js +0 -77
  77. package/dist/components/OrderEntry.js.map +0 -1
  78. package/dist/components/SearchBar.d.ts +0 -5
  79. package/dist/components/SearchBar.d.ts.map +0 -1
  80. package/dist/components/SearchBar.js +0 -27
  81. package/dist/components/SearchBar.js.map +0 -1
  82. package/dist/components/StatusBar.d.ts +0 -5
  83. package/dist/components/StatusBar.d.ts.map +0 -1
  84. package/dist/components/StatusBar.js +0 -9
  85. package/dist/components/StatusBar.js.map +0 -1
  86. package/dist/components/ui/Box.d.ts +0 -14
  87. package/dist/components/ui/Box.d.ts.map +0 -1
  88. package/dist/components/ui/Box.js +0 -9
  89. package/dist/components/ui/Box.js.map +0 -1
  90. package/dist/components/ui/Sparkline.d.ts +0 -11
  91. package/dist/components/ui/Sparkline.d.ts.map +0 -1
  92. package/dist/components/ui/Sparkline.js +0 -32
  93. package/dist/components/ui/Sparkline.js.map +0 -1
  94. package/dist/hooks/useMarkets.d.ts +0 -13
  95. package/dist/hooks/useMarkets.d.ts.map +0 -1
  96. package/dist/hooks/useMarkets.js +0 -89
  97. package/dist/hooks/useMarkets.js.map +0 -1
  98. package/dist/hooks/useOrderbook.d.ts +0 -13
  99. package/dist/hooks/useOrderbook.d.ts.map +0 -1
  100. package/dist/hooks/useOrderbook.js +0 -81
  101. package/dist/hooks/useOrderbook.js.map +0 -1
  102. package/dist/hooks/usePortfolio.d.ts +0 -18
  103. package/dist/hooks/usePortfolio.d.ts.map +0 -1
  104. package/dist/hooks/usePortfolio.js +0 -84
  105. package/dist/hooks/usePortfolio.js.map +0 -1
  106. package/dist/stores/app-store.d.ts +0 -17
  107. package/dist/stores/app-store.d.ts.map +0 -1
  108. package/dist/stores/app-store.js +0 -21
  109. package/dist/stores/app-store.js.map +0 -1
  110. package/dist/theme.d.ts +0 -31
  111. package/dist/theme.d.ts.map +0 -1
  112. package/dist/theme.js +0 -37
  113. package/dist/theme.js.map +0 -1
@@ -1,16 +1,34 @@
1
- import { type KalshiConfig } from "@newyorkcompute/kalshi-core";
2
- import type { MarketApi, PortfolioApi, OrdersApi } from "kalshi-typescript";
3
- interface UseKalshiResult {
4
- config: KalshiConfig | null;
5
- marketApi: MarketApi | null;
6
- portfolioApi: PortfolioApi | null;
7
- ordersApi: OrdersApi | null;
8
- isConfigured: boolean;
9
- configError: string | null;
10
- }
11
1
  /**
12
- * Hook to initialize and provide Kalshi API clients
2
+ * useKalshi Hook
3
+ * Manages connection to Kalshi API and data fetching
4
+ * Includes rate limiting, timeouts, and error handling
13
5
  */
14
- export declare function useKalshi(): UseKalshiResult;
6
+ import { type MarketDisplay, type OrderbookDisplay } from '@newyorkcompute/kalshi-core';
7
+ interface Position {
8
+ ticker: string;
9
+ position: number;
10
+ market_exposure: number;
11
+ }
12
+ interface MarketWithHistory extends MarketDisplay {
13
+ previousYesBid?: number;
14
+ }
15
+ interface TradePoint {
16
+ timestamp: number;
17
+ price: number;
18
+ volume: number;
19
+ }
20
+ interface UseKalshiReturn {
21
+ markets: MarketWithHistory[];
22
+ orderbook: OrderbookDisplay | null;
23
+ balance: number | null;
24
+ positions: Position[];
25
+ isConnected: boolean;
26
+ isRateLimited: boolean;
27
+ error: string | null;
28
+ selectMarket: (ticker: string) => void;
29
+ priceHistory: TradePoint[];
30
+ fetchPriceHistory: (ticker: string, hours?: number) => Promise<void>;
31
+ }
32
+ export declare function useKalshi(): UseKalshiReturn;
15
33
  export {};
16
34
  //# sourceMappingURL=useKalshi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKalshi.d.ts","sourceRoot":"","sources":["../../src/hooks/useKalshi.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE5E,UAAU,eAAe;IACvB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,eAAe,CAuC3C"}
1
+ {"version":3,"file":"useKalshi.d.ts","sourceRoot":"","sources":["../../src/hooks/useKalshi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,6BAA6B,CAAC;AAUrC,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAGD,UAAU,iBAAkB,SAAQ,aAAa;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAcD,wBAAgB,SAAS,IAAI,eAAe,CA8S3C"}
@@ -1,31 +1,261 @@
1
- import { useState, useEffect, useMemo } from "react";
2
- import { getKalshiConfig, createMarketApi, createPortfolioApi, createOrdersApi, } from "@newyorkcompute/kalshi-core";
3
1
  /**
4
- * Hook to initialize and provide Kalshi API clients
2
+ * useKalshi Hook
3
+ * Manages connection to Kalshi API and data fetching
4
+ * Includes rate limiting, timeouts, and error handling
5
5
  */
6
+ import { useState, useEffect, useCallback, useRef } from 'react';
7
+ import { createMarketApi, createPortfolioApi, getKalshiConfig, withTimeout, } from '@newyorkcompute/kalshi-core';
8
+ import { getCached, setCache, CACHE_TTL } from '../cache.js';
9
+ // Constants
10
+ const DEFAULT_TIMEOUT = 30000; // 30 seconds
11
+ const MIN_POLL_INTERVAL = 10000; // 10 seconds
12
+ const MAX_POLL_INTERVAL = 300000; // 5 minutes
13
+ const MAX_CONSECUTIVE_FAILURES = 5;
14
+ /**
15
+ * Check if an error is a rate limit error (429)
16
+ */
17
+ function isRateLimitError(error) {
18
+ if (error instanceof Error) {
19
+ return error.message.includes('429') ||
20
+ error.message.toLowerCase().includes('rate limit') ||
21
+ error.message.toLowerCase().includes('too many requests');
22
+ }
23
+ return false;
24
+ }
6
25
  export function useKalshi() {
7
- const [config, setConfig] = useState(null);
8
- const [configError, setConfigError] = useState(null);
26
+ const [markets, setMarkets] = useState([]);
27
+ const [orderbook, setOrderbook] = useState(null);
28
+ const [balance, setBalance] = useState(null);
29
+ const [positions, setPositions] = useState([]);
30
+ const [isConnected, setIsConnected] = useState(false);
31
+ const [isRateLimited, setIsRateLimited] = useState(false);
32
+ const [error, setError] = useState(null);
33
+ const [selectedTicker, setSelectedTicker] = useState(null);
34
+ const [priceHistory, setPriceHistory] = useState([]);
35
+ // API clients
36
+ const marketApiRef = useRef(null);
37
+ const portfolioApiRef = useRef(null);
38
+ // Store previous prices for change detection
39
+ const previousPricesRef = useRef(new Map());
40
+ // Rate limiting state
41
+ const pollIntervalRef = useRef(MIN_POLL_INTERVAL);
42
+ const consecutiveFailuresRef = useRef(0);
43
+ const circuitBreakerOpenRef = useRef(false);
44
+ // Initialize API clients
9
45
  useEffect(() => {
10
46
  try {
11
- const kalshiConfig = getKalshiConfig();
12
- setConfig(kalshiConfig);
13
- setConfigError(null);
47
+ const config = getKalshiConfig();
48
+ marketApiRef.current = createMarketApi(config);
49
+ portfolioApiRef.current = createPortfolioApi(config);
50
+ setIsConnected(true);
51
+ setError(null);
14
52
  }
15
- catch (error) {
16
- setConfigError(error instanceof Error ? error.message : "Unknown configuration error");
53
+ catch (err) {
54
+ setError(err instanceof Error ? err.message : 'Failed to initialize');
55
+ setIsConnected(false);
17
56
  }
18
57
  }, []);
19
- const marketApi = useMemo(() => (config ? createMarketApi(config) : null), [config]);
20
- const portfolioApi = useMemo(() => (config ? createPortfolioApi(config) : null), [config]);
21
- const ordersApi = useMemo(() => (config ? createOrdersApi(config) : null), [config]);
58
+ /**
59
+ * Handle successful API call - reset rate limiting
60
+ */
61
+ const handleSuccess = useCallback(() => {
62
+ consecutiveFailuresRef.current = 0;
63
+ pollIntervalRef.current = MIN_POLL_INTERVAL;
64
+ circuitBreakerOpenRef.current = false;
65
+ setIsRateLimited(false);
66
+ setIsConnected(true);
67
+ }, []);
68
+ /**
69
+ * Handle failed API call - apply exponential backoff
70
+ */
71
+ const handleFailure = useCallback((err) => {
72
+ consecutiveFailuresRef.current += 1;
73
+ if (isRateLimitError(err)) {
74
+ // Exponential backoff for rate limits
75
+ pollIntervalRef.current = Math.min(pollIntervalRef.current * 2, MAX_POLL_INTERVAL);
76
+ setIsRateLimited(true);
77
+ setError(`Rate limited. Backing off to ${Math.round(pollIntervalRef.current / 1000)}s`);
78
+ }
79
+ // Circuit breaker
80
+ if (consecutiveFailuresRef.current >= MAX_CONSECUTIVE_FAILURES) {
81
+ circuitBreakerOpenRef.current = true;
82
+ setError(`Too many failures. Pausing requests for ${Math.round(MAX_POLL_INTERVAL / 1000)}s`);
83
+ // Auto-reset circuit breaker after max interval
84
+ setTimeout(() => {
85
+ circuitBreakerOpenRef.current = false;
86
+ consecutiveFailuresRef.current = 0;
87
+ pollIntervalRef.current = MIN_POLL_INTERVAL;
88
+ }, MAX_POLL_INTERVAL);
89
+ }
90
+ }, []);
91
+ // Fetch markets with timeout and rate limiting
92
+ const fetchMarkets = useCallback(async () => {
93
+ if (!marketApiRef.current || circuitBreakerOpenRef.current)
94
+ return;
95
+ try {
96
+ const response = await withTimeout(marketApiRef.current.getMarkets(100, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'open'), DEFAULT_TIMEOUT, 'Markets request timed out');
97
+ const marketData = (response.data.markets || []).map((m) => {
98
+ const ticker = m.ticker || '';
99
+ const currentYesBid = m.yes_bid;
100
+ const previousYesBid = previousPricesRef.current.get(ticker);
101
+ // Store current price for next comparison
102
+ if (currentYesBid !== undefined) {
103
+ previousPricesRef.current.set(ticker, currentYesBid);
104
+ }
105
+ return {
106
+ ticker,
107
+ title: m.title || '',
108
+ status: (m.status || 'open'),
109
+ yes_bid: currentYesBid,
110
+ yes_ask: m.yes_ask,
111
+ no_bid: m.no_bid,
112
+ no_ask: m.no_ask,
113
+ volume: m.volume,
114
+ open_interest: m.open_interest,
115
+ close_time: m.close_time,
116
+ previousYesBid,
117
+ };
118
+ });
119
+ // Sort by volume (highest first) - most active markets at top
120
+ marketData.sort((a, b) => (b.volume || 0) - (a.volume || 0));
121
+ setMarkets(marketData);
122
+ handleSuccess();
123
+ }
124
+ catch (err) {
125
+ handleFailure(err);
126
+ }
127
+ }, [handleSuccess, handleFailure]);
128
+ // Fetch orderbook for selected market with timeout
129
+ const fetchOrderbook = useCallback(async (ticker) => {
130
+ if (!marketApiRef.current || !ticker || circuitBreakerOpenRef.current)
131
+ return;
132
+ try {
133
+ const response = await withTimeout(marketApiRef.current.getMarketOrderbook(ticker, 10), DEFAULT_TIMEOUT, 'Orderbook request timed out');
134
+ const ob = response.data.orderbook;
135
+ if (ob) {
136
+ const parseLevel = (entry) => [
137
+ parseFloat(entry[0] || '0'),
138
+ parseInt(entry[1] || '0', 10),
139
+ ];
140
+ setOrderbook({
141
+ yes: (ob.yes_dollars || []).map(parseLevel),
142
+ no: (ob.no_dollars || []).map(parseLevel),
143
+ });
144
+ }
145
+ handleSuccess();
146
+ }
147
+ catch (err) {
148
+ handleFailure(err);
149
+ }
150
+ }, [handleSuccess, handleFailure]);
151
+ // Fetch portfolio data with timeout
152
+ const fetchPortfolio = useCallback(async () => {
153
+ if (!portfolioApiRef.current || circuitBreakerOpenRef.current)
154
+ return;
155
+ try {
156
+ const [balanceRes, positionsRes] = await Promise.all([
157
+ withTimeout(portfolioApiRef.current.getBalance(), DEFAULT_TIMEOUT, 'Balance request timed out'),
158
+ withTimeout(portfolioApiRef.current.getPositions(undefined, 100, 'position'), DEFAULT_TIMEOUT, 'Positions request timed out'),
159
+ ]);
160
+ setBalance(balanceRes.data.balance || 0);
161
+ setPositions((positionsRes.data.market_positions || []).map((p) => ({
162
+ ticker: p.ticker || '',
163
+ position: p.position || 0,
164
+ market_exposure: p.market_exposure || 0,
165
+ })));
166
+ handleSuccess();
167
+ }
168
+ catch (err) {
169
+ handleFailure(err);
170
+ }
171
+ }, [handleSuccess, handleFailure]);
172
+ // Fetch price history for a market (with caching)
173
+ const fetchPriceHistory = useCallback(async (ticker, hours = 24) => {
174
+ if (!marketApiRef.current || circuitBreakerOpenRef.current)
175
+ return;
176
+ // Check cache first
177
+ const cacheKey = `price_history:${ticker}:${hours}`;
178
+ const cached = getCached(cacheKey, CACHE_TTL.PRICE_HISTORY);
179
+ if (cached) {
180
+ setPriceHistory(cached);
181
+ return;
182
+ }
183
+ try {
184
+ const now = Math.floor(Date.now() / 1000);
185
+ const minTs = now - (hours * 60 * 60);
186
+ const response = await withTimeout(marketApiRef.current.getTrades(1000, // Get up to 1000 trades
187
+ undefined, ticker, minTs, now), DEFAULT_TIMEOUT, 'Trades request timed out');
188
+ const trades = response.data.trades || [];
189
+ // Convert trades to price points
190
+ const points = trades.map((t) => ({
191
+ timestamp: new Date(t.created_time || '').getTime(),
192
+ price: t.yes_price || 0,
193
+ volume: t.count || 0,
194
+ })).sort((a, b) => a.timestamp - b.timestamp);
195
+ // Cache the result
196
+ setCache(cacheKey, points);
197
+ setPriceHistory(points);
198
+ handleSuccess();
199
+ }
200
+ catch (err) {
201
+ handleFailure(err);
202
+ }
203
+ }, [handleSuccess, handleFailure]);
204
+ // Select market and fetch orderbook
205
+ const selectMarket = useCallback((ticker) => {
206
+ setSelectedTicker(ticker);
207
+ fetchOrderbook(ticker);
208
+ fetchPriceHistory(ticker, 24); // Fetch 24h of price history
209
+ }, [fetchOrderbook, fetchPriceHistory]);
210
+ // Initial data fetch with dynamic polling
211
+ useEffect(() => {
212
+ if (!isConnected)
213
+ return;
214
+ // Fetch immediately
215
+ fetchMarkets();
216
+ fetchPortfolio();
217
+ // Set up dynamic polling with rate limiting
218
+ let marketsTimeout;
219
+ let portfolioTimeout;
220
+ const pollMarkets = () => {
221
+ fetchMarkets();
222
+ marketsTimeout = setTimeout(pollMarkets, pollIntervalRef.current);
223
+ };
224
+ const pollPortfolio = () => {
225
+ fetchPortfolio();
226
+ portfolioTimeout = setTimeout(pollPortfolio, pollIntervalRef.current);
227
+ };
228
+ // Start polling after initial fetch
229
+ marketsTimeout = setTimeout(pollMarkets, pollIntervalRef.current);
230
+ portfolioTimeout = setTimeout(pollPortfolio, pollIntervalRef.current);
231
+ return () => {
232
+ clearTimeout(marketsTimeout);
233
+ clearTimeout(portfolioTimeout);
234
+ };
235
+ }, [isConnected, fetchMarkets, fetchPortfolio]);
236
+ // Poll orderbook for selected market
237
+ useEffect(() => {
238
+ if (!selectedTicker)
239
+ return;
240
+ let orderbookTimeout;
241
+ const pollOrderbook = () => {
242
+ fetchOrderbook(selectedTicker);
243
+ orderbookTimeout = setTimeout(pollOrderbook, pollIntervalRef.current);
244
+ };
245
+ orderbookTimeout = setTimeout(pollOrderbook, pollIntervalRef.current);
246
+ return () => clearTimeout(orderbookTimeout);
247
+ }, [selectedTicker, fetchOrderbook]);
22
248
  return {
23
- config,
24
- marketApi,
25
- portfolioApi,
26
- ordersApi,
27
- isConfigured: config !== null,
28
- configError,
249
+ markets,
250
+ orderbook,
251
+ balance,
252
+ positions,
253
+ isConnected,
254
+ isRateLimited,
255
+ error,
256
+ selectMarket,
257
+ priceHistory,
258
+ fetchPriceHistory,
29
259
  };
30
260
  }
31
261
  //# sourceMappingURL=useKalshi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKalshi.js","sourceRoot":"","sources":["../../src/hooks/useKalshi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,GAEhB,MAAM,6BAA6B,CAAC;AAYrC;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,SAAS,CAAC,YAAY,CAAC,CAAC;YACxB,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CACvE,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAC/C,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAClD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAC/C,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO;QACL,MAAM;QACN,SAAS;QACT,YAAY;QACZ,SAAS;QACT,YAAY,EAAE,MAAM,KAAK,IAAI;QAC7B,WAAW;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useKalshi.js","sourceRoot":"","sources":["../../src/hooks/useKalshi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * TUI Utility Functions
3
+ * Formatting and display helpers
4
+ */
5
+ /**
6
+ * Format close time as relative time (e.g., "2d 14h", "3h 45m", "45m")
7
+ * For distant dates (>365 days), shows years or "distant"
8
+ */
9
+ export declare function formatExpiry(closeTime?: string): string;
10
+ /**
11
+ * Get price change indicator and color
12
+ */
13
+ export declare function getPriceChange(current?: number, previous?: number): {
14
+ text: string;
15
+ color: string;
16
+ };
17
+ /**
18
+ * Format volume with K/M suffix
19
+ */
20
+ export declare function formatVolume(volume?: number): string;
21
+ /**
22
+ * Format price in cents
23
+ */
24
+ export declare function formatPrice(cents?: number): string;
25
+ /**
26
+ * Format price with decimals
27
+ */
28
+ export declare function formatPriceDecimal(cents: number): string;
29
+ /**
30
+ * Calculate spread from best bid and ask
31
+ */
32
+ export declare function calculateSpread(bestBid: number | null, bestAsk: number | null): number | null;
33
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAmCvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAUnG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG7F"}
package/dist/utils.js ADDED
@@ -0,0 +1,88 @@
1
+ /**
2
+ * TUI Utility Functions
3
+ * Formatting and display helpers
4
+ */
5
+ /**
6
+ * Format close time as relative time (e.g., "2d 14h", "3h 45m", "45m")
7
+ * For distant dates (>365 days), shows years or "distant"
8
+ */
9
+ export function formatExpiry(closeTime) {
10
+ if (!closeTime)
11
+ return '';
12
+ const now = new Date();
13
+ const close = new Date(closeTime);
14
+ const diffMs = close.getTime() - now.getTime();
15
+ if (diffMs <= 0)
16
+ return 'CLOSED';
17
+ const diffMins = Math.floor(diffMs / (1000 * 60));
18
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
19
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
20
+ const diffYears = Math.floor(diffDays / 365);
21
+ // For very distant dates, show years or "distant"
22
+ if (diffYears > 10) {
23
+ return 'distant';
24
+ }
25
+ if (diffYears >= 1) {
26
+ const remainingMonths = Math.floor((diffDays % 365) / 30);
27
+ return remainingMonths > 0 ? `${diffYears}y ${remainingMonths}mo` : `${diffYears}y`;
28
+ }
29
+ // For dates > 30 days, show just days
30
+ if (diffDays > 30) {
31
+ return `${diffDays}d`;
32
+ }
33
+ if (diffDays > 0) {
34
+ const remainingHours = diffHours % 24;
35
+ return `${diffDays}d ${remainingHours}h`;
36
+ }
37
+ if (diffHours > 0) {
38
+ const remainingMins = diffMins % 60;
39
+ return `${diffHours}h ${remainingMins}m`;
40
+ }
41
+ return `${diffMins}m`;
42
+ }
43
+ /**
44
+ * Get price change indicator and color
45
+ */
46
+ export function getPriceChange(current, previous) {
47
+ if (current === undefined || previous === undefined || current === previous) {
48
+ return { text: '━', color: 'gray' };
49
+ }
50
+ const diff = current - previous;
51
+ if (diff > 0) {
52
+ return { text: '▲', color: 'green' };
53
+ }
54
+ return { text: '▼', color: 'red' };
55
+ }
56
+ /**
57
+ * Format volume with K/M suffix
58
+ */
59
+ export function formatVolume(volume) {
60
+ if (!volume)
61
+ return '';
62
+ if (volume >= 1000000)
63
+ return `${(volume / 1000000).toFixed(1)}M`;
64
+ if (volume >= 1000)
65
+ return `${(volume / 1000).toFixed(1)}K`;
66
+ return `${volume}`;
67
+ }
68
+ /**
69
+ * Format price in cents
70
+ */
71
+ export function formatPrice(cents) {
72
+ return cents !== undefined ? `${cents}¢` : '—';
73
+ }
74
+ /**
75
+ * Format price with decimals
76
+ */
77
+ export function formatPriceDecimal(cents) {
78
+ return `${cents.toFixed(2)}¢`;
79
+ }
80
+ /**
81
+ * Calculate spread from best bid and ask
82
+ */
83
+ export function calculateSpread(bestBid, bestAsk) {
84
+ if (bestBid === null || bestAsk === null)
85
+ return null;
86
+ return bestAsk - bestBid;
87
+ }
88
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { formatExpiry, getPriceChange, formatVolume, formatPrice, formatPriceDecimal, calculateSpread, } from './utils.js';
3
+ describe('formatExpiry', () => {
4
+ beforeEach(() => {
5
+ // Mock current time to 2025-01-01 12:00:00 UTC
6
+ vi.useFakeTimers();
7
+ vi.setSystemTime(new Date('2025-01-01T12:00:00Z'));
8
+ });
9
+ afterEach(() => {
10
+ vi.useRealTimers();
11
+ });
12
+ it('returns empty string for undefined', () => {
13
+ expect(formatExpiry(undefined)).toBe('');
14
+ });
15
+ it('returns CLOSED for past dates', () => {
16
+ expect(formatExpiry('2025-01-01T11:00:00Z')).toBe('CLOSED');
17
+ expect(formatExpiry('2024-12-31T00:00:00Z')).toBe('CLOSED');
18
+ });
19
+ it('formats days and hours for dates <= 30 days away', () => {
20
+ expect(formatExpiry('2025-01-03T12:00:00Z')).toBe('2d 0h');
21
+ expect(formatExpiry('2025-01-04T02:00:00Z')).toBe('2d 14h');
22
+ expect(formatExpiry('2025-01-20T12:00:00Z')).toBe('19d 0h');
23
+ });
24
+ it('formats just days for dates > 30 days away', () => {
25
+ expect(formatExpiry('2025-03-01T12:00:00Z')).toBe('59d');
26
+ expect(formatExpiry('2025-06-01T12:00:00Z')).toBe('151d');
27
+ });
28
+ it('formats years and months for dates >= 1 year away', () => {
29
+ expect(formatExpiry('2026-01-01T12:00:00Z')).toBe('1y');
30
+ expect(formatExpiry('2026-07-01T12:00:00Z')).toBe('1y 6mo');
31
+ expect(formatExpiry('2028-01-01T12:00:00Z')).toBe('3y');
32
+ });
33
+ it('returns "distant" for dates > 10 years away', () => {
34
+ expect(formatExpiry('2040-01-01T12:00:00Z')).toBe('distant');
35
+ expect(formatExpiry('2100-01-01T12:00:00Z')).toBe('distant');
36
+ });
37
+ it('formats hours and minutes for dates < 24h away', () => {
38
+ expect(formatExpiry('2025-01-01T15:30:00Z')).toBe('3h 30m');
39
+ expect(formatExpiry('2025-01-01T14:00:00Z')).toBe('2h 0m');
40
+ });
41
+ it('formats minutes only for dates < 1h away', () => {
42
+ expect(formatExpiry('2025-01-01T12:45:00Z')).toBe('45m');
43
+ expect(formatExpiry('2025-01-01T12:05:00Z')).toBe('5m');
44
+ });
45
+ });
46
+ describe('getPriceChange', () => {
47
+ it('returns gray dash for undefined values', () => {
48
+ expect(getPriceChange(undefined, undefined)).toEqual({ text: '━', color: 'gray' });
49
+ expect(getPriceChange(50, undefined)).toEqual({ text: '━', color: 'gray' });
50
+ expect(getPriceChange(undefined, 50)).toEqual({ text: '━', color: 'gray' });
51
+ });
52
+ it('returns gray dash for equal values', () => {
53
+ expect(getPriceChange(50, 50)).toEqual({ text: '━', color: 'gray' });
54
+ expect(getPriceChange(0, 0)).toEqual({ text: '━', color: 'gray' });
55
+ });
56
+ it('returns green up arrow for price increase', () => {
57
+ expect(getPriceChange(55, 50)).toEqual({ text: '▲', color: 'green' });
58
+ expect(getPriceChange(100, 1)).toEqual({ text: '▲', color: 'green' });
59
+ });
60
+ it('returns red down arrow for price decrease', () => {
61
+ expect(getPriceChange(45, 50)).toEqual({ text: '▼', color: 'red' });
62
+ expect(getPriceChange(1, 100)).toEqual({ text: '▼', color: 'red' });
63
+ });
64
+ });
65
+ describe('formatVolume', () => {
66
+ it('returns empty string for undefined/zero', () => {
67
+ expect(formatVolume(undefined)).toBe('');
68
+ expect(formatVolume(0)).toBe('');
69
+ });
70
+ it('formats millions with M suffix', () => {
71
+ expect(formatVolume(1500000)).toBe('1.5M');
72
+ expect(formatVolume(10000000)).toBe('10.0M');
73
+ });
74
+ it('formats thousands with K suffix', () => {
75
+ expect(formatVolume(1500)).toBe('1.5K');
76
+ expect(formatVolume(50000)).toBe('50.0K');
77
+ });
78
+ it('leaves small numbers as-is', () => {
79
+ expect(formatVolume(500)).toBe('500');
80
+ expect(formatVolume(42)).toBe('42');
81
+ });
82
+ });
83
+ describe('formatPrice', () => {
84
+ it('formats cents with cent symbol', () => {
85
+ expect(formatPrice(45)).toBe('45¢');
86
+ expect(formatPrice(99)).toBe('99¢');
87
+ expect(formatPrice(0)).toBe('0¢');
88
+ });
89
+ it('returns dash for undefined', () => {
90
+ expect(formatPrice(undefined)).toBe('—');
91
+ });
92
+ });
93
+ describe('formatPriceDecimal', () => {
94
+ it('formats price with two decimal places', () => {
95
+ expect(formatPriceDecimal(45)).toBe('45.00¢');
96
+ expect(formatPriceDecimal(99.5)).toBe('99.50¢');
97
+ expect(formatPriceDecimal(0.01)).toBe('0.01¢');
98
+ });
99
+ });
100
+ describe('calculateSpread', () => {
101
+ it('returns null if either value is null', () => {
102
+ expect(calculateSpread(null, null)).toBeNull();
103
+ expect(calculateSpread(50, null)).toBeNull();
104
+ expect(calculateSpread(null, 55)).toBeNull();
105
+ });
106
+ it('calculates spread correctly', () => {
107
+ expect(calculateSpread(50, 55)).toBe(5);
108
+ expect(calculateSpread(45, 47)).toBe(2);
109
+ expect(calculateSpread(99, 100)).toBe(1);
110
+ });
111
+ it('handles zero spread', () => {
112
+ expect(calculateSpread(50, 50)).toBe(0);
113
+ });
114
+ });
115
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}