@cranberry-money/shared-utils 8.17.39 → 8.17.40

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.
@@ -9,37 +9,4 @@
9
9
  * @param filename - The filename for the downloaded file
10
10
  */
11
11
  export declare function downloadBlob(blob: Blob, filename: string): void;
12
- /**
13
- * Download text content as a file
14
- * @param content - Text content to download
15
- * @param filename - The filename for the downloaded file
16
- * @param mimeType - MIME type for the file (default: text/plain)
17
- */
18
- export declare function downloadTextFile(content: string, filename: string, mimeType?: string): void;
19
- /**
20
- * Download JSON data as a file
21
- * @param data - JavaScript object to serialize and download
22
- * @param filename - The filename for the downloaded file (should end with .json)
23
- */
24
- export declare function downloadJsonFile(data: unknown, filename: string): void;
25
- /**
26
- * Generate a timestamped filename
27
- * @param baseName - Base name for the file (without extension)
28
- * @param extension - File extension (with or without leading dot)
29
- * @param includeTime - Whether to include time in timestamp (default: false)
30
- * @returns Timestamped filename
31
- */
32
- export declare function generateTimestampedFilename(baseName: string, extension: string, includeTime?: boolean): string;
33
- /**
34
- * Download data URL as a file
35
- * @param dataUrl - Data URL (data:mime/type;base64,data)
36
- * @param filename - The filename for the downloaded file
37
- */
38
- export declare function downloadDataUrl(dataUrl: string, filename: string): void;
39
- /**
40
- * Download CSV data as a file
41
- * @param data - Array of objects to convert to CSV
42
- * @param filename - The filename for the downloaded file (should end with .csv)
43
- * @param headers - Optional custom headers (uses object keys if not provided)
44
- */
45
- export declare function downloadCsvFile<T extends Record<string, unknown>>(data: T[], filename: string, headers?: string[]): void;
12
+ //# sourceMappingURL=downloads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAqB,GAAG,IAAI,CAGzG;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE,OAAe,GAAG,MAAM,CASrH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,IAAI,CAqBN"}
1
+ {"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS/D"}
package/dist/downloads.js CHANGED
@@ -18,74 +18,3 @@ export function downloadBlob(blob, filename) {
18
18
  document.body.removeChild(link);
19
19
  window.URL.revokeObjectURL(url);
20
20
  }
