@newyorkcompute/kalshi-tui 0.1.0 → 0.2.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 (97) 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 +38 -36
  5. package/dist/App.js.map +1 -1
  6. package/dist/cli.d.ts +2 -2
  7. package/dist/cli.js +28 -33
  8. package/dist/cli.js.map +1 -1
  9. package/dist/components/Footer.d.ts +6 -0
  10. package/dist/components/Footer.d.ts.map +1 -0
  11. package/dist/components/Footer.js +10 -0
  12. package/dist/components/Footer.js.map +1 -0
  13. package/dist/components/Header.d.ts +9 -2
  14. package/dist/components/Header.d.ts.map +1 -1
  15. package/dist/components/Header.js +7 -9
  16. package/dist/components/Header.js.map +1 -1
  17. package/dist/components/Markets.d.ts +21 -0
  18. package/dist/components/Markets.d.ts.map +1 -0
  19. package/dist/components/Markets.js +24 -0
  20. package/dist/components/Markets.js.map +1 -0
  21. package/dist/components/Orderbook.d.ts +18 -5
  22. package/dist/components/Orderbook.d.ts.map +1 -1
  23. package/dist/components/Orderbook.js +25 -36
  24. package/dist/components/Orderbook.js.map +1 -1
  25. package/dist/components/Positions.d.ts +13 -2
  26. package/dist/components/Positions.d.ts.map +1 -1
  27. package/dist/components/Positions.js +10 -17
  28. package/dist/components/Positions.js.map +1 -1
  29. package/dist/components/index.d.ts +8 -10
  30. package/dist/components/index.d.ts.map +1 -1
  31. package/dist/components/index.js +8 -11
  32. package/dist/components/index.js.map +1 -1
  33. package/dist/hooks/index.d.ts +4 -4
  34. package/dist/hooks/index.d.ts.map +1 -1
  35. package/dist/hooks/index.js +4 -4
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/hooks/useKalshi.d.ts +21 -12
  38. package/dist/hooks/useKalshi.d.ts.map +1 -1
  39. package/dist/hooks/useKalshi.js +139 -19
  40. package/dist/hooks/useKalshi.js.map +1 -1
  41. package/dist/utils.d.ts +32 -0
  42. package/dist/utils.d.ts.map +1 -0
  43. package/dist/utils.js +74 -0
  44. package/dist/utils.js.map +1 -0
  45. package/dist/utils.test.d.ts +2 -0
  46. package/dist/utils.test.d.ts.map +1 -0
  47. package/dist/utils.test.js +101 -0
  48. package/dist/utils.test.js.map +1 -0
  49. package/package.json +6 -8
  50. package/dist/components/HelpModal.d.ts +0 -5
  51. package/dist/components/HelpModal.d.ts.map +0 -1
  52. package/dist/components/HelpModal.js +0 -19
  53. package/dist/components/HelpModal.js.map +0 -1
  54. package/dist/components/MarketList.d.ts +0 -5
  55. package/dist/components/MarketList.d.ts.map +0 -1
  56. package/dist/components/MarketList.js +0 -68
  57. package/dist/components/MarketList.js.map +0 -1
  58. package/dist/components/OrderEntry.d.ts +0 -9
  59. package/dist/components/OrderEntry.d.ts.map +0 -1
  60. package/dist/components/OrderEntry.js +0 -77
  61. package/dist/components/OrderEntry.js.map +0 -1
  62. package/dist/components/SearchBar.d.ts +0 -5
  63. package/dist/components/SearchBar.d.ts.map +0 -1
  64. package/dist/components/SearchBar.js +0 -27
  65. package/dist/components/SearchBar.js.map +0 -1
  66. package/dist/components/StatusBar.d.ts +0 -5
  67. package/dist/components/StatusBar.d.ts.map +0 -1
  68. package/dist/components/StatusBar.js +0 -9
  69. package/dist/components/StatusBar.js.map +0 -1
  70. package/dist/components/ui/Box.d.ts +0 -14
  71. package/dist/components/ui/Box.d.ts.map +0 -1
  72. package/dist/components/ui/Box.js +0 -9
  73. package/dist/components/ui/Box.js.map +0 -1
  74. package/dist/components/ui/Sparkline.d.ts +0 -11
  75. package/dist/components/ui/Sparkline.d.ts.map +0 -1
  76. package/dist/components/ui/Sparkline.js +0 -32
  77. package/dist/components/ui/Sparkline.js.map +0 -1
  78. package/dist/hooks/useMarkets.d.ts +0 -13
  79. package/dist/hooks/useMarkets.d.ts.map +0 -1
  80. package/dist/hooks/useMarkets.js +0 -89
  81. package/dist/hooks/useMarkets.js.map +0 -1
  82. package/dist/hooks/useOrderbook.d.ts +0 -13
  83. package/dist/hooks/useOrderbook.d.ts.map +0 -1
  84. package/dist/hooks/useOrderbook.js +0 -81
  85. package/dist/hooks/useOrderbook.js.map +0 -1
  86. package/dist/hooks/usePortfolio.d.ts +0 -18
  87. package/dist/hooks/usePortfolio.d.ts.map +0 -1
  88. package/dist/hooks/usePortfolio.js +0 -84
  89. package/dist/hooks/usePortfolio.js.map +0 -1
  90. package/dist/stores/app-store.d.ts +0 -17
  91. package/dist/stores/app-store.d.ts.map +0 -1
  92. package/dist/stores/app-store.js +0 -21
  93. package/dist/stores/app-store.js.map +0 -1
  94. package/dist/theme.d.ts +0 -31
  95. package/dist/theme.d.ts.map +0 -1
  96. package/dist/theme.js +0 -37
  97. package/dist/theme.js.map +0 -1
@@ -1,22 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { formatCurrency, truncate } from "@newyorkcompute/kalshi-core";
4
- import { usePortfolio } from "../hooks/usePortfolio.js";
5
- import { useAppStore } from "../stores/app-store.js";
6
2
  /**
7
- * Positions panel showing current holdings
3
+ * Positions Component
4
+ * Displays open positions with P&L
8
5
  */
9
- export function Positions() {
10
- const { positions, isLoading, error } = usePortfolio();
11
- const activePanel = useAppStore((state) => state.activePanel);
12
- const isActive = activePanel === "positions";
13
- // Calculate total exposure
14
- const totalExposure = positions.reduce((sum, pos) => sum + pos.market_exposure, 0);
15
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: isActive ? "green" : "gray", height: 10, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: isActive ? "green" : "white", children: "POSITIONS" }), _jsx(Text, { color: "gray", dimColor: true, children: "[F3]" })] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "─".repeat(40) }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: [isLoading && _jsx(Text, { color: "gray", children: "Loading positions..." }), error && _jsx(Text, { color: "red", children: error }), !isLoading && !error && positions.length === 0 && (_jsx(Text, { color: "gray", children: "No open positions" })), positions.slice(0, 4).map((position) => {
16
- const side = position.position > 0 ? "YES" : "NO";
17
- const quantity = Math.abs(position.position);
18
- const exposure = position.market_exposure;
19
- return (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "white", children: truncate(position.ticker, 18) }), _jsxs(Box, { children: [_jsxs(Text, { color: side === "YES" ? "green" : "red", children: [side === "YES" ? "+" : "-", quantity] }), _jsxs(Text, { color: "gray", children: [" ", side] })] }), _jsx(Text, { color: "white", children: formatCurrency(exposure) })] }, position.ticker));
20
- }), positions.length > 0 && (_jsxs(Box, { marginTop: 1, justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "Total Exposure:" }), _jsx(Text, { color: "white", bold: true, children: formatCurrency(totalExposure) })] }))] })] }));
6
+ import { Box, Text } from 'ink';
7
+ export function Positions({ positions, height }) {
8
+ const formatCurrency = (cents) => `$${(cents / 100).toFixed(2)}`;
9
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", height: height, width: "100%", children: [_jsx(Box, { paddingX: 1, children: _jsx(Text, { bold: true, children: " POSITIONS " }) }), _jsx(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: positions.length === 0 ? (_jsx(Text, { color: "gray", children: "No open positions" })) : (positions.slice(0, height - 3).map((pos) => {
10
+ const side = pos.position > 0 ? 'YES' : 'NO';
11
+ const sideColor = pos.position > 0 ? 'green' : 'red';
12
+ return (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { children: pos.ticker.slice(0, 18) }), _jsxs(Box, { children: [_jsxs(Text, { color: sideColor, children: [Math.abs(pos.position), " ", side] }), _jsxs(Text, { children: [" ", formatCurrency(pos.market_exposure)] })] })] }, pos.ticker));
13
+ })) })] }));
21
14
  }
