@newyorkcompute/kalshi-tui 0.6.0 → 0.7.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/dist/App.d.ts +0 -2
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +38 -12
- package/dist/App.js.map +1 -1
- package/dist/components/Footer.js +1 -1
- package/dist/components/Footer.js.map +1 -1
- package/dist/components/Markets.d.ts +3 -2
- package/dist/components/Markets.d.ts.map +1 -1
- package/dist/components/Markets.js +3 -2
- package/dist/components/Markets.js.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +126 -0
- package/dist/config.test.js.map +1 -0
- package/package.json +1 -1
package/dist/App.d.ts
CHANGED
|
@@ -2,7 +2,5 @@
|
|
|
2
2
|
* Kalshi TUI - Main Application
|
|
3
3
|
* Clean, minimal, beautiful terminal trading
|
|
4
4
|
*/
|
|
5
|
-
/** Available sort options for markets list */
|
|
6
|
-
export type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
|
|
7
5
|
export declare function App(): import("react/jsx-runtime").JSX.Element;
|
|
8
6
|
//# sourceMappingURL=App.d.ts.map
|
package/dist/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,wBAAgB,GAAG,4CA4LlB"}
|
package/dist/App.js
CHANGED
|
@@ -4,8 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
* Clean, minimal, beautiful terminal trading
|
|
5
5
|
*/
|
|
6
6
|
import { Box, useApp, useInput, useStdout } from 'ink';
|
|
7
|
-
import { useState, useEffect, useMemo } from 'react';
|
|
8
|
-
const SORT_OPTIONS = ['volume', 'volume_24h', 'open_interest', 'price'];
|
|
7
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
9
8
|
import { Header } from './components/Header.js';
|
|
10
9
|
import { Markets } from './components/Markets.js';
|
|
11
10
|
import { Orderbook } from './components/Orderbook.js';
|
|
@@ -14,20 +13,32 @@ import { Arbitrage } from './components/Arbitrage.js';
|
|
|
14
13
|
import { Footer } from './components/Footer.js';
|
|
15
14
|
import { PriceChart } from './components/PriceChart.js';
|
|
16
15
|
import { useKalshi } from './hooks/useKalshi.js';
|
|
16
|
+
import { loadConfig, saveConfig, toggleFavorite } from './config.js';
|
|
17
|
+
const SORT_OPTIONS = ['volume', 'volume_24h', 'open_interest', 'price'];
|
|
17
18
|
export function App() {
|
|
18
19
|
const { exit } = useApp();
|
|
19
20
|
const { stdout } = useStdout();
|
|
20
21
|
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
21
|
-
|
|
22
|
+
// Load config from disk on startup
|
|
23
|
+
const [config, setConfig] = useState(() => loadConfig());
|
|
24
|
+
// Save config whenever it changes
|
|
25
|
+
const updateConfig = useCallback((updates) => {
|
|
26
|
+
setConfig(prev => {
|
|
27
|
+
const newConfig = { ...prev, ...updates };
|
|
28
|
+
saveConfig(newConfig);
|
|
29
|
+
return newConfig;
|
|
30
|
+
});
|
|
31
|
+
}, []);
|
|
22
32
|
// Get terminal dimensions
|
|
23
33
|
const width = stdout?.columns ?? 120;
|
|
24
34
|
const height = stdout?.rows ?? 40;
|
|
25
35
|
// Fetch data from Kalshi
|
|
26
36
|
const { markets: rawMarkets, orderbook, balance, positions, isConnected, isRateLimited, isOffline, isRealtime, error, selectMarket, priceHistory, loading, lastUpdateTime, arbitrage, } = useKalshi();
|
|
27
|
-
// Sort markets based on selected option
|
|
37
|
+
// Sort markets based on selected option, with favorites first
|
|
28
38
|
const markets = useMemo(() => {
|
|
29
39
|
const sorted = [...rawMarkets];
|
|
30
|
-
|
|
40
|
+
// First sort by the selected option
|
|
41
|
+
switch (config.sortBy) {
|
|
31
42
|
case 'volume':
|
|
32
43
|
sorted.sort((a, b) => (b.volume || 0) - (a.volume || 0));
|
|
33
44
|
break;
|
|
@@ -41,8 +52,16 @@ export function App() {
|
|
|
41
52
|
sorted.sort((a, b) => (b.yes_bid || 0) - (a.yes_bid || 0));
|
|
42
53
|
break;
|
|
43
54
|
}
|
|
55
|
+
// Then put favorites at top if enabled
|
|
56
|
+
if (config.favoritesFirst && config.favorites.length > 0) {
|
|
57
|
+
sorted.sort((a, b) => {
|
|
58
|
+
const aFav = config.favorites.includes(a.ticker) ? 1 : 0;
|
|
59
|
+
const bFav = config.favorites.includes(b.ticker) ? 1 : 0;
|
|
60
|
+
return bFav - aFav; // Favorites first
|
|
61
|
+
});
|
|
62
|
+
}
|
|
44
63
|
return sorted;
|
|
45
|
-
}, [rawMarkets,
|
|
64
|
+
}, [rawMarkets, config.sortBy, config.favorites, config.favoritesFirst]);
|
|
46
65
|
// Update orderbook when selection changes
|
|
47
66
|
useEffect(() => {
|
|
48
67
|
const ticker = markets[selectedIndex]?.ticker;
|
|
@@ -57,14 +76,21 @@ export function App() {
|
|
|
57
76
|
}
|
|
58
77
|
// Cycle sort option with 's' key
|
|
59
78
|
if (input === 's') {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return SORT_OPTIONS[nextIndex];
|
|
64
|
-
});
|
|
79
|
+
const currentIndex = SORT_OPTIONS.indexOf(config.sortBy);
|
|
80
|
+
const nextIndex = (currentIndex + 1) % SORT_OPTIONS.length;
|
|
81
|
+
updateConfig({ sortBy: SORT_OPTIONS[nextIndex] });
|
|
65
82
|
// Reset selection to top when sort changes
|
|
66
83
|
setSelectedIndex(0);
|
|
67
84
|
}
|
|
85
|
+
// Toggle favorite with 'f' key
|
|
86
|
+
if (input === 'f') {
|
|
87
|
+
const selectedTicker = markets[selectedIndex]?.ticker;
|
|
88
|
+
if (selectedTicker) {
|
|
89
|
+
updateConfig({
|
|
90
|
+
favorites: toggleFavorite(config.favorites, selectedTicker)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
68
94
|
if (key.upArrow) {
|
|
69
95
|
setSelectedIndex(i => Math.max(0, i - 1));
|
|
70
96
|
}
|
|
@@ -85,6 +111,6 @@ export function App() {
|
|
|
85
111
|
const chartHeight = contentHeight - orderbookHeight;
|
|
86
112
|
// Get selected market for orderbook/chart
|
|
87
113
|
const selectedMarket = markets[selectedIndex] ?? null;
|
|
88
|
-
return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Header, { balance: balance, isConnected: isConnected, isRateLimited: isRateLimited, isOffline: isOffline, isRealtime: isRealtime, error: error, lastUpdateTime: lastUpdateTime }), _jsxs(Box, { flexDirection: "row", height: contentHeight, children: [_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [_jsx(Markets, { markets: markets, selectedIndex: selectedIndex, height: marketsHeight, isLoading: loading.markets, sortBy:
|
|
114
|
+
return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Header, { balance: balance, isConnected: isConnected, isRateLimited: isRateLimited, isOffline: isOffline, isRealtime: isRealtime, error: error, lastUpdateTime: lastUpdateTime }), _jsxs(Box, { flexDirection: "row", height: contentHeight, children: [_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [_jsx(Markets, { markets: markets, selectedIndex: selectedIndex, height: marketsHeight, isLoading: loading.markets, sortBy: config.sortBy, favorites: config.favorites }), _jsx(Arbitrage, { opportunities: arbitrage, height: arbitrageHeight, isLoading: loading.markets }), _jsx(Positions, { positions: positions, height: positionsHeight, isLoading: loading.portfolio })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Orderbook, { market: selectedMarket, orderbook: orderbook, height: orderbookHeight, isLoading: loading.orderbook }), _jsx(PriceChart, { ticker: selectedMarket?.ticker ?? null, priceHistory: priceHistory, height: chartHeight, width: rightWidth })] })] }), _jsx(Footer, {})] }));
|
|
89
115
|
}
|
|
90
116
|
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
*/
|
|
6
6
|
import { Box, Text } from 'ink';
|
|
7
7
|
export function Footer() {
|
|
8
|
-
return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Text, { children: ["Built by ", _jsx(Text, { bold: true, children: "New York Compute" }), " \u2022 ", _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsx(Text, { color: "gray", children: "[\u2191\u2193] Navigate [s] Sort [q] Quit" })] }));
|
|
8
|
+
return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", borderStyle: "single", borderColor: "gray", paddingX: 1, height: 3, width: "100%", children: [_jsxs(Text, { children: ["Built by ", _jsx(Text, { bold: true, children: "New York Compute" }), " \u2022 ", _jsx(Text, { color: "green", children: "newyorkcompute.xyz" })] }), _jsx(Text, { color: "gray", children: "[\u2191\u2193] Navigate [s] Sort [f] Favorite [q] Quit" })] }));
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=Footer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAEZ,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,uCAAwB,cAAG,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACtF,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,EACT,KAAK,EAAC,MAAM,aAEZ,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,uCAAwB,cAAG,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,mCAA0B,IACtF,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uEAAoD,IAClE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Markets Component
|
|
3
3
|
* Displays a scrollable list of markets with selection
|
|
4
4
|
*/
|
|
5
|
+
import type { SortOption } from '../config.js';
|
|
5
6
|
interface Market {
|
|
6
7
|
ticker: string;
|
|
7
8
|
title: string;
|
|
@@ -13,14 +14,14 @@ interface Market {
|
|
|
13
14
|
close_time?: string;
|
|
14
15
|
previousYesBid?: number;
|
|
15
16
|
}
|
|
16
|
-
type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
|
|
17
17
|
interface MarketsProps {
|
|
18
18
|
markets: Market[];
|
|
19
19
|
selectedIndex: number;
|
|
20
20
|
height: number;
|
|
21
21
|
isLoading?: boolean;
|
|
22
22
|
sortBy?: SortOption;
|
|
23
|
+
favorites?: string[];
|
|
23
24
|
}
|
|
24
|
-
export declare function Markets({ markets, selectedIndex, height, isLoading, sortBy }: MarketsProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export declare function Markets({ markets, selectedIndex, height, isLoading, sortBy, favorites }: MarketsProps): import("react/jsx-runtime").JSX.Element;
|
|
25
26
|
export {};
|
|
26
27
|
//# sourceMappingURL=Markets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markets.d.ts","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"Markets.d.ts","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAiB,EAAE,SAAc,EAAE,EAAE,YAAY,2CAqGrH"}
|
|
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
import { Box, Text } from 'ink';
|
|
7
7
|
import { formatExpiry, getPriceChange, formatPrice, formatVolume } from '../utils.js';
|
|
8
8
|
import { Spinner } from './Spinner.js';
|
|
9
|
-
export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'volume' }) {
|
|
9
|
+
export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'volume', favorites = [] }) {
|
|
10
10
|
// Calculate visible window (scroll with selection)
|
|
11
11
|
const visibleRows = height - 4; // Border + title + padding
|
|
12
12
|
const halfWindow = Math.floor(visibleRows / 2);
|
|
@@ -17,9 +17,10 @@ export function Markets({ markets, selectedIndex, height, isLoading, sortBy = 'v
|
|
|
17
17
|
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "green", height: height, width: "100%", children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { color: "green", bold: true, children: " MARKETS " }), _jsxs(Box, { children: [_jsx(Text, { color: sortBy === 'volume' ? 'cyan' : 'gray', bold: sortBy === 'volume', dimColor: sortBy !== 'volume', children: ' Vol' }), _jsx(Text, { color: sortBy === 'volume_24h' ? 'yellow' : 'gray', bold: sortBy === 'volume_24h', dimColor: sortBy !== 'volume_24h', children: ' 24h' }), _jsx(Text, { color: sortBy === 'open_interest' ? 'magenta' : 'gray', bold: sortBy === 'open_interest', dimColor: sortBy !== 'open_interest', children: ' OI' }), _jsx(Text, { color: "gray", dimColor: true, children: ' Exp' }), _jsx(Text, { color: sortBy === 'price' ? 'green' : 'gray', bold: sortBy === 'price', dimColor: sortBy !== 'price', children: ' Price' })] })] }), _jsx(Box, { flexDirection: "column", paddingX: 1, flexGrow: 1, children: markets.length === 0 && isLoading ? (_jsx(Spinner, { label: "Loading markets..." })) : markets.length === 0 ? (_jsx(Text, { color: "gray", children: "No markets found" })) : (visibleMarkets.map((market, i) => {
|
|
18
18
|
const actualIndex = startIndex + i;
|
|
19
19
|
const isSelected = actualIndex === selectedIndex;
|
|
20
|
+
const isFavorite = favorites.includes(market.ticker);
|
|
20
21
|
const priceChange = getPriceChange(market.yes_bid, market.previousYesBid);
|
|
21
22
|
const expiry = formatExpiry(market.close_time);
|
|
22
|
-
return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'gray', children: isSelected ? '▶ ' : '
|
|
23
|
+
return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'gray', children: isSelected ? '▶' : ' ' }), _jsx(Text, { color: "yellow", children: isFavorite ? '★' : ' ' }), _jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: market.ticker.slice(0, 21) })] }), _jsxs(Box, { children: [_jsx(Text, { color: "cyan", dimColor: true, children: formatVolume(market.volume).padStart(6) }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', formatVolume(market.volume_24h).padStart(5)] }), _jsxs(Text, { color: "magenta", dimColor: true, children: [' ', formatVolume(market.open_interest).padStart(5)] }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', (expiry || '').padStart(6)] }), _jsxs(Text, { color: isSelected ? 'green' : 'white', children: [' ', formatPrice(market.yes_bid).padStart(4)] }), _jsxs(Text, { color: priceChange.color, children: [" ", priceChange.text] })] })] }, market.ticker));
|
|
23
24
|
})) }), markets.length > 0 && (_jsx(Box, { justifyContent: "center", paddingX: 1, children: _jsxs(Text, { color: "gray", children: [selectedIndex + 1, " of ", markets.length] }) }))] }));
|
|
24
25
|
}
|
|
25
26
|
//# sourceMappingURL=Markets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markets.js","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAyBvC,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAgB;
|
|
1
|
+
{"version":3,"file":"Markets.js","sourceRoot":"","sources":["../../src/components/Markets.tsx"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI Configuration
|
|
3
|
+
*
|
|
4
|
+
* Handles reading/writing user preferences to ~/.kalshi-tui/config.json
|
|
5
|
+
*/
|
|
6
|
+
/** Sort options for markets list */
|
|
7
|
+
export type SortOption = 'volume' | 'volume_24h' | 'open_interest' | 'price';
|
|
8
|
+
/** User configuration schema */
|
|
9
|
+
export interface TuiConfig {
|
|
10
|
+
/** Current sort preference */
|
|
11
|
+
sortBy: SortOption;
|
|
12
|
+
/** List of favorited market tickers */
|
|
13
|
+
favorites: string[];
|
|
14
|
+
/** Refresh interval in milliseconds */
|
|
15
|
+
refreshInterval: number;
|
|
16
|
+
/** Show favorites at top of list */
|
|
17
|
+
favoritesFirst: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load configuration from disk
|
|
21
|
+
* Returns default config if file doesn't exist
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadConfig(): TuiConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Save configuration to disk
|
|
26
|
+
* Creates config directory if it doesn't exist
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveConfig(config: TuiConfig): void;
|
|
29
|
+
/**
|
|
30
|
+
* Toggle a market in favorites
|
|
31
|
+
* Returns the updated favorites list
|
|
32
|
+
*/
|
|
33
|
+
export declare function toggleFavorite(favorites: string[], ticker: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Check if a market is favorited
|
|
36
|
+
*/
|
|
37
|
+
export declare function isFavorite(favorites: string[], ticker: string): boolean;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,oCAAoC;AACpC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAE7E,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAgBD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAkBtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAWlD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI Configuration
|
|
3
|
+
*
|
|
4
|
+
* Handles reading/writing user preferences to ~/.kalshi-tui/config.json
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
/** Default configuration */
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
sortBy: 'volume',
|
|
12
|
+
favorites: [],
|
|
13
|
+
refreshInterval: 10000,
|
|
14
|
+
favoritesFirst: true,
|
|
15
|
+
};
|
|
16
|
+
/** Config directory path */
|
|
17
|
+
const CONFIG_DIR = join(homedir(), '.kalshi-tui');
|
|
18
|
+
/** Config file path */
|
|
19
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
20
|
+
/**
|
|
21
|
+
* Load configuration from disk
|
|
22
|
+
* Returns default config if file doesn't exist
|
|
23
|
+
*/
|
|
24
|
+
export function loadConfig() {
|
|
25
|
+
try {
|
|
26
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
27
|
+
return { ...DEFAULT_CONFIG };
|
|
28
|
+
}
|
|
29
|
+
const data = readFileSync(CONFIG_FILE, 'utf-8');
|
|
30
|
+
const parsed = JSON.parse(data);
|
|
31
|
+
// Merge with defaults to handle missing fields
|
|
32
|
+
return {
|
|
33
|
+
...DEFAULT_CONFIG,
|
|
34
|
+
...parsed,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Return defaults on any error
|
|
39
|
+
return { ...DEFAULT_CONFIG };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Save configuration to disk
|
|
44
|
+
* Creates config directory if it doesn't exist
|
|
45
|
+
*/
|
|
46
|
+
export function saveConfig(config) {
|
|
47
|
+
try {
|
|
48
|
+
// Ensure directory exists
|
|
49
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
50
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Silently fail - config is not critical
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Toggle a market in favorites
|
|
60
|
+
* Returns the updated favorites list
|
|
61
|
+
*/
|
|
62
|
+
export function toggleFavorite(favorites, ticker) {
|
|
63
|
+
if (favorites.includes(ticker)) {
|
|
64
|
+
return favorites.filter(t => t !== ticker);
|
|
65
|
+
}
|
|
66
|
+
return [...favorites, ticker];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a market is favorited
|
|
70
|
+
*/
|
|
71
|
+
export function isFavorite(favorites, ticker) {
|
|
72
|
+
return favorites.includes(ticker);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAiB5B,4BAA4B;AAC5B,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEF,4BAA4B;AAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAElD,uBAAuB;AACvB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,+CAA+C;QAC/C,OAAO;YACL,GAAG,cAAc;YACjB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;QAC/B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,IAAI,CAAC;QACH,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAmB,EAAE,MAAc;IAChE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAmB,EAAE,MAAc;IAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { loadConfig, saveConfig, toggleFavorite, isFavorite } from './config.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
vi.mock('fs');
|
|
5
|
+
vi.mock('os', () => ({
|
|
6
|
+
homedir: () => '/home/testuser',
|
|
7
|
+
}));
|
|
8
|
+
describe('config', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
vi.restoreAllMocks();
|
|
14
|
+
});
|
|
15
|
+
describe('loadConfig', () => {
|
|
16
|
+
it('should return default config when file does not exist', () => {
|
|
17
|
+
vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
expect(config.sortBy).toBe('volume');
|
|
20
|
+
expect(config.favorites).toEqual([]);
|
|
21
|
+
expect(config.refreshInterval).toBe(10000);
|
|
22
|
+
expect(config.favoritesFirst).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('should load config from file when it exists', () => {
|
|
25
|
+
const savedConfig = {
|
|
26
|
+
sortBy: 'price',
|
|
27
|
+
favorites: ['KXBTC-123'],
|
|
28
|
+
refreshInterval: 5000,
|
|
29
|
+
favoritesFirst: false,
|
|
30
|
+
};
|
|
31
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
32
|
+
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(savedConfig));
|
|
33
|
+
const config = loadConfig();
|
|
34
|
+
expect(config.sortBy).toBe('price');
|
|
35
|
+
expect(config.favorites).toEqual(['KXBTC-123']);
|
|
36
|
+
expect(config.refreshInterval).toBe(5000);
|
|
37
|
+
expect(config.favoritesFirst).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
it('should merge with defaults for missing fields', () => {
|
|
40
|
+
const partialConfig = {
|
|
41
|
+
sortBy: 'volume_24h',
|
|
42
|
+
};
|
|
43
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
44
|
+
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(partialConfig));
|
|
45
|
+
const config = loadConfig();
|
|
46
|
+
expect(config.sortBy).toBe('volume_24h');
|
|
47
|
+
expect(config.favorites).toEqual([]); // Default
|
|
48
|
+
expect(config.refreshInterval).toBe(10000); // Default
|
|
49
|
+
});
|
|
50
|
+
it('should return defaults on parse error', () => {
|
|
51
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
52
|
+
vi.mocked(fs.readFileSync).mockReturnValue('invalid json');
|
|
53
|
+
const config = loadConfig();
|
|
54
|
+
expect(config.sortBy).toBe('volume');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('saveConfig', () => {
|
|
58
|
+
it('should create directory if it does not exist', () => {
|
|
59
|
+
vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
60
|
+
vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
|
|
61
|
+
vi.mocked(fs.writeFileSync).mockReturnValue(undefined);
|
|
62
|
+
const config = {
|
|
63
|
+
sortBy: 'price',
|
|
64
|
+
favorites: ['KXBTC'],
|
|
65
|
+
refreshInterval: 10000,
|
|
66
|
+
favoritesFirst: true,
|
|
67
|
+
};
|
|
68
|
+
saveConfig(config);
|
|
69
|
+
expect(fs.mkdirSync).toHaveBeenCalledWith('/home/testuser/.kalshi-tui', { recursive: true });
|
|
70
|
+
});
|
|
71
|
+
it('should write config to file', () => {
|
|
72
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
73
|
+
vi.mocked(fs.writeFileSync).mockReturnValue(undefined);
|
|
74
|
+
const config = {
|
|
75
|
+
sortBy: 'open_interest',
|
|
76
|
+
favorites: ['KXBTC', 'KXINX'],
|
|
77
|
+
refreshInterval: 5000,
|
|
78
|
+
favoritesFirst: false,
|
|
79
|
+
};
|
|
80
|
+
saveConfig(config);
|
|
81
|
+
expect(fs.writeFileSync).toHaveBeenCalledWith('/home/testuser/.kalshi-tui/config.json', expect.stringContaining('"sortBy": "open_interest"'), 'utf-8');
|
|
82
|
+
});
|
|
83
|
+
it('should silently fail on write error', () => {
|
|
84
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
85
|
+
vi.mocked(fs.writeFileSync).mockImplementation(() => {
|
|
86
|
+
throw new Error('Permission denied');
|
|
87
|
+
});
|
|
88
|
+
// Should not throw
|
|
89
|
+
expect(() => saveConfig({
|
|
90
|
+
sortBy: 'volume',
|
|
91
|
+
favorites: [],
|
|
92
|
+
refreshInterval: 10000,
|
|
93
|
+
favoritesFirst: true,
|
|
94
|
+
})).not.toThrow();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('toggleFavorite', () => {
|
|
98
|
+
it('should add ticker to favorites if not present', () => {
|
|
99
|
+
const favorites = ['KXBTC'];
|
|
100
|
+
const result = toggleFavorite(favorites, 'KXINX');
|
|
101
|
+
expect(result).toEqual(['KXBTC', 'KXINX']);
|
|
102
|
+
});
|
|
103
|
+
it('should remove ticker from favorites if present', () => {
|
|
104
|
+
const favorites = ['KXBTC', 'KXINX'];
|
|
105
|
+
const result = toggleFavorite(favorites, 'KXBTC');
|
|
106
|
+
expect(result).toEqual(['KXINX']);
|
|
107
|
+
});
|
|
108
|
+
it('should not mutate original array', () => {
|
|
109
|
+
const favorites = ['KXBTC'];
|
|
110
|
+
toggleFavorite(favorites, 'KXINX');
|
|
111
|
+
expect(favorites).toEqual(['KXBTC']);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('isFavorite', () => {
|
|
115
|
+
it('should return true if ticker is in favorites', () => {
|
|
116
|
+
expect(isFavorite(['KXBTC', 'KXINX'], 'KXBTC')).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
it('should return false if ticker is not in favorites', () => {
|
|
119
|
+
expect(isFavorite(['KXBTC'], 'KXINX')).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
it('should return false for empty favorites', () => {
|
|
122
|
+
expect(isFavorite([], 'KXBTC')).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AACjG,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB;CAChC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEhD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,WAAW,GAAG;gBAClB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,WAAW,CAAC;gBACxB,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;aACtB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YAExE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,aAAa,GAAG;gBACpB,MAAM,EAAE,YAAY;aACrB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;YAE1E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;YAChD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACnD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAc;gBACxB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,OAAO,CAAC;gBACpB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;aACrB,CAAC;YAEF,UAAU,CAAC,MAAM,CAAC,CAAC;YAEnB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACvC,4BAA4B,EAC5B,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAc;gBACxB,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC7B,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;aACtB,CAAC;YAEF,UAAU,CAAC,MAAM,CAAC,CAAC;YAEnB,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAC3C,wCAAwC,EACxC,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,EACpD,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC;gBACtB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,EAAE;gBACb,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEnC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED