use-upbit-api
Advanced tools
Comparing version 2.0.0 to 2.0.1
@@ -1,2 +0,2 @@ | ||
import { IOrderbook, ImarketCodes } from '../interfaces'; | ||
import { IOrderbook, ImarketCodes, OBOptionsInterface } from '../interfaces'; | ||
/** | ||
@@ -10,6 +10,3 @@ * useWsOrderbook is a custom hook that connects to a WebSocket API | ||
*/ | ||
declare function useWsOrderbook(targetMarketCodes: ImarketCodes[], options?: { | ||
throttle_time: number; | ||
debug: boolean; | ||
}): { | ||
declare function useWsOrderbook(targetMarketCodes: ImarketCodes, onError?: (error: Error) => void, options?: OBOptionsInterface): { | ||
socket: WebSocket | null; | ||
@@ -16,0 +13,0 @@ isConnected: boolean; |
@@ -10,2 +10,4 @@ "use strict"; | ||
const socketDataEncoder_1 = __importDefault(require("../functions/socketDataEncoder")); | ||
const isImarketCodes_1 = __importDefault(require("../functions/isImarketCodes")); | ||
// extend extend OptionsInterface | ||
/** | ||
@@ -19,5 +21,5 @@ * useWsOrderbook is a custom hook that connects to a WebSocket API | ||
*/ | ||
function useWsOrderbook(targetMarketCodes, options = { throttle_time: 400, debug: false }) { | ||
function useWsOrderbook(targetMarketCodes, onError, options = {}) { | ||
const { throttle_time = 400, debug = false } = options; | ||
const SOCKET_URL = 'wss://api.upbit.com/websocket/v1'; | ||
const { throttle_time } = options; | ||
const socket = (0, react_1.useRef)(null); | ||
@@ -29,3 +31,3 @@ const buffer = (0, react_1.useRef)([]); | ||
try { | ||
const lastBuffers = (0, getLastBuffers_1.default)(buffer.current, targetMarketCodes.length); | ||
const lastBuffers = (0, getLastBuffers_1.default)(buffer.current, [targetMarketCodes].length); | ||
lastBuffers && setSocketData(lastBuffers[0]); | ||
@@ -35,3 +37,3 @@ buffer.current = []; | ||
catch (error) { | ||
throw new Error(); | ||
console.error(error); | ||
} | ||
@@ -42,6 +44,6 @@ }, throttle_time), [targetMarketCodes]); | ||
try { | ||
if (targetMarketCodes.length > 1) { | ||
throw new Error("[Error] | 'Length' of Target Market Codes should be only 'one' in 'orderbook' and 'trade'. you can request only 1 marketcode's data, when you want to get 'orderbook' or 'trade' data."); | ||
if (!(0, isImarketCodes_1.default)(targetMarketCodes)) { | ||
throw new Error('targetMarketCodes does not have the correct interface'); | ||
} | ||
if (targetMarketCodes.length > 0 && !socket.current) { | ||
if ([targetMarketCodes].length > 0 && !socket.current) { | ||
socket.current = new WebSocket(SOCKET_URL); | ||
@@ -52,3 +54,3 @@ socket.current.binaryType = 'arraybuffer'; | ||
setIsConnected(true); | ||
if (options.debug) | ||
if (debug) | ||
console.log('[completed connect] | socket Open Type: ', 'orderbook'); | ||
@@ -60,7 +62,7 @@ if (((_a = socket.current) === null || _a === void 0 ? void 0 : _a.readyState) == 1) { | ||
type: 'orderbook', | ||
codes: targetMarketCodes.map(code => code.market), | ||
codes: [targetMarketCodes.market], | ||
}, | ||
]; | ||
socket.current.send(JSON.stringify(sendContent)); | ||
if (options.debug) | ||
if (debug) | ||
console.log('message sending done'); | ||
@@ -73,3 +75,3 @@ } | ||
buffer.current = []; | ||
if (options.debug) | ||
if (debug) | ||
console.log('connection closed'); | ||
@@ -79,3 +81,3 @@ }; | ||
const error = event.error; | ||
if (options.debug) | ||
if (debug) | ||
console.error('[Error]', error); | ||
@@ -103,3 +105,11 @@ }; | ||
catch (error) { | ||
throw new Error(); | ||
if (error instanceof Error) { | ||
if (onError) { | ||
onError(error); | ||
} | ||
else { | ||
console.error(error); | ||
throw error; | ||
} | ||
} | ||
} | ||
@@ -106,0 +116,0 @@ }, [targetMarketCodes]); |
@@ -1,2 +0,2 @@ | ||
import { ITicker, ImarketCodes } from '../interfaces'; | ||
import { ITicker, ImarketCodes, TKOptionsInterface } from '../interfaces'; | ||
/** | ||
@@ -10,6 +10,3 @@ * useWsTicker is a custom hook that connects to a WebSocket API | ||
*/ | ||
declare function useWsTicker(targetMarketCodes: ImarketCodes[], options?: { | ||
throttle_time: number; | ||
debug: boolean; | ||
}): { | ||
declare function useWsTicker(targetMarketCodes: ImarketCodes[], onError?: (error: Error) => void, options?: TKOptionsInterface): { | ||
socket: WebSocket | null; | ||
@@ -16,0 +13,0 @@ isConnected: boolean; |
@@ -12,2 +12,3 @@ "use strict"; | ||
const updateSocketData_1 = __importDefault(require("../functions/updateSocketData")); | ||
const isArrayOfImarketCodes_1 = __importDefault(require("../functions/isArrayOfImarketCodes")); | ||
/** | ||
@@ -21,5 +22,5 @@ * useWsTicker is a custom hook that connects to a WebSocket API | ||
*/ | ||
function useWsTicker(targetMarketCodes, options = { throttle_time: 400, debug: false }) { | ||
function useWsTicker(targetMarketCodes, onError, options = {}) { | ||
const { throttle_time = 400, debug = false } = options; | ||
const SOCKET_URL = 'wss://api.upbit.com/websocket/v1'; | ||
const { throttle_time } = options; | ||
const socket = (0, react_1.useRef)(null); | ||
@@ -45,2 +46,5 @@ const buffer = (0, react_1.useRef)([]); | ||
try { | ||
if (!(0, isArrayOfImarketCodes_1.default)(targetMarketCodes)) { | ||
throw new Error('targetMarketCodes does not have the correct interface'); | ||
} | ||
if (targetMarketCodes.length > 0 && !socket.current) { | ||
@@ -52,3 +56,3 @@ socket.current = new WebSocket(SOCKET_URL); | ||
setIsConnected(true); | ||
if (options.debug) | ||
if (debug) | ||
console.log('[completed connect] | socket Open Type: ', 'ticker'); | ||
@@ -64,3 +68,3 @@ if (((_a = socket.current) === null || _a === void 0 ? void 0 : _a.readyState) == 1) { | ||
socket.current.send(JSON.stringify(sendContent)); | ||
if (options.debug) | ||
if (debug) | ||
console.log('message sending done'); | ||
@@ -74,3 +78,3 @@ } | ||
buffer.current = []; | ||
if (options.debug) | ||
if (debug) | ||
console.log('connection closed'); | ||
@@ -104,3 +108,11 @@ }; | ||
catch (error) { | ||
throw new Error(); | ||
if (error instanceof Error) { | ||
if (onError) { | ||
onError(error); | ||
} | ||
else { | ||
console.error(error); | ||
throw error; | ||
} | ||
} | ||
} | ||
@@ -123,3 +135,3 @@ }, [targetMarketCodes]); | ||
catch (error) { | ||
console.log(error); | ||
console.error(error); | ||
} | ||
@@ -126,0 +138,0 @@ }, [loadingBuffer]); |
@@ -1,2 +0,2 @@ | ||
import { ITrade, ImarketCodes } from '../interfaces'; | ||
import { ITrade, ImarketCodes, TROptionsInterface } from '../interfaces'; | ||
/** | ||
@@ -11,7 +11,3 @@ * useWsTrade is a custom hook that connects to a WebSocket API | ||
*/ | ||
declare function useWsTrade(targetMarketCodes: ImarketCodes[], options?: { | ||
throttle_time: number; | ||
max_length_queue: number; | ||
debug: boolean; | ||
}): { | ||
declare function useWsTrade(targetMarketCodes: ImarketCodes, onError?: (error: Error) => void, options?: TROptionsInterface): { | ||
socket: WebSocket | null; | ||
@@ -18,0 +14,0 @@ isConnected: boolean; |
@@ -10,2 +10,3 @@ "use strict"; | ||
const socketDataEncoder_1 = __importDefault(require("../functions/socketDataEncoder")); | ||
const isImarketCodes_1 = __importDefault(require("../functions/isImarketCodes")); | ||
/** | ||
@@ -20,5 +21,5 @@ * useWsTrade is a custom hook that connects to a WebSocket API | ||
*/ | ||
function useWsTrade(targetMarketCodes, options = { throttle_time: 400, max_length_queue: 100, debug: false }) { | ||
function useWsTrade(targetMarketCodes, onError, options = {}) { | ||
const { throttle_time = 400, max_length_queue = 100, debug = false } = options; | ||
const SOCKET_URL = 'wss://api.upbit.com/websocket/v1'; | ||
const { throttle_time, max_length_queue } = options; | ||
const socket = (0, react_1.useRef)(null); | ||
@@ -35,3 +36,3 @@ const buffer = (0, react_1.useRef)([]); | ||
catch (error) { | ||
throw new Error(); | ||
console.error(error); | ||
} | ||
@@ -42,6 +43,6 @@ }, throttle_time), [targetMarketCodes]); | ||
try { | ||
if (targetMarketCodes.length > 1) { | ||
throw new Error("[Error] | 'Length' of Target Market Codes should be only 'one' in 'orderbook' and 'trade'. you can request only 1 marketcode's data, when you want to get 'orderbook' or 'trade' data."); | ||
if (!(0, isImarketCodes_1.default)(targetMarketCodes)) { | ||
throw new Error('targetMarketCodes does not have the correct interface'); | ||
} | ||
if (targetMarketCodes.length > 0 && !socket.current) { | ||
if ([targetMarketCodes].length > 0 && !socket.current) { | ||
socket.current = new WebSocket(SOCKET_URL); | ||
@@ -52,3 +53,3 @@ socket.current.binaryType = 'arraybuffer'; | ||
setIsConnected(true); | ||
if (options.debug) | ||
if (debug) | ||
console.log('[completed connect] | socket Open Type: ', 'trade'); | ||
@@ -60,7 +61,7 @@ if (((_a = socket.current) === null || _a === void 0 ? void 0 : _a.readyState) == 1) { | ||
type: 'trade', | ||
codes: targetMarketCodes.map(code => code.market), | ||
codes: [targetMarketCodes.market], | ||
}, | ||
]; | ||
socket.current.send(JSON.stringify(sendContent)); | ||
if (options.debug) | ||
if (debug) | ||
console.log('message sending done'); | ||
@@ -73,3 +74,3 @@ } | ||
buffer.current = []; | ||
if (options.debug) | ||
if (debug) | ||
console.log('connection closed'); | ||
@@ -101,3 +102,11 @@ }; | ||
catch (error) { | ||
throw new Error(); | ||
if (error instanceof Error) { | ||
if (onError) { | ||
onError(error); | ||
} | ||
else { | ||
console.error(error); | ||
throw error; | ||
} | ||
} | ||
} | ||
@@ -104,0 +113,0 @@ }, [targetMarketCodes]); |
@@ -93,1 +93,14 @@ export interface ImarketCodes { | ||
} | ||
export interface OptionsInterface { | ||
debug?: boolean; | ||
} | ||
export interface OBOptionsInterface extends OptionsInterface { | ||
throttle_time?: number; | ||
} | ||
export interface TKOptionsInterface extends OptionsInterface { | ||
throttle_time?: number; | ||
} | ||
export interface TROptionsInterface extends OptionsInterface { | ||
throttle_time?: number; | ||
max_length_queue?: number; | ||
} |
@@ -42,4 +42,5 @@ "use strict"; | ||
require("@testing-library/jest-dom/extend-expect"); | ||
const debugTest = false; | ||
const TestFetchMarketCodeComponent = () => { | ||
const { isLoading, marketCodes } = (0, useFetchMarketCode_1.default)({ debug: true }); | ||
const { isLoading, marketCodes } = (0, useFetchMarketCode_1.default)({ debug: debugTest }); | ||
return (React.createElement("div", null, isLoading ? (React.createElement("p", null, "Loading...")) : (marketCodes.length > 0 && (React.createElement("ul", { "data-testid": "market-codes" }, marketCodes.map((code, index) => (React.createElement("li", { key: index }, | ||
@@ -46,0 +47,0 @@ code.market, |
@@ -44,11 +44,18 @@ "use strict"; | ||
require("@testing-library/jest-dom/extend-expect"); | ||
const TestOrderbookComponent = () => { | ||
const [marketCode, _] = (0, react_1.useState)([ | ||
{ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}, | ||
]); | ||
const { isConnected, socketData } = (0, useWsOrderbook_1.default)(marketCode); | ||
const ErrorBoundary_1 = __importDefault(require("./ErrorBoundary")); | ||
const debugTest = false; | ||
const TestOrderbookComponent = ({ customMarketCode, onError, }) => { | ||
const [marketCode, setMarketCode] = (0, react_1.useState)({ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}); | ||
(0, react_1.useEffect)(() => { | ||
if (customMarketCode) { | ||
setMarketCode(() => customMarketCode); | ||
} | ||
}, [customMarketCode]); | ||
const { isConnected, socketData } = (0, useWsOrderbook_1.default)(marketCode, onError, { | ||
debug: debugTest, | ||
}); | ||
return (React.createElement("div", null, | ||
@@ -63,14 +70,15 @@ isConnected ? React.createElement("p", null, "Connected") : React.createElement("p", null, "Not Connected"), | ||
describe('useWsOrderbook hook', () => { | ||
it('renders connection status and received socket data', () => __awaiter(void 0, void 0, void 0, function* () { | ||
// Test invalid targetMarketCodes | ||
it('useWsOrderbook should throw error with invalid targetMarketCodes', () => { | ||
const onError = jest.fn(); | ||
const invalidTargetMarketCodes = { | ||
market: 'test_market', | ||
korean_name: 'test_korean', | ||
}; | ||
// Render the TestOrderbookComponent | ||
(0, react_2.render)(React.createElement(TestOrderbookComponent, null)); | ||
// Check if the connection status is displayed | ||
const connectionStatus = react_2.screen.getByText(/Connected|Not Connected/i); | ||
expect(connectionStatus).toBeInTheDocument(); | ||
// Wait for the socket data to be displayed | ||
const socketDataList = yield react_2.screen.findByTestId('socket-data', {}, { timeout: 5000 }); | ||
// Check if the socket data is displayed | ||
expect(socketDataList).toBeInTheDocument(); | ||
expect(socketDataList.children.length).toBeGreaterThan(0); | ||
})); | ||
(0, react_2.render)(React.createElement(ErrorBoundary_1.default, { onError: onError }, | ||
React.createElement(TestOrderbookComponent, { customMarketCode: invalidTargetMarketCodes, onError: onError }))); | ||
expect(onError).toHaveBeenCalled(); | ||
expect(onError.mock.calls[0][0].message).toBe('targetMarketCodes does not have the correct interface'); | ||
}); | ||
it('received socket data correctly', () => __awaiter(void 0, void 0, void 0, function* () { | ||
@@ -77,0 +85,0 @@ // Render the TestOrderbookComponent |
@@ -43,4 +43,6 @@ "use strict"; | ||
require("@testing-library/jest-dom/extend-expect"); | ||
const TestTickerComponentConnection = () => { | ||
const [marketCode, _] = (0, react_1.useState)([ | ||
const ErrorBoundary_1 = __importDefault(require("./ErrorBoundary")); | ||
const debugTest = false; | ||
const TestTickerComponent = ({ customMarketCode, onError, }) => { | ||
const [marketCode, setMarketCode] = (0, react_1.useState)([ | ||
{ | ||
@@ -52,3 +54,11 @@ market: 'KRW-BTC', | ||
]); | ||
const { isConnected, socketData } = (0, useWsTicker_1.default)(marketCode); | ||
(0, react_1.useEffect)(() => { | ||
if (customMarketCode) { | ||
console.log('here', customMarketCode); | ||
setMarketCode(() => customMarketCode); | ||
} | ||
}, [customMarketCode]); | ||
const { isConnected, socketData } = (0, useWsTicker_1.default)(marketCode, onError, { | ||
debug: debugTest, | ||
}); | ||
return (React.createElement("div", null, | ||
@@ -62,5 +72,25 @@ isConnected ? React.createElement("p", null, "Connected") : React.createElement("p", null, "Not Connected"), | ||
describe('useWsTicker hook', () => { | ||
// Test invalid targetMarketCodes | ||
it('useWsTicker should throw error with invalid targetMarketCodes', () => { | ||
const onError = jest.fn(); | ||
const invalidTargetMarketCodes = [ | ||
{ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}, | ||
{ | ||
market: 'KRW-ETH', | ||
korean_name: '이더리움', | ||
}, | ||
]; | ||
// Render the TestOrderbookComponent | ||
(0, react_2.render)(React.createElement(ErrorBoundary_1.default, { onError: onError }, | ||
React.createElement(TestTickerComponent, { customMarketCode: invalidTargetMarketCodes, onError: onError }))); | ||
expect(onError).toHaveBeenCalled(); | ||
expect(onError.mock.calls[0][0].message).toBe('targetMarketCodes does not have the correct interface'); | ||
}); | ||
it('renders connection status and received socket data', () => __awaiter(void 0, void 0, void 0, function* () { | ||
// Render the TestTickerComponentConnection | ||
(0, react_2.render)(React.createElement(TestTickerComponentConnection, null)); | ||
// Render the TestTickerComponent | ||
(0, react_2.render)(React.createElement(TestTickerComponent, null)); | ||
// Check if the connection status is displayed | ||
@@ -67,0 +97,0 @@ const connectionStatus = react_2.screen.getByText(/Connected|Not Connected/i); |
@@ -44,11 +44,19 @@ "use strict"; | ||
require("@testing-library/jest-dom/extend-expect"); | ||
const TestTradeComponent = () => { | ||
const [marketCode, _] = (0, react_1.useState)([ | ||
{ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}, | ||
]); | ||
const { isConnected, socketData } = (0, useWsTrade_1.default)(marketCode); | ||
const react_3 = require("react"); | ||
const ErrorBoundary_1 = __importDefault(require("./ErrorBoundary")); | ||
const debugTest = false; | ||
const TestTradeComponent = ({ customMarketCode, onError, }) => { | ||
const [marketCode, setMarketCode] = (0, react_1.useState)({ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}); | ||
(0, react_3.useEffect)(() => { | ||
if (customMarketCode) { | ||
setMarketCode(() => customMarketCode); | ||
} | ||
}, [customMarketCode]); | ||
const { isConnected, socketData } = (0, useWsTrade_1.default)(marketCode, onError, { | ||
debug: debugTest, | ||
}); | ||
return (React.createElement("div", null, | ||
@@ -63,2 +71,15 @@ isConnected ? React.createElement("p", null, "Connected") : React.createElement("p", null, "Not Connected"), | ||
describe('useWsTrade hook', () => { | ||
// Test invalid targetMarketCodes | ||
it('useWsTrade should throw error with invalid targetMarketCodes', () => { | ||
const onError = jest.fn(); | ||
const invalidTargetMarketCodes = { | ||
market: 'test_market', | ||
korean_name: 'test_korean', | ||
}; | ||
// Render the TestTradeComponent | ||
(0, react_2.render)(React.createElement(ErrorBoundary_1.default, { onError: onError }, | ||
React.createElement(TestTradeComponent, { customMarketCode: invalidTargetMarketCodes, onError: onError }))); | ||
expect(onError).toHaveBeenCalled(); | ||
expect(onError.mock.calls[0][0].message).toBe('targetMarketCodes does not have the correct interface'); | ||
}); | ||
it('renders connection status and received socket data', () => __awaiter(void 0, void 0, void 0, function* () { | ||
@@ -65,0 +86,0 @@ // Render the TestTradeComponent |
{ | ||
"name": "use-upbit-api", | ||
"version": "2.0.0", | ||
"version": "2.0.1", | ||
"description": "This is React Custom Hook for upbit api", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
@@ -14,2 +14,4 @@ # use-upbit-api | ||
[_Coverage Status_ →](https://devkangminhyeok.github.io/use-upbit-api/) | ||
[_View Demo_ →](https://devkangminhyeok.github.io/React-Upbit-API-Example/total-example) | ||
@@ -19,4 +21,2 @@ | ||
--- | ||
## Install | ||
@@ -26,4 +26,2 @@ | ||
--- | ||
## Hooks | ||
@@ -43,4 +41,2 @@ | ||
--- | ||
## useFetchMarketCode | ||
@@ -56,2 +52,8 @@ | ||
## ⚠️ CAUTIONs IN WEBSOCKET API | ||
targetMarketCode should be state in react (useState, ...), if not, unexpectable error can occur. | ||
Do not use just constant or variable. | ||
## useWsTicker | ||
@@ -62,4 +64,14 @@ | ||
```tsx | ||
const [targetMarketCode, _] = useState([ | ||
{ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}, | ||
... | ||
]); | ||
const {socket, isConnected, socketData} = useWsTicker( | ||
targetMarketCode, | ||
targetMarketCode, // should be array | ||
onError, // onError?: (error: Error) => void // optional, user for using ErrorBoundary | ||
(options = {throttle_time: 400, debug: false}), // default option, can be modified. | ||
@@ -74,4 +86,11 @@ ); | ||
```tsx | ||
const [targetMarketCode, _] = useState({ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}); | ||
const {socket, isConnected, socketData} = useWsOrderbook( | ||
targetMarketCode, | ||
targetMarketCode, // should be above form object | ||
onError, // onError?: (error: Error) => void // optional, user for using ErrorBoundary | ||
(options = {throttle_time: 400, debug: false}), // default option, can be modified. | ||
@@ -87,4 +106,11 @@ ); | ||
```tsx | ||
const [targetMarketCode, _] = useState({ | ||
market: 'KRW-BTC', | ||
korean_name: '비트코인', | ||
english_name: 'Bitcoin', | ||
}); | ||
const {socket, isConnected, socketData} = useWsTrade( | ||
targetMarketCode, | ||
targetMarketCode, // should be above form object | ||
onError, // onError?: (error: Error) => void // optional, user for using ErrorBoundary | ||
(options = {throttle_time: 400, max_length_queue: 100, debug: false}), // default option, can be modified. | ||
@@ -96,6 +122,23 @@ ); | ||
If you want to contribute to `use-upbit-api`, please contact me <rkdalsgur032@unist.ac.kr> | ||
Thank you for your interest in contributing to use-upbit-api. Before you begin writing code, it is important that you share your intention to contribute with the team, based on the type of contribution | ||
1. You want to **propose a new feature** and implement it. | ||
- Post about your intended feature in an [issue](https://github.com/devKangMinHyeok/use-upbit-api/issues), then implement it. | ||
- We suggest that the branch name that you implement is better to be {type}/{issue number}/{issue name}. ex) feature/118/githubAction, bugfix/120/typo | ||
2. You want to **implement a feature or bug-fix** for an outstanding issue. | ||
- Search for your issue in the [Mips-simulator-js issue list](https://github.com/devKangMinHyeok/use-upbit-api/issues). | ||
- Pick an issue and comment that you'd like to work on the feature or bug-fix. | ||
- If you need more context on a particular issue, please ask and we shall provide. | ||
3. **Open pull request** | ||
- You implement and test your feature or bug-fix, please submit a Pull Request to [https://github.com/mipsSimulatorUNIST/simulator/pulls](https://github.com/devKangMinHyeok/use-upbit-api/pulls) with some test case. | ||
- Once a pull request is accepted and CI is passing, there is nothing else you need to do. we will check and merge the PR for you. | ||
**_Always opening_** to join this project for developing this library. | ||
❗️[_ISSUE_ →](https://github.com/devKangMinHyeok/use-upbit-api/issues) | ||
✅ [_Pull Request_ →](https://github.com/devKangMinHyeok/use-upbit-api/pulls) | ||
## License | ||
Licensed under the MIT License, Copyright © 2022-present MinHyeok Kang. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
79219
59
1615
136
1