21
- /**
22
- * Download text content as a file
23
- * @param content - Text content to download
24
- * @param filename - The filename for the downloaded file
25
- * @param mimeType - MIME type for the file (default: text/plain)
26
- */
27
- export function downloadTextFile(content, filename, mimeType = 'text/plain') {
28
- const blob = new Blob([content], { type: mimeType });
29
- downloadBlob(blob, filename);
30
- }
31
- /**
32
- * Download JSON data as a file
33
- * @param data - JavaScript object to serialize and download
34
- * @param filename - The filename for the downloaded file (should end with .json)
35
- */
36
- export function downloadJsonFile(data, filename) {
37
- const jsonString = JSON.stringify(data, null, 2);
38
- downloadTextFile(jsonString, filename, 'application/json');
39
- }
40
- /**
41
- * Generate a timestamped filename
42
- * @param baseName - Base name for the file (without extension)
43
- * @param extension - File extension (with or without leading dot)
44
- * @param includeTime - Whether to include time in timestamp (default: false)
45
- * @returns Timestamped filename
46
- */
47
- export function generateTimestampedFilename(baseName, extension, includeTime = false) {
48
- const now = new Date();
49
- const dateString = now.toISOString().split('T')[0]; // YYYY-MM-DD
50
- const timeString = now.toTimeString().split(' ')[0]?.replace(/:/g, '-') || '00-00-00'; // HH-MM-SS
51
- const cleanExtension = extension.startsWith('.') ? extension : `.${extension}`;
52
- const timestamp = includeTime ? `${dateString}-${timeString}` : dateString;
53
- return `${baseName}-${timestamp}${cleanExtension}`;
54
- }
55
- /**
56
- * Download data URL as a file
57
- * @param dataUrl - Data URL (data:mime/type;base64,data)
58
- * @param filename - The filename for the downloaded file
59
- */
60
- export function downloadDataUrl(dataUrl, filename) {
61
- const link = document.createElement('a');
62
- link.href = dataUrl;
63
- link.setAttribute('download', filename);
64
- document.body.appendChild(link);
65
- link.click();
66
- document.body.removeChild(link);
67
- }
68
- /**
69
- * Download CSV data as a file
70
- * @param data - Array of objects to convert to CSV
71
- * @param filename - The filename for the downloaded file (should end with .csv)
72
- * @param headers - Optional custom headers (uses object keys if not provided)
73
- */
74
- export function downloadCsvFile(data, filename, headers) {
75
- if (data.length === 0) {
76
- throw new Error('Cannot create CSV from empty data array');
77
- }
78
- const csvHeaders = headers || Object.keys(data[0] || {});
79
- const csvRows = data.map(row => csvHeaders
80
- .map(header => {
81
- const value = row[header];
82
- // Escape commas and quotes in CSV values
83
- const stringValue = String(value ?? '');
84
- return stringValue.includes(',') || stringValue.includes('"')
85
- ? `"${stringValue.replace(/"/g, '""')}"`
86
- : stringValue;
87
- })
88
- .join(','));
89
- const csvContent = [csvHeaders.join(','), ...csvRows].join('\n');
90
- downloadTextFile(csvContent, filename, 'text/csv');
91
- }
@@ -1,21 +1,4 @@
1
1
  import type { AssetHolding } from '@cranberry-money/shared-types';
2
- import { type SortDirection } from '@cranberry-money/shared-constants';
3
- /**
4
- * Calculates the total portfolio value based on holdings and instrument prices
5
- *
6
- * @param holdings - Array of asset holdings
7
- * @param prices - Map of instrument UUIDs to their current prices
8
- * @returns Total portfolio value
9
- *
10
- * @example
11
- * const holdings = [
12
- * { instrument: { uuid: '123' }, quantity: 100 },
13
- * { instrument: { uuid: '456' }, quantity: 50 }
14
- * ];
15
- * const prices = { '123': 10.50, '456': 25.00 };
16
- * calculatePortfolioValue(holdings, prices); // returns 2300
17
- */
18
- export declare const calculatePortfolioValue: (holdings: readonly AssetHolding[], prices: Record<string, number>) => number;
19
2
  /**
20
3
  * Calculates holding allocation percentages within a portfolio
21
4
  *
@@ -30,49 +13,4 @@ export declare const calculatePortfolioValue: (holdings: readonly AssetHolding[]
30
13
  * calculateHoldingAllocations(holdings); // returns { '123': 50, '456': 50 }
31
14
  */
32
15
  export declare const calculateHoldingAllocations: (holdings: readonly AssetHolding[]) => Record<string, number>;
33
- /**
34
- * Groups holdings by instrument UUID for aggregated view
35
- *
36
- * @param holdings - Array of asset holdings to group
37
- * @returns Map of instrument UUIDs to their holdings arrays
38
- *
39
- * @example
40
- * const holdings = [
41
- * { instrument: { uuid: '123' }, quantity: 100 },
42
- * { instrument: { uuid: '123' }, quantity: 50 },
43
- * { instrument: { uuid: '456' }, quantity: 200 }
44
- * ];
45
- * groupHoldingsByInstrument(holdings);
46
- * // returns { '123': [holding1, holding2], '456': [holding3] }
47
- */
48
- export declare const groupHoldingsByInstrument: (holdings: readonly AssetHolding[]) => Record<string, AssetHolding[]>;
49
- /**
50
- * Filters holdings with quantities above a threshold
51
- *
52
- * @param holdings - Array of asset holdings
53
- * @param minQuantity - Minimum quantity threshold
54
- * @returns Filtered array of holdings
55
- *
56
- * @example
57
- * const holdings = [
58
- * { quantity: 100 },
59
- * { quantity: 50 },
60
- * { quantity: 200 }
61
- * ];
62
- * filterHoldingsByMinQuantity(holdings, 75); // returns holdings with quantity >= 75
63
- */
64
- export declare const filterHoldingsByMinQuantity: (holdings: readonly AssetHolding[], minQuantity: number) => AssetHolding[];
65
- /**
66
- * Sorts holdings by various criteria
67
- *
68
- * @param holdings - Array of asset holdings to sort
69
- * @param sortBy - Field to sort by
70
- * @param direction - Sort direction (ascending or descending)
71
- * @returns Sorted array of holdings
72
- *
73
- * @example
74
- * const holdings = [...];
75
- * sortHoldings(holdings, 'quantity', 'desc'); // Sort by quantity descending
76
- * sortHoldings(holdings, 'symbol', 'asc'); // Sort by symbol ascending
77
- */
78
- export declare const sortHoldings: (holdings: readonly AssetHolding[], sortBy: "quantity" | "symbol" | "name" | "createdAt", direction?: SortDirection) => AssetHolding[];
16
+ //# sourceMappingURL=holdings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"holdings.d.ts","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAG3C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,GAAI,UAAU,SAAS,YAAY,EAAE,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAK3G,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,2BAA2B,GAAI,UAAU,SAAS,YAAY,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAWpG,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,GAAI,UAAU,SAAS,YAAY,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAY1G,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GAAI,UAAU,SAAS,YAAY,EAAE,EAAE,aAAa,MAAM,KAAG,YAAY,EAEhH,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,SAAS,YAAY,EAAE,EACjC,QAAQ,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,EACpD,YAAW,aAAmC,KAC7C,YAAY,EA0Cd,CAAC"}
1
+ {"version":3,"file":"holdings.d.ts","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,2BAA2B,GAAI,UAAU,SAAS,YAAY,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAWpG,CAAC"}
package/dist/holdings.js CHANGED
@@ -1,26 +1,3 @@
1
- import { DEFAULT_NUMERIC_ZERO, SORT_DIRECTION_ASC, SORT_DIRECTION_DESC, } from '@cranberry-money/shared-constants';
2
- import { sortByStringField } from './collections';
3
- /**
4
- * Calculates the total portfolio value based on holdings and instrument prices
5
- *
6
- * @param holdings - Array of asset holdings
7
- * @param prices - Map of instrument UUIDs to their current prices
8
- * @returns Total portfolio value
9
- *
10
- * @example
11
- * const holdings = [
12
- * { instrument: { uuid: '123' }, quantity: 100 },
13
- * { instrument: { uuid: '456' }, quantity: 50 }
14
- * ];
15
- * const prices = { '123': 10.50, '456': 25.00 };
16
- * calculatePortfolioValue(holdings, prices); // returns 2300
17
- */
18
- export const calculatePortfolioValue = (holdings, prices) => {
19
- return holdings.reduce((total, holding) => {
20
- const price = prices[holding.instrument.uuid] || DEFAULT_NUMERIC_ZERO;
21
- return total + holding.quantity * price;
22
- }, 0);
23
- };
24
1
  /**
25
2
  * Calculates holding allocation percentages within a portfolio
26
3
  *
@@ -44,96 +21,3 @@ export const calculateHoldingAllocations = (holdings) => {
44
21
  });
45
22
  return allocations;
46
23
  };
47
- /**
48
- * Groups holdings by instrument UUID for aggregated view
49
- *
50
- * @param holdings - Array of asset holdings to group
51
- * @returns Map of instrument UUIDs to their holdings arrays
52
- *
53
- * @example
54
- * const holdings = [
55
- * { instrument: { uuid: '123' }, quantity: 100 },
56
- * { instrument: { uuid: '123' }, quantity: 50 },
57
- * { instrument: { uuid: '456' }, quantity: 200 }
58
- * ];
59
- * groupHoldingsByInstrument(holdings);
60
- * // returns { '123': [holding1, holding2], '456': [holding3] }
61
- */
62
- export const groupHoldingsByInstrument = (holdings) => {
63
- return holdings.reduce((groups, holding) => {
64
- const instrumentUuid = holding.instrument.uuid;
65
- if (!groups[instrumentUuid]) {
66
- groups[instrumentUuid] = [];
67
- }
68
- groups[instrumentUuid].push(holding);
69
- return groups;
70
- }, {});
71
- };
72
- /**
73
- * Filters holdings with quantities above a threshold
74
- *
75
- * @param holdings - Array of asset holdings
76
- * @param minQuantity - Minimum quantity threshold
77
- * @returns Filtered array of holdings
78
- *
79
- * @example
80
- * const holdings = [
81
- * { quantity: 100 },
82
- * { quantity: 50 },
83
- * { quantity: 200 }
84
- * ];
85
- * filterHoldingsByMinQuantity(holdings, 75); // returns holdings with quantity >= 75
86
- */
87
- export const filterHoldingsByMinQuantity = (holdings, minQuantity) => {
88
- return holdings.filter(holding => holding.quantity >= minQuantity);
89
- };
90
- /**
91
- * Sorts holdings by various criteria
92
- *
93
- * @param holdings - Array of asset holdings to sort
94
- * @param sortBy - Field to sort by
95
- * @param direction - Sort direction (ascending or descending)
96
- * @returns Sorted array of holdings
97
- *
98
- * @example
99
- * const holdings = [...];
100
- * sortHoldings(holdings, 'quantity', 'desc'); // Sort by quantity descending
101
- * sortHoldings(holdings, 'symbol', 'asc'); // Sort by symbol ascending
102
- */
103
- export const sortHoldings = (holdings, sortBy, direction = SORT_DIRECTION_DESC) => {
104
- // Use shared utility for string field sorting
105
- if (sortBy === 'symbol') {
106
- const sorted = sortByStringField([...holdings], 'instrumentSymbol');
107
- return direction === SORT_DIRECTION_ASC ? sorted : sorted.reverse();
108
- }
109
- if (sortBy === 'name') {
110
- const sorted = sortByStringField([...holdings], 'instrumentName');
111
- return direction === SORT_DIRECTION_ASC ? sorted : sorted.reverse();
112
- }
113
- // Custom logic for non-string fields
114
- return [...holdings].sort((a, b) => {
115
- let valueA;
116
- let valueB;
117
- switch (sortBy) {
118
- case 'quantity':
119
- valueA = a.quantity;
120
- valueB = b.quantity;
121
- break;
122
- case 'createdAt':
123
- valueA = a.createdAt;
124
- valueB = b.createdAt;
125
- break;
126
- default:
127
- return 0;
128
- }
129
- if (typeof valueA === 'string' && typeof valueB === 'string') {
130
- const comparison = valueA.localeCompare(valueB);
131
- return direction === SORT_DIRECTION_ASC ? comparison : -comparison;
132
- }
133
- if (typeof valueA === 'number' && typeof valueB === 'number') {
134
- const comparison = valueA - valueB;
135
- return direction === SORT_DIRECTION_ASC ? comparison : -comparison;
136
- }
137
- return 0;
138
- });
139
- };
package/dist/index.d.ts CHANGED
@@ -15,20 +15,13 @@ export { isNumericOnly, validatePassword, isValidTokenFormat, formatVerification
15
15
  export { hasActiveFilters, countActiveFilters, clearAllFilters, updateFilters, isFilterEmpty, removeEmptyFilters, mergeFilters, areFiltersEqual, createFilterPredicate, hasActiveInstrumentFilters, countActiveInstrumentFilters, hasActiveTradeFilters, countActiveTradeFilters, hasActiveTransactionFilters, countActiveTransactionFilters, hasActiveTargetTradeFilters, countActiveTargetTradeFilters, } from './filters';
16
16
  export { isTokenExpired, isTokenExpiringSoon, getTimeUntilExpiry, formatTimeUntilExpiry, parseDeviceInfo, isRefreshSuccess, getRefreshErrorMessage, createAutoRefreshHandler, } from './auth';
17
17
  export { formatInstrumentPrice, getCurrencySymbol } from './instruments';
18
- export { sortByStringField, filterByTextSearch, filterByBooleanField, findByField, findByStringField, extractAndSortField, groupByFirstLetter, groupByField, hasItemWithFieldValue, countByFieldValue, } from './collections';
19
- export { downloadBlob, downloadTextFile, downloadJsonFile, generateTimestampedFilename, downloadDataUrl, downloadCsvFile, } from './downloads';
18
+ export { downloadBlob } from './downloads';
20
19
  export { formatQuantityWithSuffix } from './numbers';
21
20
  export { validateAllocations } from './allocations';
22
- export { calculatePortfolioValue, calculateHoldingAllocations, groupHoldingsByInstrument, filterHoldingsByMinQuantity, sortHoldings, } from './holdings';
21
+ export { calculateHoldingAllocations } from './holdings';
23
22
  export { processAllocationData, calculateTotals, formatPercentage, formatDashboardCurrency, type AllocationDisplayItem, } from './dashboard';
24
23
  export { isValidTemplateSelection, validatePortfolioSelection, type PortfolioSelectionValidation, type PortfolioSelectionState, } from './portfolio-validation';
25
24
  export { getStatusColor, getStatusLabel, getWithdrawalTypeLabel, getReasonLabel, getLiquidationStatusColor, getLiquidationStatusLabel, type WithdrawalStatus, type WithdrawalType, type WithdrawalReason, type LiquidationStatus, } from './withdrawal-status';
26
- export { findPrimaryTaxResidency, filterTaxResidenciesByCountry, hasTaxResidencyInCountry, getNonExemptedTaxResidencies, type BaseTaxResidency, } from './tax-residency';
27
- export { getCountriesFromExchanges, groupExchangesByCountry, findExchangeByShortName, sortExchangesByName, filterExchangesByCountry, type BaseCountry, type BaseStockExchange, type SortDirection, } from './stock-exchange';
28
- export { sortSectorsByName, filterSectorsByName, findSectorByName, getSectorNames, groupSectorsAlphabetically, sectorExists, findSectorsByPartialName, type BaseSector, } from './sector';
29
- export { generateDocumentFilename, formatDocumentType, formatDocumentStatus } from './document';
30
- export { sortIndustriesByName, filterIndustriesByName, filterIndustriesBySector, findIndustryByName, getIndustryNames, groupIndustriesBySector, groupIndustriesAlphabetically, getIndustriesWithoutSector, getIndustriesWithSector, countIndustriesBySector, isIndustryInSector, type BaseIndustry, } from './industry';
31
- export { sortCountriesByName, filterCountriesByName, filterAvailableCountries, findCountryByName, findCountryByCode, getCountryNames, groupCountriesAlphabetically, formatCountryWithDialCode, isCountryAvailable, type BaseCountry as BaseCountryType, } from './country';
32
25
  export { calculateTotalAllocation, validateAllocationPercentages, formatRiskLevelDisplay, type BaseAllocation, } from './portfolio-template';
33
26
  export { validateInvestmentAmount, formatInvestmentAmount } from './investment-preference';
34
27
  export { formatBalance, formatTransactionAmount, getTransactionTypeLabel, type BaseTransactionType, } from './cash-account';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGjF,OAAO,EACL,8BAA8B,EAC9B,qCAAqC,EACrC,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnE,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhH,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGpF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,GACX,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,qBAAqB,EAErB,0BAA0B,EAC1B,4BAA4B,EAC5B,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAG3F,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -28,34 +28,20 @@ hasActiveInstrumentFilters, countActiveInstrumentFilters, hasActiveTradeFilters,
28
28
  export { isTokenExpired, isTokenExpiringSoon, getTimeUntilExpiry, formatTimeUntilExpiry, parseDeviceInfo, isRefreshSuccess, getRefreshErrorMessage, createAutoRefreshHandler, } from './auth';
29
29
  // Instrument utilities
30
30
  export { formatInstrumentPrice, getCurrencySymbol } from './instruments';
31
- // Collection utilities
32
- export { sortByStringField, filterByTextSearch, filterByBooleanField, findByField, findByStringField, extractAndSortField, groupByFirstLetter, groupByField, hasItemWithFieldValue, countByFieldValue, } from './collections';
33
31
  // Download utilities
34
- export { downloadBlob, downloadTextFile, downloadJsonFile, generateTimestampedFilename, downloadDataUrl, downloadCsvFile, } from './downloads';
32
+ export { downloadBlob } from './downloads';
35
33
  // Number formatting utilities
36
34
  export { formatQuantityWithSuffix } from './numbers';
37
35
  // Allocation utilities
38
36
  export { validateAllocations } from './allocations';
39
37
  // Holdings utilities
40
- export { calculatePortfolioValue, calculateHoldingAllocations, groupHoldingsByInstrument, filterHoldingsByMinQuantity, sortHoldings, } from './holdings';
38
+ export { calculateHoldingAllocations } from './holdings';
41
39
  // Dashboard utilities
42
40
  export { processAllocationData, calculateTotals, formatPercentage, formatDashboardCurrency, } from './dashboard';
43
41
  // Portfolio validation utilities
44
42
  export { isValidTemplateSelection, validatePortfolioSelection, } from './portfolio-validation';
45
43
  // Withdrawal status utilities
46
44
  export { getStatusColor, getStatusLabel, getWithdrawalTypeLabel, getReasonLabel, getLiquidationStatusColor, getLiquidationStatusLabel, } from './withdrawal-status';
47
- // Tax residency utilities
48
- export { findPrimaryTaxResidency, filterTaxResidenciesByCountry, hasTaxResidencyInCountry, getNonExemptedTaxResidencies, } from './tax-residency';
49
- // Stock exchange utilities
50
- export { getCountriesFromExchanges, groupExchangesByCountry, findExchangeByShortName, sortExchangesByName, filterExchangesByCountry, } from './stock-exchange';
51
- // Sector utilities
52
- export { sortSectorsByName, filterSectorsByName, findSectorByName, getSectorNames, groupSectorsAlphabetically, sectorExists, findSectorsByPartialName, } from './sector';
53
- // Document utilities
54
- export { generateDocumentFilename, formatDocumentType, formatDocumentStatus } from './document';
55
- // Industry utilities
56
- export { sortIndustriesByName, filterIndustriesByName, filterIndustriesBySector, findIndustryByName, getIndustryNames, groupIndustriesBySector, groupIndustriesAlphabetically, getIndustriesWithoutSector, getIndustriesWithSector, countIndustriesBySector, isIndustryInSector, } from './industry';
57
- // Country utilities
58
- export { sortCountriesByName, filterCountriesByName, filterAvailableCountries, findCountryByName, findCountryByCode, getCountryNames, groupCountriesAlphabetically, formatCountryWithDialCode, isCountryAvailable, } from './country';
59
45
  // Portfolio template utilities
60
46
  export { calculateTotalAllocation, validateAllocationPercentages, formatRiskLevelDisplay, } from './portfolio-template';
61
47
  // Investment preference utilities
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cranberry-money/shared-utils",
3
- "version": "8.17.39",
3
+ "version": "8.17.40",
4
4
  "description": "Shared utility functions for MyPortfolio platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",