22
15
  //# sourceMappingURL=Positions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Positions.js","sourceRoot":"","sources":["../../src/components/Positions.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Positions.js","sourceRoot":"","sources":["../../src/components/Positions.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAahC,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAkB;IAC7D,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAC,MAAM,aAGZ,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,IAAC,IAAI,kCAAmB,GACzB,EAGN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YACjD,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACxB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kCAAyB,CAC5C,CAAC,CAAC,CAAC,CACF,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBAErD,OAAO,CACL,MAAC,GAAG,IAAkB,cAAc,EAAC,eAAe,aAClD,KAAC,IAAI,cAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAQ,EACtC,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,aACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAG,IAAI,IACzB,EACP,MAAC,IAAI,oBAAG,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,IAAQ,IAC/C,KAPE,GAAG,CAAC,MAAM,CAQd,CACP,CAAC;gBACJ,CAAC,CAAC,CACH,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -1,11 +1,9 @@
1
- export { Header } from "./Header.js";
2
- export { MarketList } from "./MarketList.js";
3
- export { Orderbook } from "./Orderbook.js";
4
- export { Positions } from "./Positions.js";
5
- export { OrderEntry } from "./OrderEntry.js";
6
- export { StatusBar } from "./StatusBar.js";
7
- export { HelpModal } from "./HelpModal.js";
8
- export { SearchBar } from "./SearchBar.js";
9
- export { Panel } from "./ui/Box.js";
10
- export { Sparkline } from "./ui/Sparkline.js";
1
+ /**
2
+ * Component exports
3
+ */
4
+ export { Header } from './Header.js';
5
+ export { Markets } from './Markets.js';
6
+ export { Orderbook } from './Orderbook.js';
7
+ export { Positions } from './Positions.js';
8
+ export { Footer } from './Footer.js';
11
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -1,12 +1,9 @@
1
- export { Header } from "./Header.js";
2
- export { MarketList } from "./MarketList.js";
3
- export { Orderbook } from "./Orderbook.js";
4
- export { Positions } from "./Positions.js";
5
- export { OrderEntry } from "./OrderEntry.js";
6
- export { StatusBar } from "./StatusBar.js";
7
- export { HelpModal } from "./HelpModal.js";
8
- export { SearchBar } from "./SearchBar.js";
9
- // UI components
10
- export { Panel } from "./ui/Box.js";
11
- export { Sparkline } from "./ui/Sparkline.js";
1
+ /**
2
+ * Component exports
3
+ */
4
+ export { Header } from './Header.js';
5
+ export { Markets } from './Markets.js';
6
+ export { Orderbook } from './Orderbook.js';
7
+ export { Positions } from './Positions.js';
8
+ export { Footer } from './Footer.js';
12
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,gBAAgB;AAChB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -1,5 +1,5 @@
1
- export { useKalshi } from "./useKalshi.js";
2
- export { useMarkets } from "./useMarkets.js";
3
- export { useOrderbook } from "./useOrderbook.js";
4
- export { usePortfolio } from "./usePortfolio.js";
1
+ /**
2
+ * Hook exports
3
+ */
4
+ export { useKalshi } from './useKalshi.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,5 +1,5 @@
1
- export { useKalshi } from "./useKalshi.js";
2
- export { useMarkets } from "./useMarkets.js";
3
- export { useOrderbook } from "./useOrderbook.js";
4
- export { usePortfolio } from "./usePortfolio.js";
1
+ /**
2
+ * Hook exports
3
+ */
4
+ export { useKalshi } from './useKalshi.js';
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,16 +1,25 @@
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
13
4
  */
