@cranberry-money/shared-utils 8.23.471 → 8.23.473
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/holdings.d.ts +12 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +72 -0
- package/dist/holdings.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/wallet.d.ts +11 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +28 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HoldingWithWallet, HoldingsSummary, AssetAllocationItem } from '@cranberry-money/shared-types';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate holdings summary with asset type breakdown.
|
|
4
|
+
* Groups holdings by asset type and calculates totals.
|
|
5
|
+
*/
|
|
6
|
+
export declare function calculateHoldingsSummary(holdings: HoldingWithWallet[], walletsCount: number): HoldingsSummary;
|
|
7
|
+
/**
|
|
8
|
+
* Calculate asset allocation from holdings.
|
|
9
|
+
* Groups holdings by asset UUID (aggregating across wallets) and calculates percentages.
|
|
10
|
+
*/
|
|
11
|
+
export declare function calculateAssetAllocation(holdings: HoldingWithWallet[], totalValue: number): AssetAllocationItem[];
|
|
12
|
+
//# sourceMappingURL=holdings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"holdings.d.ts","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAEf,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,YAAY,EAAE,MAAM,GACnB,eAAe,CAgCjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,UAAU,EAAE,MAAM,GACjB,mBAAmB,EAAE,CAmCvB"}
|
package/dist/holdings.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getHoldingAssetTypeLabel, HOLDING_ASSET_TYPE, getChartColor } from '@cranberry-money/shared-constants';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate holdings summary with asset type breakdown.
|
|
4
|
+
* Groups holdings by asset type and calculates totals.
|
|
5
|
+
*/
|
|
6
|
+
export function calculateHoldingsSummary(holdings, walletsCount) {
|
|
7
|
+
const assetTypeMap = new Map();
|
|
8
|
+
let totalValue = 0;
|
|
9
|
+
for (const holding of holdings) {
|
|
10
|
+
const value = parseFloat(holding.marketValue) || 0;
|
|
11
|
+
const assetType = holding.asset?.assetType || HOLDING_ASSET_TYPE.ERC20_TOKEN;
|
|
12
|
+
totalValue += value;
|
|
13
|
+
const existing = assetTypeMap.get(assetType) || { totalValue: 0, holdingsCount: 0 };
|
|
14
|
+
assetTypeMap.set(assetType, {
|
|
15
|
+
totalValue: existing.totalValue + value,
|
|
16
|
+
holdingsCount: existing.holdingsCount + 1,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const byAssetType = Array.from(assetTypeMap.entries())
|
|
20
|
+
.map(([assetType, data]) => ({
|
|
21
|
+
assetType,
|
|
22
|
+
label: getHoldingAssetTypeLabel(assetType),
|
|
23
|
+
totalValue: data.totalValue,
|
|
24
|
+
holdingsCount: data.holdingsCount,
|
|
25
|
+
}))
|
|
26
|
+
.sort((a, b) => b.totalValue - a.totalValue);
|
|
27
|
+
return {
|
|
28
|
+
totalValue,
|
|
29
|
+
holdingsCount: holdings.length,
|
|
30
|
+
walletsCount,
|
|
31
|
+
byAssetType,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate asset allocation from holdings.
|
|
36
|
+
* Groups holdings by asset UUID (aggregating across wallets) and calculates percentages.
|
|
37
|
+
*/
|
|
38
|
+
export function calculateAssetAllocation(holdings, totalValue) {
|
|
39
|
+
if (totalValue === 0)
|
|
40
|
+
return [];
|
|
41
|
+
const assetMap = new Map();
|
|
42
|
+
for (const holding of holdings) {
|
|
43
|
+
const assetUuid = holding.asset?.uuid || holding.assetSymbol;
|
|
44
|
+
const value = parseFloat(holding.marketValue) || 0;
|
|
45
|
+
const existing = assetMap.get(assetUuid);
|
|
46
|
+
if (existing) {
|
|
47
|
+
existing.totalValue += value;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
assetMap.set(assetUuid, {
|
|
51
|
+
symbol: holding.assetSymbol || holding.asset?.symbol || 'Unknown',
|
|
52
|
+
name: holding.assetName || holding.asset?.name || 'Unknown Asset',
|
|
53
|
+
totalValue: value,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return Array.from(assetMap.entries())
|
|
58
|
+
.map(([assetUuid, data], index) => ({
|
|
59
|
+
assetUuid,
|
|
60
|
+
symbol: data.symbol,
|
|
61
|
+
name: data.name,
|
|
62
|
+
totalValue: data.totalValue,
|
|
63
|
+
percentage: (data.totalValue / totalValue) * 100,
|
|
64
|
+
color: getChartColor(index),
|
|
65
|
+
}))
|
|
66
|
+
.sort((a, b) => b.totalValue - a.totalValue)
|
|
67
|
+
.map((item, index) => ({
|
|
68
|
+
...item,
|
|
69
|
+
color: getChartColor(index),
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=holdings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"holdings.js","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { validateUserProfileField } from './user-validation';
|
|
|
11
11
|
export { getUserVerificationStatus, type VerificationStatusType } from './user-verification';
|
|
12
12
|
export { getNextPageFromUrl, getNextPageParam } from './pagination';
|
|
13
13
|
export { createUserFriendlyError, isUserFriendlyError, getErrorMessage } from './errors';
|
|
14
|
+
export { calculateHoldingsSummary, calculateAssetAllocation } from './holdings';
|
|
15
|
+
export { calculateWalletTotals, filterWalletsByChain } from './wallet';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACvH,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACvH,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,4 +11,6 @@ export { validateUserProfileField } from './user-validation';
|
|
|
11
11
|
export { getUserVerificationStatus } from './user-verification';
|
|
12
12
|
export { getNextPageFromUrl, getNextPageParam } from './pagination';
|
|
13
13
|
export { createUserFriendlyError, isUserFriendlyError, getErrorMessage } from './errors';
|
|
14
|
+
export { calculateHoldingsSummary, calculateAssetAllocation } from './holdings';
|
|
15
|
+
export { calculateWalletTotals, filterWalletsByChain } from './wallet';
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAkB,MAAM,QAAQ,CAAC;AACvH,OAAO,EACL,cAAc,EAEd,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAA+B,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAkB,MAAM,QAAQ,CAAC;AACvH,OAAO,EACL,cAAc,EAEd,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAA+B,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/wallet.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Wallet, WalletTotals } from '@cranberry-money/shared-types';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate aggregated wallet totals by blockchain type.
|
|
4
|
+
* Sums native balances and market values for BTC and ETH wallets.
|
|
5
|
+
*/
|
|
6
|
+
export declare function calculateWalletTotals(wallets: Wallet[]): WalletTotals;
|
|
7
|
+
/**
|
|
8
|
+
* Filter wallets by blockchain type.
|
|
9
|
+
*/
|
|
10
|
+
export declare function filterWalletsByChain(wallets: Wallet[], blockchain: string): Wallet[];
|
|
11
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,CAmBrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpF"}
|
package/dist/wallet.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getChainName, BLOCKCHAIN } from '@cranberry-money/shared-constants';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate aggregated wallet totals by blockchain type.
|
|
4
|
+
* Sums native balances and market values for BTC and ETH wallets.
|
|
5
|
+
*/
|
|
6
|
+
export function calculateWalletTotals(wallets) {
|
|
7
|
+
return wallets.reduce((acc, wallet) => {
|
|
8
|
+
const balance = parseFloat(wallet.nativeBalance) || 0;
|
|
9
|
+
const marketValue = parseFloat(wallet.marketValue) || 0;
|
|
10
|
+
const chain = getChainName(wallet.chain);
|
|
11
|
+
if (chain === BLOCKCHAIN.BITCOIN) {
|
|
12
|
+
acc.btc += balance;
|
|
13
|
+
acc.btcMarketValue += marketValue;
|
|
14
|
+
}
|
|
15
|
+
else if (chain === BLOCKCHAIN.ETHEREUM) {
|
|
16
|
+
acc.eth += balance;
|
|
17
|
+
acc.ethMarketValue += marketValue;
|
|
18
|
+
}
|
|
19
|
+
return acc;
|
|
20
|
+
}, { btc: 0, eth: 0, btcMarketValue: 0, ethMarketValue: 0 });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Filter wallets by blockchain type.
|
|
24
|
+
*/
|
|
25
|
+
export function filterWalletsByChain(wallets, blockchain) {
|
|
26
|
+
return wallets.filter((w) => getChainName(w.chain) === blockchain);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAG7E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAiB;IACrD,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,KAAK,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;YACjC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC;YACnB,GAAG,CAAC,cAAc,IAAI,WAAW,CAAC;QACpC,CAAC;aAAM,IAAI,KAAK,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;YACzC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC;YACnB,GAAG,CAAC,cAAc,IAAI,WAAW,CAAC;QACpC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAiB,EAAE,UAAkB;IACxE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,CAAC;AACrE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cranberry-money/shared-utils",
|
|
3
|
-
"version": "8.23.
|
|
3
|
+
"version": "8.23.473",
|
|
4
4
|
"description": "Shared utility functions for Blueberry platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"prepublishOnly": "npm run clean && npm run typecheck && npm test && npm run build"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@cranberry-money/shared-constants": "^8.15.
|
|
33
|
-
"@cranberry-money/shared-types": "^8.22.
|
|
32
|
+
"@cranberry-money/shared-constants": "^8.15.498",
|
|
33
|
+
"@cranberry-money/shared-types": "^8.22.473"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/jest": "^30.0.0",
|