@bithomp/xrpl-api 3.2.15 → 3.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/models/account_object.js +32 -2
- package/lib/models/index.d.ts +2 -1
- package/lib/models/index.js +3 -1
- package/lib/parse/ledger/trustline-flags.d.ts +5 -0
- package/lib/parse/ledger/trustline-flags.js +8 -0
- package/lib/parse/outcome/delivered_amount.d.ts +3 -2
- package/lib/parse/outcome/delivered_amount.js +44 -25
- package/lib/parse/outcome.js +3 -2
- package/lib/types/nftokens.d.ts +2 -0
- package/lib/types/nftokens.js +1 -0
- package/lib/types/trustlines.d.ts +27 -0
- package/lib/types/trustlines.js +16 -0
- package/lib/validator.js +1 -1
- package/package.json +14 -14
|
@@ -9,12 +9,42 @@ const common_1 = require("../common");
|
|
|
9
9
|
const ledger_1 = require("../models/ledger");
|
|
10
10
|
function accountObjectsToAccountLines(account, accountObjects) {
|
|
11
11
|
const notInDefaultState = accountObjects.filter((node) => {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
if (node.LedgerEntryType !== "RippleState") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (node.HighLimit.issuer === account) {
|
|
16
|
+
if (node.Flags & RippleStateFlags.lsfHighReserve) {
|
|
17
|
+
if (isPositiveBalance(node.Balance.value)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
if (isNegativeBalance(node.Balance.value)) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
if (node.Flags & RippleStateFlags.lsfLowReserve) {
|
|
28
|
+
if (isNegativeBalance(node.Balance.value)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (isPositiveBalance(node.Balance.value)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
14
38
|
});
|
|
15
39
|
const accountLinesFormatted = notInDefaultState.map((node) => RippleStateToTrustLine(node, account));
|
|
16
40
|
return accountLinesFormatted;
|
|
17
41
|
}
|
|
42
|
+
function isPositiveBalance(balance) {
|
|
43
|
+
return balance !== "0" && balance[0] !== "-";
|
|
44
|
+
}
|
|
45
|
+
function isNegativeBalance(balance) {
|
|
46
|
+
return balance !== "0" && balance[0] === "-";
|
|
47
|
+
}
|
|
18
48
|
const RippleStateToTrustLine = (ledgerEntry, account) => {
|
|
19
49
|
const parties = [ledgerEntry.HighLimit, ledgerEntry.LowLimit];
|
|
20
50
|
const [self, counterparty] = ledgerEntry.HighLimit.issuer === account ? parties : parties.reverse();
|
package/lib/models/index.d.ts
CHANGED
|
@@ -29,4 +29,5 @@ import parseNFTokenAcceptOffer from "../parse/specification/nftoken-accept-offer
|
|
|
29
29
|
import parseNFTokenCancelOffer from "../parse/specification/nftoken-cancel-offer";
|
|
30
30
|
import parseNFTokenCreateOffer from "../parse/specification/nftoken-create-offer";
|
|
31
31
|
import parseURITokenFlags from "../parse/ledger/uritoken-flags";
|
|
32
|
-
|
|
32
|
+
import parseTrustlineFlags from "../parse/ledger/trustline-flags";
|
|
33
|
+
export { parseNFTokenMint, parseNFTokenBurn, parseNFTokenFlags, parseNFTOfferFlags, parseNFTokenAcceptOffer, parseNFTokenCancelOffer, parseNFTokenCreateOffer, parseURITokenFlags, parseTrustlineFlags, };
|
package/lib/models/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.parseURITokenFlags = exports.parseNFTokenCreateOffer = exports.parseNFTokenCancelOffer = exports.parseNFTokenAcceptOffer = exports.parseNFTOfferFlags = exports.parseNFTokenFlags = exports.parseNFTokenBurn = exports.parseNFTokenMint = exports.parseMPTokenChanges = exports.parseMPTokenIssuanceChanges = exports.parseOrderbookChanges = exports.parseChannelChanges = exports.parseLockedBalanceChanges = exports.parseFinalBalances = exports.parseBalanceChanges = exports.parseURITokenSellOfferChanges = exports.parseURITokenChanges = exports.parseNFTokenOfferChanges = exports.parseNFTokenChanges = exports.parseAffectedObjects = void 0;
|
|
20
|
+
exports.parseTrustlineFlags = exports.parseURITokenFlags = exports.parseNFTokenCreateOffer = exports.parseNFTokenCancelOffer = exports.parseNFTokenAcceptOffer = exports.parseNFTOfferFlags = exports.parseNFTokenFlags = exports.parseNFTokenBurn = exports.parseNFTokenMint = exports.parseMPTokenChanges = exports.parseMPTokenIssuanceChanges = exports.parseOrderbookChanges = exports.parseChannelChanges = exports.parseLockedBalanceChanges = exports.parseFinalBalances = exports.parseBalanceChanges = exports.parseURITokenSellOfferChanges = exports.parseURITokenChanges = exports.parseNFTokenOfferChanges = exports.parseNFTokenChanges = exports.parseAffectedObjects = void 0;
|
|
21
21
|
__exportStar(require("./account_info"), exports);
|
|
22
22
|
__exportStar(require("./account_nfts"), exports);
|
|
23
23
|
__exportStar(require("./account_object"), exports);
|
|
@@ -69,3 +69,5 @@ const nftoken_create_offer_1 = __importDefault(require("../parse/specification/n
|
|
|
69
69
|
exports.parseNFTokenCreateOffer = nftoken_create_offer_1.default;
|
|
70
70
|
const uritoken_flags_1 = __importDefault(require("../parse/ledger/uritoken-flags"));
|
|
71
71
|
exports.parseURITokenFlags = uritoken_flags_1.default;
|
|
72
|
+
const trustline_flags_1 = __importDefault(require("../parse/ledger/trustline-flags"));
|
|
73
|
+
exports.parseTrustlineFlags = trustline_flags_1.default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const trustlines_1 = require("../../types/trustlines");
|
|
4
|
+
const flags_1 = require("./flags");
|
|
5
|
+
function parseTrustlineFlags(value, options = {}) {
|
|
6
|
+
return (0, flags_1.parseFlags)(value, trustlines_1.TrustlineFlagsKeys, options);
|
|
7
|
+
}
|
|
8
|
+
exports.default = parseTrustlineFlags;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import { FormattedIssuedCurrencyAmount, FormattedIssuedMPTAmount } from "../../types";
|
|
2
|
-
|
|
1
|
+
import { IssuedCurrencyAmount, FormattedIssuedCurrencyAmount, FormattedIssuedMPTAmount } from "../../types";
|
|
2
|
+
import { BalanceChanges } from "./balance_changes";
|
|
3
|
+
declare function parseDeliveredAmount(tx: any, balanceChanges: BalanceChanges): IssuedCurrencyAmount | FormattedIssuedCurrencyAmount | FormattedIssuedMPTAmount | undefined;
|
|
3
4
|
export { parseDeliveredAmount };
|
|
@@ -4,41 +4,60 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.parseDeliveredAmount = parseDeliveredAmount;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const client_1 = require("../../client");
|
|
7
9
|
const import_1 = require("../ledger/import");
|
|
8
10
|
const amount_1 = __importDefault(require("../ledger/amount"));
|
|
9
|
-
const utils_1 = require("../utils");
|
|
10
11
|
const balance_changes_1 = require("./balance_changes");
|
|
11
|
-
function parseDeliveredAmount(tx) {
|
|
12
|
-
if (
|
|
12
|
+
function parseDeliveredAmount(tx, balanceChanges) {
|
|
13
|
+
if (tx.meta.TransactionResult !== "tesSUCCESS") {
|
|
13
14
|
return undefined;
|
|
14
15
|
}
|
|
15
|
-
if (tx.
|
|
16
|
-
|
|
16
|
+
if (tx.TransactionType === "Payment") {
|
|
17
|
+
const txBalanceChanges = balanceChanges || (0, balance_changes_1.parseBalanceChanges)(tx.meta, (0, client_1.getNativeCurrency)());
|
|
18
|
+
if (txBalanceChanges) {
|
|
19
|
+
const account = tx.Destination;
|
|
20
|
+
const changes = txBalanceChanges[account];
|
|
21
|
+
if (changes) {
|
|
22
|
+
const positives = changes.filter((change) => change.value[0] !== "-");
|
|
23
|
+
if (positives.length === 1) {
|
|
24
|
+
return positives[0];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (tx.TransactionType === "CheckCash") {
|
|
30
|
+
const txBalanceChanges = balanceChanges || (0, balance_changes_1.parseBalanceChanges)(tx.meta, (0, client_1.getNativeCurrency)());
|
|
31
|
+
if (txBalanceChanges) {
|
|
32
|
+
const account = tx.Account;
|
|
33
|
+
const changes = txBalanceChanges[account];
|
|
34
|
+
if (changes) {
|
|
35
|
+
const positives = changes.filter((change) => change.value[0] !== "-");
|
|
36
|
+
if (positives.length === 1) {
|
|
37
|
+
return positives[0];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (tx.TransactionType === "Import") {
|
|
43
|
+
const txBalanceChanges = balanceChanges || (0, balance_changes_1.parseBalanceChanges)(tx.meta, (0, client_1.getNativeCurrency)());
|
|
44
|
+
const blob = (0, import_1.parseImportBlob)(tx.Blob);
|
|
45
|
+
if (typeof blob === "object") {
|
|
46
|
+
const account = blob.transaction.tx.Account;
|
|
47
|
+
const balanceChange = txBalanceChanges[account];
|
|
48
|
+
if (balanceChange && balanceChange.length === 1) {
|
|
49
|
+
return {
|
|
50
|
+
currency: balanceChange[0].currency,
|
|
51
|
+
value: new bignumber_js_1.default(balanceChange[0].value).abs().toString(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
17
55
|
}
|
|
18
|
-
if (tx.meta.delivered_amount) {
|
|
56
|
+
if (tx.meta.delivered_amount && tx.meta.delivered_amount !== "unavailable") {
|
|
19
57
|
return (0, amount_1.default)(tx.meta.delivered_amount);
|
|
20
58
|
}
|
|
21
59
|
if (tx.meta.DeliveredAmount) {
|
|
22
60
|
return (0, amount_1.default)(tx.meta.DeliveredAmount);
|
|
23
61
|
}
|
|
24
|
-
if (tx.Amount && !(0, utils_1.isPartialPayment)(tx)) {
|
|
25
|
-
return (0, amount_1.default)(tx.Amount);
|
|
26
|
-
}
|
|
27
|
-
if (tx.TransactionType === "Import") {
|
|
28
|
-
const balanceChanges = (0, balance_changes_1.parseBalanceChanges)(tx.meta);
|
|
29
|
-
const blob = (0, import_1.parseImportBlob)(tx.Blob);
|
|
30
|
-
if (typeof blob === "string") {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
const account = blob.transaction.tx.Account;
|
|
34
|
-
const balanceChange = balanceChanges[account];
|
|
35
|
-
if (!balanceChange || balanceChange.length !== 1) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
currency: balanceChange[0].currency,
|
|
40
|
-
value: balanceChange[0].value,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
62
|
return undefined;
|
|
44
63
|
}
|
package/lib/parse/outcome.js
CHANGED
|
@@ -34,11 +34,12 @@ function parseOutcome(tx, nativeCurrency, definitions) {
|
|
|
34
34
|
if (!metadata) {
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
|
+
const balanceChanges = getBalanceChanges(tx, nativeCurrency || (0, client_1.getNativeCurrency)());
|
|
37
38
|
return (0, common_1.removeUndefined)({
|
|
38
39
|
result: tx.meta.TransactionResult,
|
|
39
40
|
timestamp: (0, utils_1.parseTimestamp)(tx.date),
|
|
40
41
|
fee: (0, common_1.dropsToXrp)(tx.Fee),
|
|
41
|
-
balanceChanges
|
|
42
|
+
balanceChanges,
|
|
42
43
|
lockedBalanceChanges: getLockedBalanceChanges(tx),
|
|
43
44
|
orderbookChanges: getOrderbookChanges(tx),
|
|
44
45
|
channelChanges: getChannelChanges(tx),
|
|
@@ -60,7 +61,7 @@ function parseOutcome(tx, nativeCurrency, definitions) {
|
|
|
60
61
|
ledgerIndex: tx.ledger_index || tx.inLedger,
|
|
61
62
|
ledgerVersion: tx.ledger_index || tx.inLedger,
|
|
62
63
|
indexInLedger: tx.meta.TransactionIndex,
|
|
63
|
-
deliveredAmount: (0, index_1.parseDeliveredAmount)(tx),
|
|
64
|
+
deliveredAmount: (0, index_1.parseDeliveredAmount)(tx, balanceChanges),
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
67
|
function getBalanceChanges(tx, nativeCurrency) {
|
package/lib/types/nftokens.d.ts
CHANGED
|
@@ -7,12 +7,14 @@ export declare const NFTokenFlagsKeys: {
|
|
|
7
7
|
onlyXRP: NFTokenMintFlags;
|
|
8
8
|
trustLine: NFTokenMintFlags;
|
|
9
9
|
transferable: NFTokenMintFlags;
|
|
10
|
+
mutable: NFTokenMintFlags;
|
|
10
11
|
};
|
|
11
12
|
export interface NFTokenFlagsKeysInterface {
|
|
12
13
|
burnable?: boolean;
|
|
13
14
|
onlyXRP?: boolean;
|
|
14
15
|
trustLine?: boolean;
|
|
15
16
|
transferable?: boolean;
|
|
17
|
+
mutable?: boolean;
|
|
16
18
|
}
|
|
17
19
|
export declare const NFTokenOfferFlagsKeys: {
|
|
18
20
|
sellToken: NFTokenCreateOfferFlags;
|
package/lib/types/nftokens.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.NFTokenFlagsKeys = {
|
|
|
7
7
|
onlyXRP: xrpl_1.NFTokenMintFlags.tfOnlyXRP,
|
|
8
8
|
trustLine: xrpl_1.NFTokenMintFlags.tfTrustLine,
|
|
9
9
|
transferable: xrpl_1.NFTokenMintFlags.tfTransferable,
|
|
10
|
+
mutable: xrpl_1.NFTokenMintFlags.tfMutable,
|
|
10
11
|
};
|
|
11
12
|
exports.NFTokenOfferFlagsKeys = {
|
|
12
13
|
sellToken: xrpl_1.NFTokenCreateOfferFlags.tfSellNFToken,
|
|
@@ -1,4 +1,31 @@
|
|
|
1
|
+
import { LedgerEntry } from "xrpl";
|
|
1
2
|
import { FormattedBaseSpecification } from "./specification";
|
|
3
|
+
export declare const TrustlineFlagsKeys: {
|
|
4
|
+
lowReserve: LedgerEntry.RippleStateFlags;
|
|
5
|
+
highReserve: LedgerEntry.RippleStateFlags;
|
|
6
|
+
lowAuth: LedgerEntry.RippleStateFlags;
|
|
7
|
+
highAuth: LedgerEntry.RippleStateFlags;
|
|
8
|
+
lowNoRipple: LedgerEntry.RippleStateFlags;
|
|
9
|
+
highNoRipple: LedgerEntry.RippleStateFlags;
|
|
10
|
+
lowFreeze: LedgerEntry.RippleStateFlags;
|
|
11
|
+
highFreeze: LedgerEntry.RippleStateFlags;
|
|
12
|
+
ammNode: LedgerEntry.RippleStateFlags;
|
|
13
|
+
lowDeepFreeze: LedgerEntry.RippleStateFlags;
|
|
14
|
+
highDeepFreeze: LedgerEntry.RippleStateFlags;
|
|
15
|
+
};
|
|
16
|
+
export interface TrustlineFlagsKeysInterface {
|
|
17
|
+
lowReserve: boolean;
|
|
18
|
+
highReserve: boolean;
|
|
19
|
+
lowAuth: boolean;
|
|
20
|
+
highAuth: boolean;
|
|
21
|
+
lowNoRipple: boolean;
|
|
22
|
+
highNoRipple: boolean;
|
|
23
|
+
lowFreeze: boolean;
|
|
24
|
+
highFreeze: boolean;
|
|
25
|
+
ammNode: boolean;
|
|
26
|
+
lowDeepFreeze: boolean;
|
|
27
|
+
highDeepFreeze: boolean;
|
|
28
|
+
}
|
|
2
29
|
export interface Trustline {
|
|
3
30
|
account: string;
|
|
4
31
|
balance: string;
|
package/lib/types/trustlines.js
CHANGED
|
@@ -1,2 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TrustlineFlagsKeys = void 0;
|
|
4
|
+
const xrpl_1 = require("xrpl");
|
|
5
|
+
const { RippleStateFlags } = xrpl_1.LedgerEntry;
|
|
6
|
+
exports.TrustlineFlagsKeys = {
|
|
7
|
+
lowReserve: RippleStateFlags.lsfLowReserve,
|
|
8
|
+
highReserve: RippleStateFlags.lsfHighReserve,
|
|
9
|
+
lowAuth: RippleStateFlags.lsfLowAuth,
|
|
10
|
+
highAuth: RippleStateFlags.lsfHighAuth,
|
|
11
|
+
lowNoRipple: RippleStateFlags.lsfLowNoRipple,
|
|
12
|
+
highNoRipple: RippleStateFlags.lsfHighNoRipple,
|
|
13
|
+
lowFreeze: RippleStateFlags.lsfLowFreeze,
|
|
14
|
+
highFreeze: RippleStateFlags.lsfHighFreeze,
|
|
15
|
+
ammNode: RippleStateFlags.lsfAMMNode,
|
|
16
|
+
lowDeepFreeze: RippleStateFlags.lsfLowDeepFreeze,
|
|
17
|
+
highDeepFreeze: RippleStateFlags.lsfHighDeepFreeze,
|
|
18
|
+
};
|
package/lib/validator.js
CHANGED
|
@@ -61,7 +61,7 @@ function classicAddressFromValidatorPK(pk) {
|
|
|
61
61
|
assert.ok(pubkey.length === 33);
|
|
62
62
|
assert.ok(Crypto.getHashes().includes("sha256"));
|
|
63
63
|
assert.ok(Crypto.getHashes().includes("ripemd160"));
|
|
64
|
-
const pubkeyInnerHash = Crypto.createHash("sha256").update(
|
|
64
|
+
const pubkeyInnerHash = Crypto.createHash("sha256").update(pubkey);
|
|
65
65
|
const pubkeyOuterHash = Crypto.createHash("ripemd160");
|
|
66
66
|
pubkeyOuterHash.update(pubkeyInnerHash.digest());
|
|
67
67
|
const accountID = pubkeyOuterHash.digest();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bithomp/xrpl-api",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.17",
|
|
4
4
|
"description": "A Bithomp JavaScript/TypeScript library for interacting with the XRP Ledger",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"lib/**/*"
|
|
53
53
|
],
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"axios": "^1.
|
|
56
|
-
"base-x": "^5.0.
|
|
55
|
+
"axios": "^1.8.2",
|
|
56
|
+
"base-x": "^5.0.1",
|
|
57
57
|
"bignumber.js": "^9.1.2",
|
|
58
58
|
"elliptic": "^6.6.1",
|
|
59
59
|
"lodash": "^4.17.21",
|
|
@@ -62,27 +62,27 @@
|
|
|
62
62
|
"xrpl": "^4.2.0"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
|
-
"@eslint/eslintrc": "^3.
|
|
66
|
-
"@types/chai": "^5.0
|
|
65
|
+
"@eslint/eslintrc": "^3.3.0",
|
|
66
|
+
"@types/chai": "^5.2.0",
|
|
67
67
|
"@types/chai-as-promised": "^8.0.1",
|
|
68
|
-
"@types/lodash": "^4.17.
|
|
68
|
+
"@types/lodash": "^4.17.16",
|
|
69
69
|
"@types/mocha": "^10.0.10",
|
|
70
70
|
"@types/nconf": "^0.10.7",
|
|
71
|
-
"@types/node": "^22.13.
|
|
72
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
73
|
-
"@typescript-eslint/parser": "^8.
|
|
71
|
+
"@types/node": "^22.13.10",
|
|
72
|
+
"@typescript-eslint/eslint-plugin": "^8.26.0",
|
|
73
|
+
"@typescript-eslint/parser": "^8.26.0",
|
|
74
74
|
"chai": "^4.5.0",
|
|
75
75
|
"chai-as-promised": "^7.1.2",
|
|
76
|
-
"eslint": "^9.
|
|
77
|
-
"eslint-config-prettier": "^10.
|
|
76
|
+
"eslint": "^9.22.0",
|
|
77
|
+
"eslint-config-prettier": "^10.1.1",
|
|
78
78
|
"eslint-plugin-chai-friendly": "^1.0.1",
|
|
79
79
|
"eslint-plugin-import": "^2.31.0",
|
|
80
|
-
"eslint-plugin-n": "^17.
|
|
80
|
+
"eslint-plugin-n": "^17.16.2",
|
|
81
81
|
"eslint-plugin-promise": "^7.2.1",
|
|
82
82
|
"mocha": "^11.1.0",
|
|
83
83
|
"nconf": "^0.12.1",
|
|
84
|
-
"ts-jest": "^29.2.
|
|
84
|
+
"ts-jest": "^29.2.6",
|
|
85
85
|
"ts-node": "^10.9.2",
|
|
86
|
-
"typescript": "^5.
|
|
86
|
+
"typescript": "^5.8.2"
|
|
87
87
|
}
|
|
88
88
|
}
|