14
- export declare function useKalshi(): UseKalshiResult;
5
+ import { type MarketDisplay, type OrderbookDisplay } from '@newyorkcompute/kalshi-core';
6
+ interface Position {
7
+ ticker: string;
8
+ position: number;
9
+ market_exposure: number;
10
+ }
11
+ interface MarketWithHistory extends MarketDisplay {
12
+ previousYesBid?: number;
13
+ }
14
+ interface UseKalshiReturn {
15
+ markets: MarketWithHistory[];
16
+ orderbook: OrderbookDisplay | null;
17
+ balance: number | null;
18
+ positions: Position[];
19
+ isConnected: boolean;
20
+ error: string | null;
21
+ selectMarket: (ticker: string) => void;
22
+ }
23
+ export declare function useKalshi(): UseKalshiReturn;
15
24
  export {};
16
25
  //# 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;;;GAGG;AAGH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,6BAA6B,CAAC;AAGrC,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;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,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,SAAS,IAAI,eAAe,CAoK3C"}
@@ -1,31 +1,151 @@
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
5
4
  */
5
+ import { useState, useEffect, useCallback, useRef } from 'react';
6
+ import { createMarketApi, createPortfolioApi, getKalshiConfig, } from '@newyorkcompute/kalshi-core';
6
7
  export function useKalshi() {
7
- const [config, setConfig] = useState(null);
8
- const [configError, setConfigError] = useState(null);
8
+ const [markets, setMarkets] = useState([]);
9
+ const [orderbook, setOrderbook] = useState(null);
10
+ const [balance, setBalance] = useState(null);
11
+ const [positions, setPositions] = useState([]);
12
+ const [isConnected, setIsConnected] = useState(false);
13
+ const [error, setError] = useState(null);
14
+ const [selectedTicker, setSelectedTicker] = useState(null);
15
+ // API clients
16
+ const marketApiRef = useRef(null);
17
+ const portfolioApiRef = useRef(null);
18
+ // Store previous prices for change detection
19
+ const previousPricesRef = useRef(new Map());
20
+ // Initialize API clients
9
21
  useEffect(() => {
10
22
  try {
11
- const kalshiConfig = getKalshiConfig();
12
- setConfig(kalshiConfig);
13
- setConfigError(null);
23
+ const config = getKalshiConfig();
24
+ marketApiRef.current = createMarketApi(config);
25
+ portfolioApiRef.current = createPortfolioApi(config);
26
+ setIsConnected(true);
27
+ setError(null);
14
28
  }
15
- catch (error) {
16
- setConfigError(error instanceof Error ? error.message : "Unknown configuration error");
29
+ catch (err) {
30
+ setError(err instanceof Error ? err.message : 'Failed to initialize');
31
+ setIsConnected(false);
17
32
  }
18
33
  }, []);
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]);
34
+ // Fetch markets
35
+ const fetchMarkets = useCallback(async () => {
36
+ if (!marketApiRef.current)
37
+ return;
38
+ try {
39
+ const response = await marketApiRef.current.getMarkets(100, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'open');
40
+ const marketData = (response.data.markets || []).map((m) => {
41
+ const ticker = m.ticker || '';
42
+ const currentYesBid = m.yes_bid;
43
+ const previousYesBid = previousPricesRef.current.get(ticker);
44
+ // Store current price for next comparison
45
+ if (currentYesBid !== undefined) {
46
+ previousPricesRef.current.set(ticker, currentYesBid);
47
+ }
48
+ return {
49
+ ticker,
50
+ title: m.title || '',
51
+ status: (m.status || 'open'),
52
+ yes_bid: currentYesBid,
53
+ yes_ask: m.yes_ask,
54
+ no_bid: m.no_bid,
55
+ no_ask: m.no_ask,
56
+ volume: m.volume,
57
+ open_interest: m.open_interest,
58
+ close_time: m.close_time,
59
+ previousYesBid,
60
+ };
61
+ });
62
+ setMarkets(marketData);
63
+ setIsConnected(true);
64
+ }
65
+ catch {
66
+ // Silently fail, will retry
67
+ }
68
+ }, []);
69
+ // Fetch orderbook for selected market
70
+ const fetchOrderbook = useCallback(async (ticker) => {
71
+ if (!marketApiRef.current || !ticker)
72
+ return;
73
+ try {
74
+ const response = await marketApiRef.current.getMarketOrderbook(ticker, 10);
75
+ const ob = response.data.orderbook;
76
+ if (ob) {
77
+ const parseLevel = (entry) => [
78
+ parseFloat(entry[0] || '0'),
79
+ parseInt(entry[1] || '0', 10),
80
+ ];
81
+ setOrderbook({
82
+ yes: (ob.yes_dollars || []).map(parseLevel),
83
+ no: (ob.no_dollars || []).map(parseLevel),
84
+ });
85
+ }
86
+ }
87
+ catch {
88
+ // Silently fail
89
+ }
90
+ }, []);
91
+ // Fetch portfolio data
92
+ const fetchPortfolio = useCallback(async () => {
93
+ if (!portfolioApiRef.current)
94
+ return;
95
+ try {
96
+ const [balanceRes, positionsRes] = await Promise.all([
97
+ portfolioApiRef.current.getBalance(),
98
+ portfolioApiRef.current.getPositions(undefined, 100, 'position'),
99
+ ]);
100
+ setBalance(balanceRes.data.balance || 0);
101
+ setPositions((positionsRes.data.market_positions || []).map((p) => ({
102
+ ticker: p.ticker || '',
103
+ position: p.position || 0,
104
+ market_exposure: p.market_exposure || 0,
105
+ })));
106
+ setIsConnected(true);
107
+ }
108
+ catch {
109
+ // Silently fail
110
+ }
111
+ }, []);
112
+ // Select market and fetch orderbook
113
+ const selectMarket = useCallback((ticker) => {
114
+ setSelectedTicker(ticker);
115
+ fetchOrderbook(ticker);
116
+ }, [fetchOrderbook]);
117
+ // Initial data fetch
118
+ useEffect(() => {
119
+ if (!isConnected)
120
+ return;
121
+ // Fetch immediately
122
+ fetchMarkets();
123
+ fetchPortfolio();
124
+ // Set up polling
125
+ const marketsInterval = setInterval(fetchMarkets, 60000);
126
+ const portfolioInterval = setInterval(fetchPortfolio, 30000);
127
+ return () => {
128
+ clearInterval(marketsInterval);
129
+ clearInterval(portfolioInterval);
130
+ };
131
+ }, [isConnected, fetchMarkets, fetchPortfolio]);
132
+ // Poll orderbook for selected market
133
+ useEffect(() => {
134
+ if (!selectedTicker)
135
+ return;
136
+ const orderbookInterval = setInterval(() => {
137
+ fetchOrderbook(selectedTicker);
138
+ }, 30000);
139
+ return () => clearInterval(orderbookInterval);
140
+ }, [selectedTicker, fetchOrderbook]);
22
141
  return {
23
- config,
24
- marketApi,
25
- portfolioApi,
26
- ordersApi,
27
- isConfigured: config !== null,
28
- configError,
142
+ markets,
143
+ orderbook,
144
+ balance,
145
+ positions,
146
+ isConnected,
147
+ error,
148
+ selectMarket,
29
149
  };
