diff --git a/CHANGELOG.md b/CHANGELOG.md index a71a33cf..9ee17d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog + +## 3.1.0 - 2023-12-18 + +### Added +- Add Auto Invest endpoints +- `GET /sapi/v1/margin/available-inventory` Query margin available inventory +- `POST /sapi/v1/margin/manual-liquidation` Margin manual liquidation + +### Changed +- Update dependencies + +### Removed +- `GET /sapi/v1/futures/loan/borrow/history` +- `GET /sapi/v1/futures/loan/repay/history` +- `GET /sapi/v2/futures/loan/wallet` +- `GET /sapi/v1/futures/loan/adjustCollateral/history` +- `GET /sapi/v1/futures/loan/liquidationHistory` +- `GET /sapi/v1/futures/loan/interestHistory` + ## 3.0.0 - 2023-10-20 ### Changed diff --git a/__tests__/spot/auto-invest/changePlanStatus.test.js b/__tests__/spot/auto-invest/changePlanStatus.test.js new file mode 100644 index 00000000..2f4dc757 --- /dev/null +++ b/__tests__/spot/auto-invest/changePlanStatus.test.js @@ -0,0 +1,34 @@ +/* global describe, it, expect */ +const { nockPostMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const planId = 12345 +const status = 'ONGOING' + +describe('#changePlanStatus', () => { + it.each([ + [null, null], + [null, status], + [planId, null] + ])('should throw MissingParameterError given missing params', (planId, status) => { + expect(() => { + SpotClient.changePlanStatus(planId, status) + }).toThrow(MissingParameterError) + }) + + it('should change plan status', () => { + const parameters = { + recvWindow + } + nockPostMock(`/sapi/v1/lending/auto-invest/plan/edit-status?${buildQueryString({ planId, status, ...parameters })}`)(mockResponse) + return SpotClient.changePlanStatus(planId, status, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/getListOfPlans.test.js b/__tests__/spot/auto-invest/getListOfPlans.test.js new file mode 100644 index 00000000..49197cd9 --- /dev/null +++ b/__tests__/spot/auto-invest/getListOfPlans.test.js @@ -0,0 +1,28 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const planType = 'SINGLE' + +describe('#getListOfPlans', () => { + it('throw MissingParameterError when missing planType', () => { + expect(() => { + SpotClient.getListOfPlans(null) + }).toThrow(MissingParameterError) + }) + it('should get list of plans', () => { + const parameters = { + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/plan/list?${buildQueryString({ planType, ...parameters })}`)(mockResponse) + return SpotClient.getListOfPlans(planType, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/getTargetAssetList.test.js b/__tests__/spot/auto-invest/getTargetAssetList.test.js new file mode 100644 index 00000000..d0712d44 --- /dev/null +++ b/__tests__/spot/auto-invest/getTargetAssetList.test.js @@ -0,0 +1,33 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const size = 100 +const current = 1 + +describe('#getTargetAssetList', () => { + it('should get target asset list without parameter attached', () => { + nockMock('/sapi/v1/lending/auto-invest/target-asset/list')(mockResponse) + return SpotClient.getTargetAssetList().then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) + + it('should get target asset list', () => { + const parameters = { + size, + current, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/target-asset/list?${buildQueryString({ ...parameters })}`)(mockResponse) + return SpotClient.getTargetAssetList(parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/getTargetAssetRoiData.test.js b/__tests__/spot/auto-invest/getTargetAssetRoiData.test.js new file mode 100644 index 00000000..6220e2d1 --- /dev/null +++ b/__tests__/spot/auto-invest/getTargetAssetRoiData.test.js @@ -0,0 +1,34 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const targetAsset = 'BTC' +const hisRoiType = 'FIVE_YEAR' + +describe('#getTargetAssetRoiData', () => { + it.each([ + [null, null], + [null, hisRoiType], + [targetAsset, null] + ])('should throw MissingParameterError given missing params', (targetAsset, hisRoiType) => { + expect(() => { + SpotClient.getTargetAssetRoiData(targetAsset, hisRoiType) + }).toThrow(MissingParameterError) + }) + + it('should get target asset roi data', () => { + const parameters = { + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/target-asset/roi/list?${buildQueryString({ targetAsset, hisRoiType, ...parameters })}`)(mockResponse) + return SpotClient.getTargetAssetRoiData(targetAsset, hisRoiType, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/indexLinkedPlanRebalanceDetails.test.js b/__tests__/spot/auto-invest/indexLinkedPlanRebalanceDetails.test.js new file mode 100644 index 00000000..ff5acf0c --- /dev/null +++ b/__tests__/spot/auto-invest/indexLinkedPlanRebalanceDetails.test.js @@ -0,0 +1,33 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const current = 1 +const size = 100 + +describe('#indexLinkedPlanRebalanceDetails', () => { + it('should index linked plan rebalance details without parameter attached', () => { + nockMock('/sapi/v1/lending/auto-invest/rebalance/history')(mockResponse) + return SpotClient.indexLinkedPlanRebalanceDetails().then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) + + it('should index linked plan rebalance details', () => { + const parameters = { + current, + size, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/rebalance/history?${buildQueryString({ ...parameters })}`)(mockResponse) + return SpotClient.indexLinkedPlanRebalanceDetails(parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/indexLinkedPlanRedemption.test.js b/__tests__/spot/auto-invest/indexLinkedPlanRedemption.test.js new file mode 100644 index 00000000..b297a90a --- /dev/null +++ b/__tests__/spot/auto-invest/indexLinkedPlanRedemption.test.js @@ -0,0 +1,31 @@ +/* global describe, it, expect */ +const { nockPostMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const requestId = 12345 +const indexId = 1 +const redemptionPercentage = 10 + +describe('#indexLinkedPlanRedemption', () => { + it('throw MissingParameterError when missing requestId', () => { + expect(() => { + SpotClient.indexLinkedPlanRedemption(null) + }).toThrow(MissingParameterError) + }) + it('should index linked plan redemption', () => { + const parameters = { + requestId, + recvWindow + } + nockPostMock(`/sapi/v1/lending/auto-invest/redeem?${buildQueryString({ indexId, redemptionPercentage, ...parameters })}`)(mockResponse) + return SpotClient.indexLinkedPlanRedemption(indexId, redemptionPercentage, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/indexLinkedPlanRedemptionHistory.test.js b/__tests__/spot/auto-invest/indexLinkedPlanRedemptionHistory.test.js new file mode 100644 index 00000000..9d53bda2 --- /dev/null +++ b/__tests__/spot/auto-invest/indexLinkedPlanRedemptionHistory.test.js @@ -0,0 +1,34 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + asset, + recvWindow +} = require('../../testUtils/mockData') + +const requestId = 12345 +const current = 1 +const size = 100 + +describe('#indexLinkedPlanRedemptionHistory', () => { + it('throw MissingParameterError when missing requestId', () => { + expect(() => { + SpotClient.indexLinkedPlanRedemptionHistory(null) + }).toThrow(MissingParameterError) + }) + it('should index linked plan redemption history', () => { + const parameters = { + current, + asset, + size, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/redeem/history?${buildQueryString({ requestId, ...parameters })}`)(mockResponse) + return SpotClient.indexLinkedPlanRedemptionHistory(requestId, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/queryAllSourceAssetAndTargetAsset.test.js b/__tests__/spot/auto-invest/queryAllSourceAssetAndTargetAsset.test.js new file mode 100644 index 00000000..62e83251 --- /dev/null +++ b/__tests__/spot/auto-invest/queryAllSourceAssetAndTargetAsset.test.js @@ -0,0 +1,28 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +describe('#queryAllSourceAssetAndTargetAsset', () => { + it('should query all source asset and target asset without parameter attached', () => { + nockMock('/sapi/v1/lending/auto-invest/all/asset')(mockResponse) + return SpotClient.queryAllSourceAssetAndTargetAsset().then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) + + it('should query all source asset and target asset', () => { + const parameters = { + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/all/asset?${buildQueryString({ ...parameters })}`)(mockResponse) + return SpotClient.queryAllSourceAssetAndTargetAsset(parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/futures/futuresLoanBorrowHistory.test.js b/__tests__/spot/auto-invest/queryHoldingDetailsOfThePlan.test.js similarity index 50% rename from __tests__/spot/futures/futuresLoanBorrowHistory.test.js rename to __tests__/spot/auto-invest/queryHoldingDetailsOfThePlan.test.js index cfd5e5e9..9823c838 100644 --- a/__tests__/spot/futures/futuresLoanBorrowHistory.test.js +++ b/__tests__/spot/auto-invest/queryHoldingDetailsOfThePlan.test.js @@ -3,28 +3,24 @@ const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/test const { mockResponse, - coin, recvWindow } = require('../../testUtils/mockData') -describe('#futuresLoanBorrowHistory', () => { - it('should get cross-collateral borrow history without parameter attached', () => { - nockMock('/sapi/v1/futures/loan/borrow/history')(mockResponse) - - return SpotClient.futuresLoanBorrowHistory().then(response => { +describe('#queryHoldingDetailsOfThePlan', () => { + it('should query holding details of the plan without parameter attached', () => { + nockMock('/sapi/v1/lending/auto-invest/plan/id')(mockResponse) + return SpotClient.queryHoldingDetailsOfThePlan().then(response => { expect(response).toBeDefined() expect(response.data).toEqual(mockResponse) }) }) - it('should get cross-collateral borrow history', () => { + it('should query holding details of the plan', () => { const parameters = { - coin, recvWindow } - nockMock(`/sapi/v1/futures/loan/borrow/history?${buildQueryString({ ...parameters })}`)(mockResponse) - - return SpotClient.futuresLoanBorrowHistory(parameters).then(response => { + nockMock(`/sapi/v1/lending/auto-invest/plan/id?${buildQueryString({ ...parameters })}`)(mockResponse) + return SpotClient.queryHoldingDetailsOfThePlan(parameters).then(response => { expect(response).toBeDefined() expect(response.data).toEqual(mockResponse) }) diff --git a/__tests__/spot/auto-invest/queryIndexDetails.test.js b/__tests__/spot/auto-invest/queryIndexDetails.test.js new file mode 100644 index 00000000..5dfd91ee --- /dev/null +++ b/__tests__/spot/auto-invest/queryIndexDetails.test.js @@ -0,0 +1,28 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const indexId = 1 + +describe('#queryIndexDetails', () => { + it('throw MissingParameterError when missing indexId', () => { + expect(() => { + SpotClient.queryIndexDetails(null) + }).toThrow(MissingParameterError) + }) + it('should query index details', () => { + const parameters = { + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/index/info?${buildQueryString({ indexId, ...parameters })}`)(mockResponse) + return SpotClient.queryIndexDetails(indexId, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/queryIndexLinkedPlanPositionDetails.test.js b/__tests__/spot/auto-invest/queryIndexLinkedPlanPositionDetails.test.js new file mode 100644 index 00000000..b2d122bd --- /dev/null +++ b/__tests__/spot/auto-invest/queryIndexLinkedPlanPositionDetails.test.js @@ -0,0 +1,28 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const indexId = 1 + +describe('#queryIndexLinkedPlanPositionDetails', () => { + it('throw MissingParameterError when missing indexId', () => { + expect(() => { + SpotClient.queryIndexLinkedPlanPositionDetails(null) + }).toThrow(MissingParameterError) + }) + it('should query index linked plan position details', () => { + const parameters = { + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/index/user-summary?${buildQueryString({ indexId, ...parameters })}`)(mockResponse) + return SpotClient.queryIndexLinkedPlanPositionDetails(indexId, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/queryOnetimeTransactionStatus.test.js b/__tests__/spot/auto-invest/queryOnetimeTransactionStatus.test.js new file mode 100644 index 00000000..1787c3f6 --- /dev/null +++ b/__tests__/spot/auto-invest/queryOnetimeTransactionStatus.test.js @@ -0,0 +1,30 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const transactionId = 12345 +const requestId = 'TR12354859' + +describe('#queryOnetimeTransactionStatus', () => { + it('throw MissingParameterError when missing transactionId', () => { + expect(() => { + SpotClient.queryOnetimeTransactionStatus(null) + }).toThrow(MissingParameterError) + }) + it('should query one-time transaction status', () => { + const parameters = { + requestId, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/one-off/status?${buildQueryString({ transactionId, ...parameters })}`)(mockResponse) + return SpotClient.queryOnetimeTransactionStatus(transactionId, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/querySourceAssetList.test.js b/__tests__/spot/auto-invest/querySourceAssetList.test.js new file mode 100644 index 00000000..64ede742 --- /dev/null +++ b/__tests__/spot/auto-invest/querySourceAssetList.test.js @@ -0,0 +1,34 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const targetAsset = 'BTC' +const indexId = 1 +const usageType = 'RECURRING' +const flexibleAllowedToUse = true + +describe('#querySourceAssetList', () => { + it('throw MissingParameterError when missing usageType', () => { + expect(() => { + SpotClient.querySourceAssetList(null) + }).toThrow(MissingParameterError) + }) + it('should query source asset list', () => { + const parameters = { + targetAsset, + indexId, + flexibleAllowedToUse, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/source-asset/list?${buildQueryString({ usageType, ...parameters })}`)(mockResponse) + return SpotClient.querySourceAssetList(usageType, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/auto-invest/querySubscriptionTransactionHistory.test.js b/__tests__/spot/auto-invest/querySubscriptionTransactionHistory.test.js new file mode 100644 index 00000000..38697884 --- /dev/null +++ b/__tests__/spot/auto-invest/querySubscriptionTransactionHistory.test.js @@ -0,0 +1,33 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') + +const { + mockResponse, + recvWindow +} = require('../../testUtils/mockData') + +const size = 100 +const current = 1 + +describe('#querySubscriptionTransactionHistory', () => { + it('should query subscription transaction history without parameter attached', () => { + nockMock('/sapi/v1/lending/auto-invest/history/list')(mockResponse) + return SpotClient.querySubscriptionTransactionHistory().then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) + + it('should query subscription transaction history', () => { + const parameters = { + size, + current, + recvWindow + } + nockMock(`/sapi/v1/lending/auto-invest/history/list?${buildQueryString({ ...parameters })}`)(mockResponse) + return SpotClient.querySubscriptionTransactionHistory(parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/futures/futuresLoanAdjustCollateralHistory.test.js b/__tests__/spot/futures/futuresLoanAdjustCollateralHistory.test.js deleted file mode 100644 index 711c374f..00000000 --- a/__tests__/spot/futures/futuresLoanAdjustCollateralHistory.test.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global describe, it, expect */ -const { nockMock, SpotClient } = require('../../testUtils/testSetup') -const { mockResponse } = require('../../testUtils/mockData') - -describe('#futuresLoanAdjustCollateralHistory', () => { - it('should get adjust cross collateral LTV history', () => { - nockMock('/sapi/v1/futures/loan/adjustCollateral/history')(mockResponse) - - return SpotClient.futuresLoanAdjustCollateralHistory().then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) -}) diff --git a/__tests__/spot/futures/futuresLoanInterestHistory.test.js b/__tests__/spot/futures/futuresLoanInterestHistory.test.js deleted file mode 100644 index 8c9aa7da..00000000 --- a/__tests__/spot/futures/futuresLoanInterestHistory.test.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global describe, it, expect */ -const { nockMock, SpotClient } = require('../../testUtils/testSetup') -const { mockResponse } = require('../../testUtils/mockData') - -describe('#futuresLoanInterestHistory', () => { - it('should get cross collateral interest history', () => { - nockMock('/sapi/v1/futures/loan/interestHistory')(mockResponse) - - return SpotClient.futuresLoanInterestHistory().then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) -}) diff --git a/__tests__/spot/futures/futuresLoanLiquidationHistory.test.js b/__tests__/spot/futures/futuresLoanLiquidationHistory.test.js deleted file mode 100644 index 55141cba..00000000 --- a/__tests__/spot/futures/futuresLoanLiquidationHistory.test.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global describe, it, expect */ -const { nockMock, SpotClient } = require('../../testUtils/testSetup') -const { mockResponse } = require('../../testUtils/mockData') - -describe('#futuresLoanLiquidationHistory', () => { - it('should get cross collateral liquidation history', () => { - nockMock('/sapi/v1/futures/loan/liquidationHistory')(mockResponse) - - return SpotClient.futuresLoanLiquidationHistory().then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) -}) diff --git a/__tests__/spot/futures/futuresLoanRepayHistory.test.js b/__tests__/spot/futures/futuresLoanRepayHistory.test.js deleted file mode 100644 index 23e55fe1..00000000 --- a/__tests__/spot/futures/futuresLoanRepayHistory.test.js +++ /dev/null @@ -1,32 +0,0 @@ -/* global describe, it, expect */ -const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') - -const { - mockResponse, - coin, - recvWindow -} = require('../../testUtils/mockData') - -describe('#futuresLoanRepayHistory', () => { - it('should get cross-collateral repay history without parameter attached', () => { - nockMock('/sapi/v1/futures/loan/repay/history')(mockResponse) - - return SpotClient.futuresLoanRepayHistory().then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) - - it('should get cross-collateral repay history', () => { - const parameters = { - coin, - recvWindow - } - nockMock(`/sapi/v1/futures/loan/repay/history?${buildQueryString({ ...parameters })}`)(mockResponse) - - return SpotClient.futuresLoanRepayHistory(parameters).then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) -}) diff --git a/__tests__/spot/futures/futuresLoanWallet.test.js b/__tests__/spot/futures/futuresLoanWallet.test.js deleted file mode 100644 index 6a023e73..00000000 --- a/__tests__/spot/futures/futuresLoanWallet.test.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global describe, it, expect */ -const { nockMock, SpotClient } = require('../../testUtils/testSetup') -const { mockResponse } = require('../../testUtils/mockData') - -describe('#futuresLoanWallet', () => { - it('should get cross-collateral wallet', () => { - nockMock('/sapi/v2/futures/loan/wallet')(mockResponse) - - return SpotClient.futuresLoanWallet().then(response => { - expect(response).toBeDefined() - expect(response.data).toEqual(mockResponse) - }) - }) -}) diff --git a/__tests__/spot/margin/marginManualLiquidation.test.js b/__tests__/spot/margin/marginManualLiquidation.test.js new file mode 100644 index 00000000..b0095d05 --- /dev/null +++ b/__tests__/spot/margin/marginManualLiquidation.test.js @@ -0,0 +1,27 @@ +/* global describe, it, expect */ +const { nockPostMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + symbol +} = require('../../testUtils/mockData') + +const type = 'MARGIN' +describe('#marginManualLiquidation', () => { + it('throw MissingParameterError when missing type', () => { + expect(() => { + SpotClient.marginManualLiquidation(null) + }).toThrow(MissingParameterError) + }) + it('should margin manual liquidation', () => { + const parameters = { + symbol + } + nockPostMock(`/sapi/v1/margin/manual-liquidation?${buildQueryString({ type, ...parameters })}`)(mockResponse) + return SpotClient.marginManualLiquidation(type, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/__tests__/spot/margin/queryMarginAvailableInventory.test.js b/__tests__/spot/margin/queryMarginAvailableInventory.test.js new file mode 100644 index 00000000..bcc754d7 --- /dev/null +++ b/__tests__/spot/margin/queryMarginAvailableInventory.test.js @@ -0,0 +1,28 @@ +/* global describe, it, expect */ +const { nockMock, buildQueryString, SpotClient } = require('../../testUtils/testSetup') +const MissingParameterError = require('../../../src/error/missingParameterError') + +const { + mockResponse, + symbol +} = require('../../testUtils/mockData') + +const type = 'MARGIN' + +describe('#queryMarginAvailableInventory', () => { + it('throw MissingParameterError when missing type', () => { + expect(() => { + SpotClient.queryMarginAvailableInventory(null) + }).toThrow(MissingParameterError) + }) + it('should query margin available inventory', () => { + const parameters = { + symbol + } + nockMock(`/sapi/v1/margin/available-inventory?${buildQueryString({ type, ...parameters })}`)(mockResponse) + return SpotClient.queryMarginAvailableInventory(type, parameters).then(response => { + expect(response).toBeDefined() + expect(response.data).toEqual(mockResponse) + }) + }) +}) diff --git a/examples/spot/auto_invest/changePlanStatus.js b/examples/spot/auto_invest/changePlanStatus.js new file mode 100644 index 00000000..2748c43d --- /dev/null +++ b/examples/spot/auto_invest/changePlanStatus.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.changePlanStatus(1234, 'ONGOING', { + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/getListOfPlans.js b/examples/spot/auto_invest/getListOfPlans.js new file mode 100644 index 00000000..335473f9 --- /dev/null +++ b/examples/spot/auto_invest/getListOfPlans.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.getListOfPlans('SINGLE', { + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/getTargetAssetList.js b/examples/spot/auto_invest/getTargetAssetList.js new file mode 100644 index 00000000..084e51dd --- /dev/null +++ b/examples/spot/auto_invest/getTargetAssetList.js @@ -0,0 +1,13 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.getTargetAssetList({ + size: 100, + current: 1, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/getTargetAssetRoiData.js b/examples/spot/auto_invest/getTargetAssetRoiData.js new file mode 100644 index 00000000..2d8dc86e --- /dev/null +++ b/examples/spot/auto_invest/getTargetAssetRoiData.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.getTargetAssetRoiData('BTC', 'FIVE_YEAR', { + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/indexLinkedPlanRebalanceDetails.js b/examples/spot/auto_invest/indexLinkedPlanRebalanceDetails.js new file mode 100644 index 00000000..c9c12e7f --- /dev/null +++ b/examples/spot/auto_invest/indexLinkedPlanRebalanceDetails.js @@ -0,0 +1,13 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.indexLinkedPlanRebalanceDetails({ + current: 1, + size: 100, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/indexLinkedPlanRedemption.js b/examples/spot/auto_invest/indexLinkedPlanRedemption.js new file mode 100644 index 00000000..15e7bb35 --- /dev/null +++ b/examples/spot/auto_invest/indexLinkedPlanRedemption.js @@ -0,0 +1,14 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.indexLinkedPlanRedemption(12345, { + current: 1, + asset: 'BTC', + size: 100, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/indexLinkedPlanRedemptionHistory.js b/examples/spot/auto_invest/indexLinkedPlanRedemptionHistory.js new file mode 100644 index 00000000..eb8b434a --- /dev/null +++ b/examples/spot/auto_invest/indexLinkedPlanRedemptionHistory.js @@ -0,0 +1,14 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.indexLinkedPlanRedemptionHistory(12345, { + current: 1, + asset: 'BTC', + size: 100, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/queryAllSourceAssetAndTargetAsset.js b/examples/spot/auto_invest/queryAllSourceAssetAndTargetAsset.js new file mode 100644 index 00000000..dcea83d9 --- /dev/null +++ b/examples/spot/auto_invest/queryAllSourceAssetAndTargetAsset.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryAllSourceAssetAndTargetAsset({ + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/queryHoldingDetailsOfThePlan.js b/examples/spot/auto_invest/queryHoldingDetailsOfThePlan.js new file mode 100644 index 00000000..830a4f9d --- /dev/null +++ b/examples/spot/auto_invest/queryHoldingDetailsOfThePlan.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryHoldingDetailsOfThePlan({ + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/queryIndexDetails.js b/examples/spot/auto_invest/queryIndexDetails.js new file mode 100644 index 00000000..5bcbe917 --- /dev/null +++ b/examples/spot/auto_invest/queryIndexDetails.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryIndexDetails(12345, { + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/queryIndexLinkedPlanPositionDetails.js b/examples/spot/auto_invest/queryIndexLinkedPlanPositionDetails.js new file mode 100644 index 00000000..59112be4 --- /dev/null +++ b/examples/spot/auto_invest/queryIndexLinkedPlanPositionDetails.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryIndexLinkedPlanPositionDetails(12345, { + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/queryOnetimeTransactionStatus.js b/examples/spot/auto_invest/queryOnetimeTransactionStatus.js new file mode 100644 index 00000000..6f800713 --- /dev/null +++ b/examples/spot/auto_invest/queryOnetimeTransactionStatus.js @@ -0,0 +1,12 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryOnetimeTransactionStatus(12345, { + requestId: 'TR12354859', + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/querySourceAssetList.js b/examples/spot/auto_invest/querySourceAssetList.js new file mode 100644 index 00000000..3412ffe7 --- /dev/null +++ b/examples/spot/auto_invest/querySourceAssetList.js @@ -0,0 +1,14 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.querySourceAssetList('RECURRING', { + targetAsset: 'BTC', + indexId: 1, + flexibleAllowedToUse: true, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/auto_invest/querySubscriptionTransactionHistory.js b/examples/spot/auto_invest/querySubscriptionTransactionHistory.js new file mode 100644 index 00000000..4769591d --- /dev/null +++ b/examples/spot/auto_invest/querySubscriptionTransactionHistory.js @@ -0,0 +1,13 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.querySubscriptionTransactionHistory({ + size: 100, + current: 1, + recvWindow: 5000 +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/futures/futuresLoanAdjustCollateralHistory.js b/examples/spot/futures/futuresLoanAdjustCollateralHistory.js deleted file mode 100644 index b5062d81..00000000 --- a/examples/spot/futures/futuresLoanAdjustCollateralHistory.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresLoanAdjustCollateralHistory('USDT', 'BUSD') - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/futures/futuresLoanBorrowHistory.js b/examples/spot/futures/futuresLoanBorrowHistory.js deleted file mode 100644 index 5103ae2f..00000000 --- a/examples/spot/futures/futuresLoanBorrowHistory.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresLoanBorrowHistory() - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/futures/futuresLoanInterestHistory.js b/examples/spot/futures/futuresLoanInterestHistory.js deleted file mode 100644 index ae0f11ec..00000000 --- a/examples/spot/futures/futuresLoanInterestHistory.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresLoanInterestHistory() - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/futures/futuresLoanLiquidationHistory.js b/examples/spot/futures/futuresLoanLiquidationHistory.js deleted file mode 100644 index ef58ca4a..00000000 --- a/examples/spot/futures/futuresLoanLiquidationHistory.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresLoanLiquidationHistory('USDT', 'BUSD') - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/futures/futuresLoanRepayHistory.js b/examples/spot/futures/futuresLoanRepayHistory.js deleted file mode 100644 index 3a8dafec..00000000 --- a/examples/spot/futures/futuresLoanRepayHistory.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresLoanRepayHistory() - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/futures/futuresLoanWallet.js b/examples/spot/futures/futuresLoanWallet.js deleted file mode 100644 index 45a2003b..00000000 --- a/examples/spot/futures/futuresLoanWallet.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const Spot = require('../../../src/spot') - -const apiKey = '' -const apiSecret = '' -const client = new Spot(apiKey, apiSecret) - -client.futuresCrossCollateralWallet() - .then(response => console.log(response.data)) - .catch(error => console.log(error)) diff --git a/examples/spot/margin/marginManualLiquidation.js b/examples/spot/margin/marginManualLiquidation.js new file mode 100644 index 00000000..0f64c3a8 --- /dev/null +++ b/examples/spot/margin/marginManualLiquidation.js @@ -0,0 +1,11 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.marginManualLiquidation('MARGIN', { + symbol: 'BTCUSDT' +}) + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/examples/spot/margin/queryMarginAvailableInventory.js b/examples/spot/margin/queryMarginAvailableInventory.js new file mode 100644 index 00000000..b3e8f58e --- /dev/null +++ b/examples/spot/margin/queryMarginAvailableInventory.js @@ -0,0 +1,9 @@ +const Spot = require('../../../src/spot') + +const apiKey = '' +const apiSecret = '' +const client = new Spot(apiKey, apiSecret) + +client.queryMarginAvailableInventory('MARGIN') + .then(response => client.logger.log(response.data)) + .catch(error => client.logger.error(error)) diff --git a/package-lock.json b/package-lock.json index b37d6cf1..f6e9ee3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@binance/connector", - "version": "3.0.0", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@binance/connector", - "version": "3.0.0", + "version": "3.1.0", "license": "MIT", "dependencies": { - "axios": "^1.3", - "ws": "^8.13" + "axios": "^1.6", + "ws": "^8.14" }, "devDependencies": { "clean-jsdoc-theme": "^4.2", @@ -49,12 +49,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -133,30 +133,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -172,12 +172,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -249,9 +249,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -301,9 +301,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -319,32 +319,32 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -427,9 +427,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -499,9 +499,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -601,9 +601,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -630,19 +630,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -651,12 +651,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -686,18 +686,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -763,21 +763,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.12.tgz", - "integrity": "sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.0", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -799,9 +799,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.0.tgz", - "integrity": "sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1166,9 +1166,9 @@ } }, "node_modules/@jsdoc/salty": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz", - "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.6.tgz", + "integrity": "sha512-aA+awb5yoml8TQ3CzI5Ue7sM3VMRC4l1zJJW4fgZ8OCL1wshJZhNzaf0PL85DSnOUw6QuFgeHGD/eq/xwwAF2g==", "dev": true, "dependencies": { "lodash": "^4.17.21" @@ -1237,9 +1237,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -1250,18 +1250,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1269,42 +1269,42 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -1317,9 +1317,9 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", - "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", "dev": true }, "node_modules/@types/markdown-it": { @@ -1333,45 +1333,51 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", - "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", "dev": true, "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1614,9 +1620,9 @@ } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1896,9 +1902,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", "dev": true, "funding": [ { @@ -1986,9 +1992,9 @@ } }, "node_modules/clean-jsdoc-theme": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.14.tgz", - "integrity": "sha512-RtFKl0GKS9u3su2gnNH5L+k2g7AOZX1e8FH1zlFQf270LgSJsFFMkxTAR8/qeD0+r6jKTpvPq1JJSfhCtVnjVg==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.17.tgz", + "integrity": "sha512-5SbJNXcQHUXd7N13g+3OpGFiBQdxz36xwEP3p1r1vbo/apLcDRtugaFdUZ56H6Rvlb68Q33EChoBkajSlnD11w==", "dev": true, "dependencies": { "@jsdoc/salty": "^0.2.4", @@ -1996,7 +2002,6 @@ "html-minifier-terser": "^7.2.0", "klaw-sync": "^6.0.0", "lodash": "^4.17.21", - "nanoid": "^3.3.4", "showdown": "^2.1.0" }, "peerDependencies": { @@ -2244,9 +2249,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.561", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.561.tgz", - "integrity": "sha512-eS5t4ulWOBfVHdq9SW2dxEaFarj1lPjvJ8PaYMOjY0DecBaj/t4ARziL2IPpDr4atyWwjLFGQ2vo/VCgQFezVQ==", + "version": "1.4.597", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.597.tgz", + "integrity": "sha512-0XOQNqHhg2YgRVRUrS4M4vWjFCFIP2ETXcXe/0KIQBjXE9Cpy+tgzzYfuq6HGai3hWq0YywtG+5XK8fyG08EjA==", "dev": true }, "node_modules/emittery": { @@ -2289,26 +2294,26 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -2318,7 +2323,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -2332,7 +2337,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2364,26 +2369,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -2422,18 +2427,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2618,26 +2624,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -3150,9 +3156,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -3160,7 +3166,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -3299,15 +3305,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3442,15 +3448,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3470,12 +3467,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3520,6 +3517,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3569,9 +3578,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -3647,13 +3656,13 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -3736,12 +3745,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4023,9 +4032,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -5242,24 +5251,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5277,9 +5268,9 @@ } }, "node_modules/nock": { - "version": "13.3.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.6.tgz", - "integrity": "sha512-lT6YuktKroUFM+27mubf2uqQZVy2Jf+pfGzuh9N6VwdHlFoZqvi4zyxFTVR1w/ChPqGY6yxGehHp6C3wqCASCw==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", "dev": true, "dependencies": { "debug": "^4.1.0", @@ -5818,9 +5809,9 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -6452,9 +6443,9 @@ } }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -6697,15 +6688,15 @@ "dev": true }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -6751,9 +6742,9 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", diff --git a/package.json b/package.json index 2d209d15..94664ba2 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "@binance/connector", - "version": "3.0.0", + "version": "3.1.0", "description": "This is a lightweight library that works as a connector to the Binance public API.", "main": "src/index.js", "scripts": { "jsdoc": "jsdoc -c ./docs_src/conf.json && ./docs_src/docs.sh", "jsdoc:win": "jsdoc -c ./docs_src/conf.json && npx jsdoc --readme ./docs_src/gettingStarted.md src/modules/restful/blvt.js && node ./docs_src/generateDoc.js && RD /S /Q out", - "test": "jest", + "test": "jest --maxWorkers 4 --bail", "test:watch": "jest --watchAll", "coverage": "jest --silent --ci --coverage --testLocationInResults --json --outputFile=\"report.json\"", "standard": "standard", @@ -44,8 +44,8 @@ "src/**/*" ], "dependencies": { - "axios": "^1.3", - "ws": "^8.13" + "axios": "^1.6", + "ws": "^8.14" }, "jest": { "testPathIgnorePatterns": [ diff --git a/src/modules/restful/autoInvest.js b/src/modules/restful/autoInvest.js new file mode 100644 index 00000000..2039d37c --- /dev/null +++ b/src/modules/restful/autoInvest.js @@ -0,0 +1,332 @@ +'use strict' + +const { validateRequiredParameters } = require('../../helpers/validation') + +/** + * API auto-invest endpoints + * @module AutoInvest + * @param {*} superclass + */ +const AutoInvest = superclass => class extends superclass { + /** + * Get target asset list (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/target-asset/list
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#get-target-asset-list-user_data} + * + * @param {object} [options] + * @param {string} [options.targetAsset] + * @param {number} [options.size] - Default:10 Max:100 + * @param {number} [options.current] - Current querying page. Start from 1. Default:1 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + getTargetAssetList (options = {}) { + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/target-asset/list', + options + ) + } + + /** + * Get target asset ROI data (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/target-asset/roi/list
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#get-target-asset-roi-data-user_data} + * + * @param {string} targetAsset + * @param {string} hisRoiType + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + getTargetAssetRoiData (targetAsset, hisRoiType, options = {}) { + validateRequiredParameters({ targetAsset, hisRoiType }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/target-asset/roi/list', + Object.assign(options, { + targetAsset, + hisRoiType + }) + ) + } + + /** + * Query all source asset and target asset (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/all/asset
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-all-source-asset-and-target-asset-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + queryAllSourceAssetAndTargetAsset (options = {}) { + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/all/asset', + options + ) + } + + /** + * Query source asset list (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/source-asset/list
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-source-asset-list-user_data} + * + * @param {string} usageType + * @param {object} [options] + * @param {string} [options.targetAsset] + * @param {number} [options.indexId] + * @param {boolean} [options.flexibleAllowedToUse] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + querySourceAssetList (usageType, options = {}) { + validateRequiredParameters({ usageType }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/source-asset/list', + Object.assign(options, { + usageType + }) + ) + } + + /** + * Change Plan Status
+ * + * POST /sapi/v1/lending/auto-invest/plan/edit-status
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#change-plan-status} + * + * @param {number} planId + * @param {Status} status + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + changePlanStatus (planId, status, options = {}) { + validateRequiredParameters({ planId, status }) + return this.publicRequest( + 'POST', + '/sapi/v1/lending/auto-invest/plan/edit-status', + Object.assign(options, { + planId, + status + }) + ) + } + + /** + * Get list of plans
+ * + * GET /sapi/v1/lending/auto-invest/plan/list
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#get-list-of-plans} + * + * @param {string} planType + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + getListOfPlans (planType, options = {}) { + validateRequiredParameters({ planType }) + return this.publicRequest( + 'GET', + '/sapi/v1/lending/auto-invest/plan/list', + Object.assign(options, { + planType + }) + ) + } + + /** + * Query holding details of the plan
+ * + * GET /sapi/v1/lending/auto-invest/plan/id
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-holding-details-of-the-plan} + * + * @param {object} [options] + * @param {number} [options.planId] + * @param {string} [options.requestId] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + queryHoldingDetailsOfThePlan (options = {}) { + return this.publicRequest( + 'GET', + '/sapi/v1/lending/auto-invest/plan/id', + options + ) + } + + /** + * Query subscription transaction history
+ * + * GET /sapi/v1/lending/auto-invest/history/list
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-subscription-transaction-history} + * + * @param {object} [options] + * @param {number} [options.planId] + * @param {number} [options.startTime] - UTC timestamp in ms + * @param {number} [options.endTime] - UTC timestamp in ms + * @param {number} [options.targetAsset] + * @param {PlanType} [options.planType] + * @param {number} [options.size] - Default:10 Max:100 + * @param {number} [options.current] - Current querying page. Start from 1. Default:1 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + querySubscriptionTransactionHistory (options = {}) { + return this.publicRequest( + 'GET', + '/sapi/v1/lending/auto-invest/history/list', + options + ) + } + + /** + * Query Index Details (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/index/info
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-index-details-user_data} + * + * @param {number} indexId + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + queryIndexDetails (indexId, options = {}) { + validateRequiredParameters({ indexId }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/index/info', + Object.assign(options, { + indexId + }) + ) + } + + /** + * Query Index Linked Plan Position Details (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/index/user-summary
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-index-linked-plan-position-details-user_data} + * + * @param {number} indexId + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + queryIndexLinkedPlanPositionDetails (indexId, options = {}) { + validateRequiredParameters({ indexId }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/index/user-summary', + Object.assign(options, { + indexId + }) + ) + } + + /** + * Query One-Time Transaction Status (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/one-off/status
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-one-time-transaction-status-user_data} + * + * @param {number} transactionId + * @param {object} [options] + * @param {string} [options.requestId] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + queryOnetimeTransactionStatus (transactionId, options = {}) { + validateRequiredParameters({ transactionId }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/one-off/status', + Object.assign(options, { + transactionId + }) + ) + } + + /** + * Index Linked Plan Redemption (TRADE)
+ * + * POST /sapi/v1/lending/auto-invest/redeem
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#index-linked-plan-redemption-trade} + * + * @param {number} indexId - PORTFOLIO plan's Id + * @param {number} redemptionPercentage - user redeem percentage,10/20/100. + * @param {object} [options] + * @param {string} [options.requestId] - sourceType + unique, transactionId and requestId cannot be empty at the same time + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + indexLinkedPlanRedemption (indexId, redemptionPercentage, options = {}) { + validateRequiredParameters({ indexId, redemptionPercentage }) + return this.signRequest( + 'POST', + '/sapi/v1/lending/auto-invest/redeem', + Object.assign(options, { + indexId, + redemptionPercentage + }) + ) + } + + /** + * Index Linked Plan Redemption History (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/redeem/history
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#index-linked-plan-redemption-user_data} + * + * @param {number} requestId + * @param {object} [options] + * @param {number} [options.startTime] - UTC timestamp in ms + * @param {number} [options.endTime] - UTC timestamp in ms + * @param {number} [options.current] - Current querying page. Start from 1. Default:1 + * @param {string} [options.asset] + * @param {number} [options.size] - Default:10 Max:100 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + indexLinkedPlanRedemptionHistory (requestId, options = {}) { + validateRequiredParameters({ requestId }) + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/redeem/history', + Object.assign(options, { + requestId + }) + ) + } + + /** + * Index Linked Plan Rebalance Details (USER_DATA)
+ * + * GET /sapi/v1/lending/auto-invest/rebalance/history
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#index-linked-plan-rebalance-details-user_data} + * + * @param {object} [options] + * @param {number} [options.startTime] - UTC timestamp in ms + * @param {number} [options.endTime] - UTC timestamp in ms + * @param {number} [options.current] - Current querying page. Start from 1. Default:1 + * @param {number} [options.size] - Default:10 Max:100 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + indexLinkedPlanRebalanceDetails (options = {}) { + return this.signRequest( + 'GET', + '/sapi/v1/lending/auto-invest/rebalance/history', + options + ) + } +} + +module.exports = AutoInvest diff --git a/src/modules/restful/futures.js b/src/modules/restful/futures.js index 3f02bd1e..427cf13a 100644 --- a/src/modules/restful/futures.js +++ b/src/modules/restful/futures.js @@ -60,139 +60,6 @@ const Futures = superclass => class extends superclass { Object.assign(options, { asset, startTime }) ) } - - /** - * Cross-Collateral Borrow History (USER_DATA) - * - * GET /sapi/v1/futures/loan/borrow/history - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#cross-collateral-borrow-history-user_data} - * - * @param {object} [options] - * @param {string} [options.coin] - * @param {number} [options.startTime] - * @param {number} [options.endTime] - * @param {number} [options.limit] - default 500, max 1000 - * @param {number} [options.recvWindow] - */ - futuresLoanBorrowHistory (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v1/futures/loan/borrow/history', - options - ) - } - - /** - * Cross-Collateral Repayment History (USER_DATA) - * - * GET /sapi/v1/futures/loan/repay/history - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#cross-collateral-repayment-history-user_data} - * - * @param {object} [options] - * @param {string} [options.coin] - * @param {number} [options.startTime] - * @param {number} [options.endTime] - * @param {number} [options.limit] - default 500, max 1000 - * @param {number} [options.recvWindow] - */ - futuresLoanRepayHistory (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v1/futures/loan/repay/history', - options - ) - } - - /** - * Cross-Collateral Wallet (USER_DATA) - * - * GET /sapi/v2/futures/loan/wallet - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#cross-collateral-wallet-v2-user_data} - * - * @param {object} [options] - * @param {number} [options.recvWindow] - */ - futuresLoanWallet (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v2/futures/loan/wallet', - options - ) - } - - /** - * Adjust Cross-Collateral LTV History (USER_DATA) - * - * GET /sapi/v1/futures/loan/adjustCollateral/history - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#adjust-cross-collateral-ltv-history-user_data} - * - * @param {object} [options] - * @param {string} [options.loanCoin] - * @param {string} [options.collateralCoin] - * @param {number} [options.startTime] - * @param {number} [options.endTime] - * @param {number} [options.limit] - default 500, max 1000 - * @param {number} [options.recvWindow] - * - * All data will be returned if loanCoin or collateralCoin is not sent - */ - futuresLoanAdjustCollateralHistory (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v1/futures/loan/adjustCollateral/history', - options - ) - } - - /** - * Cross-Collateral Liquidation History (USER_DATA) - * - * GET /sapi/v1/futures/loan/liquidationHistory - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#adjust-cross-collateral-ltv-history-user_data} - * - * @param {object} [options] - * @param {string} [options.loanCoin] - * @param {string} [options.collateralCoin] - * @param {number} [options.startTime] - * @param {number} [options.endTime] - * @param {number} [options.limit] - default 500, max 1000 - * @param {number} [options.recvWindow] - */ - futuresLoanLiquidationHistory (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v1/futures/loan/liquidationHistory', - options - ) - } - - /** - * Cross-Collateral Interest History (USER_DATA) - * - * GET /sapi/v1/futures/loan/interestHistory - * - * {@link https://binance-docs.github.io/apidocs/spot/en/#cross-collateral-interest-history-user_data} - * - * @param {object} [options] - * @param {string} [options.collateralCoin] - * @param {number} [options.startTime] - * @param {number} [options.endTime] - * @param {number} [options.current] - Currently querying page. Start from 1. Default:1 - * @param {number} [options.limit] - Default:500 Max:1000 - * @param {number} [options.recvWindow] - */ - futuresLoanInterestHistory (options = {}) { - return this.signRequest( - 'GET', - '/sapi/v1/futures/loan/interestHistory', - options - ) - } } module.exports = Futures diff --git a/src/modules/restful/index.js b/src/modules/restful/index.js index 76b44bcd..fd2ebadf 100644 --- a/src/modules/restful/index.js +++ b/src/modules/restful/index.js @@ -1,5 +1,6 @@ 'use strict' +module.exports.autoInvest = require('./autoInvest') module.exports.Blvt = require('./blvt') module.exports.Bswap = require('./bswap') module.exports.SubAccount = require('./subAccount') diff --git a/src/modules/restful/margin.js b/src/modules/restful/margin.js index cfd2b14d..9d06e79e 100644 --- a/src/modules/restful/margin.js +++ b/src/modules/restful/margin.js @@ -1024,6 +1024,48 @@ const Margin = superclass => class extends superclass { options ) } + + /** + * Query Margin Available Inventory (USER_DATA)
+ * + * GET /sapi/v1/margin/available-inventory
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#query-margin-available-inventory-user_data} + * + * @param {Type} type + */ + queryMarginAvailableInventory (type, options = {}) { + validateRequiredParameters({ type }) + return this.signRequest( + 'GET', + '/sapi/v1/margin/available-inventory', + Object.assign(options, { + type + }) + ) + } + + /** + * Margin manual liquidation (MARGIN)
+ * + * POST /sapi/v1/margin/manual-liquidation
+ * + * {@link https://binance-docs.github.io/apidocs/spot/en/#margin-manual-liquidation-margin} + * + * @param {Type} type + * @param {object} [options] + * @param {string} [options.symbol] + */ + marginManualLiquidation (type, options = {}) { + validateRequiredParameters({ type }) + return this.signRequest( + 'POST', + '/sapi/v1/margin/manual-liquidation', + Object.assign(options, { + type + }) + ) + } } module.exports = Margin