30
150
  }
31
151
  //# 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,32 @@
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
+ */
8
+ export declare function formatExpiry(closeTime?: string): string;
9
+ /**
10
+ * Get price change indicator and color
11
+ */
12
+ export declare function getPriceChange(current?: number, previous?: number): {
13
+ text: string;
14
+ color: string;
15
+ };
16
+ /**
17
+ * Format volume with K/M suffix
18
+ */
19
+ export declare function formatVolume(volume?: number): string;
20
+ /**
21
+ * Format price in cents
22
+ */
23
+ export declare function formatPrice(cents?: number): string;
24
+ /**
25
+ * Format price with decimals
26
+ */
27
+ export declare function formatPriceDecimal(cents: number): string;
28
+ /**
29
+ * Calculate spread from best bid and ask
30
+ */
31
+ export declare function calculateSpread(bestBid: number | null, bestAsk: number | null): number | null;
32
+ //# 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;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBvD;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,74 @@
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
+ */
8
+ export function formatExpiry(closeTime) {
9
+ if (!closeTime)
10
+ return '';
11
+ const now = new Date();
12
+ const close = new Date(closeTime);
13
+ const diffMs = close.getTime() - now.getTime();
14
+ if (diffMs <= 0)
15
+ return 'CLOSED';
16
+ const diffMins = Math.floor(diffMs / (1000 * 60));
17
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
18
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
19
+ if (diffDays > 0) {
20
+ const remainingHours = diffHours % 24;
21
+ return `${diffDays}d ${remainingHours}h`;
22
+ }
23
+ if (diffHours > 0) {
24
+ const remainingMins = diffMins % 60;
25
+ return `${diffHours}h ${remainingMins}m`;
26
+ }
27
+ return `${diffMins}m`;
28
+ }
29
+ /**
30
+ * Get price change indicator and color
31
+ */
32
+ export function getPriceChange(current, previous) {
33
+ if (current === undefined || previous === undefined || current === previous) {
34
+ return { text: '━', color: 'gray' };
35
+ }
36
+ const diff = current - previous;
37
+ if (diff > 0) {
38
+ return { text: '▲', color: 'green' };
39
+ }
40
+ return { text: '▼', color: 'red' };
41
+ }
42
+ /**
43
+ * Format volume with K/M suffix
44
+ */
45
+ export function formatVolume(volume) {
46
+ if (!volume)
47
+ return '';
48
+ if (volume >= 1000000)
49
+ return `${(volume / 1000000).toFixed(1)}M`;
50
+ if (volume >= 1000)
51
+ return `${(volume / 1000).toFixed(1)}K`;
52
+ return `${volume}`;
53
+ }
54
+ /**
55
+ * Format price in cents
56
+ */
57
+ export function formatPrice(cents) {
58
+ return cents !== undefined ? `${cents}¢` : '—';
59
+ }
60
+ /**
61
+ * Format price with decimals
62
+ */
63
+ export function formatPriceDecimal(cents) {
64
+ return `${cents.toFixed(2)}¢`;
65
+ }
66
+ /**
67
+ * Calculate spread from best bid and ask
68
+ */
69
+ export function calculateSpread(bestBid, bestAsk) {
70
+ if (bestBid === null || bestAsk === null)
71
+ return null;
72
+ return bestAsk - bestBid;
73
+ }
74
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAE/C,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,SAAS,GAAG,EAAE,CAAC;QACtC,OAAO,GAAG,QAAQ,KAAK,cAAc,GAAG,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,QAAQ,GAAG,EAAE,CAAC;QACpC,OAAO,GAAG,SAAS,KAAK,aAAa,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,QAAiB;IAChE,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,MAAM,IAAI,OAAO;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClE,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,OAAO,GAAG,MAAM,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB,EAAE,OAAsB;IAC5E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,OAAO,GAAG,OAAO,CAAC;AAC3B,CAAC"}
@@ -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,101 @@
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 > 24h away', () => {
20
+ expect(formatExpiry('2025-01-03T12:00:00Z')).toBe('2d 0h');
21
+ expect(formatExpiry('2025-01-04T02:00:00Z')).toBe('2d 14h');
22
+ });
23
+ it('formats hours and minutes for dates < 24h away', () => {
24
+ expect(formatExpiry('2025-01-01T15:30:00Z')).toBe('3h 30m');
25
+ expect(formatExpiry('2025-01-01T14:00:00Z')).toBe('2h 0m');
26
+ });
27
+ it('formats minutes only for dates < 1h away', () => {
28
+ expect(formatExpiry('2025-01-01T12:45:00Z')).toBe('45m');
29
+ expect(formatExpiry('2025-01-01T12:05:00Z')).toBe('5m');
30
+ });
31
+ });
32
+ describe('getPriceChange', () => {
33
+ it('returns gray dash for undefined values', () => {
34
+ expect(getPriceChange(undefined, undefined)).toEqual({ text: '━', color: 'gray' });
35
+ expect(getPriceChange(50, undefined)).toEqual({ text: '━', color: 'gray' });
36
+ expect(getPriceChange(undefined, 50)).toEqual({ text: '━', color: 'gray' });
37
+ });
38
+ it('returns gray dash for equal values', () => {
39
+ expect(getPriceChange(50, 50)).toEqual({ text: '━', color: 'gray' });
40
+ expect(getPriceChange(0, 0)).toEqual({ text: '━', color: 'gray' });
41
+ });
42
+ it('returns green up arrow for price increase', () => {
43
+ expect(getPriceChange(55, 50)).toEqual({ text: '▲', color: 'green' });
44
+ expect(getPriceChange(100, 1)).toEqual({ text: '▲', color: 'green' });
45
+ });
46
+ it('returns red down arrow for price decrease', () => {
47
+ expect(getPriceChange(45, 50)).toEqual({ text: '▼', color: 'red' });
48
+ expect(getPriceChange(1, 100)).toEqual({ text: '▼', color: 'red' });
49
+ });
50
+ });
51
+ describe('formatVolume', () => {
52
+ it('returns empty string for undefined/zero', () => {
53
+ expect(formatVolume(undefined)).toBe('');
54
+ expect(formatVolume(0)).toBe('');
55
+ });
56
+ it('formats millions with M suffix', () => {
57
+ expect(formatVolume(1500000)).toBe('1.5M');
58
+ expect(formatVolume(10000000)).toBe('10.0M');
59
+ });
60
+ it('formats thousands with K suffix', () => {
61
+ expect(formatVolume(1500)).toBe('1.5K');
62
+ expect(formatVolume(50000)).toBe('50.0K');
63
+ });
64
+ it('leaves small numbers as-is', () => {
65
+ expect(formatVolume(500)).toBe('500');
66
+ expect(formatVolume(42)).toBe('42');
67
+ });
68
+ });
69
+ describe('formatPrice', () => {
70
+ it('formats cents with cent symbol', () => {
71
+ expect(formatPrice(45)).toBe('45¢');
72
+ expect(formatPrice(99)).toBe('99¢');
73
+ expect(formatPrice(0)).toBe('0¢');
74
+ });
75
+ it('returns dash for undefined', () => {
76
+ expect(formatPrice(undefined)).toBe('—');
77
+ });
78
+ });
79
+ describe('formatPriceDecimal', () => {
80
+ it('formats price with two decimal places', () => {
81
+ expect(formatPriceDecimal(45)).toBe('45.00¢');
82
+ expect(formatPriceDecimal(99.5)).toBe('99.50¢');
83
+ expect(formatPriceDecimal(0.01)).toBe('0.01¢');
84
+ });
85
+ });
86
+ describe('calculateSpread', () => {
87
+ it('returns null if either value is null', () => {
88
+ expect(calculateSpread(null, null)).toBeNull();
89
+ expect(calculateSpread(50, null)).toBeNull();
90
+ expect(calculateSpread(null, 55)).toBeNull();
91
+ });
92
+ it('calculates spread correctly', () => {
93
+ expect(calculateSpread(50, 55)).toBe(5);
94
+ expect(calculateSpread(45, 47)).toBe(2);
95
+ expect(calculateSpread(99, 100)).toBe(1);
96
+ });
97
+ it('handles zero spread', () => {
98
+ expect(calculateSpread(50, 50)).toBe(0);
99
+ });
100
+ });
101
+ //# 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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"}