@cranberry-money/shared-utils 8.5.0 → 8.6.0
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/tax-residency.d.ts +67 -0
- package/dist/tax-residency.d.ts.map +1 -0
- package/dist/tax-residency.js +70 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ export { calculatePortfolioValue, calculateHoldingAllocations, groupHoldingsByIn
|
|
|
24
24
|
export { processAllocationData, calculateTotals, formatPercentage, formatDashboardCurrency, type AllocationDisplayItem, } from './dashboard';
|
|
25
25
|
export { isValidTemplateSelection, validatePortfolioSelection, type PortfolioSelectionValidation, type PortfolioSelectionState, } from './portfolio-validation';
|
|
26
26
|
export { getStatusColor, getStatusLabel, getWithdrawalTypeLabel, getReasonLabel, getLiquidationStatusColor, getLiquidationStatusLabel, type WithdrawalStatus, type WithdrawalType, type WithdrawalReason, type LiquidationStatus, } from './withdrawal-status';
|
|
27
|
+
export { findPrimaryTaxResidency, filterTaxResidenciesByCountry, hasTaxResidencyInCountry, getNonExemptedTaxResidencies, type BaseTaxResidency, } from './tax-residency';
|
|
27
28
|
//# 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":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -48,3 +48,5 @@ export { processAllocationData, calculateTotals, formatPercentage, formatDashboa
|
|
|
48
48
|
export { isValidTemplateSelection, validatePortfolioSelection, } from './portfolio-validation';
|
|
49
49
|
// Withdrawal status utilities
|
|
50
50
|
export { getStatusColor, getStatusLabel, getWithdrawalTypeLabel, getReasonLabel, getLiquidationStatusColor, getLiquidationStatusLabel, } from './withdrawal-status';
|
|
51
|
+
// Tax residency utilities
|
|
52
|
+
export { findPrimaryTaxResidency, filterTaxResidenciesByCountry, hasTaxResidencyInCountry, getNonExemptedTaxResidencies, } from './tax-residency';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export interface BaseTaxResidency {
|
|
2
|
+
readonly country: string;
|
|
3
|
+
readonly isPrimary: boolean;
|
|
4
|
+
readonly isExempted: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Find the primary tax residency from a list
|
|
8
|
+
*
|
|
9
|
+
* @param taxResidencies - List of tax residencies
|
|
10
|
+
* @returns The primary tax residency if found, undefined otherwise
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const residencies = [
|
|
14
|
+
* { country: 'US', isPrimary: false, isExempted: false },
|
|
15
|
+
* { country: 'CA', isPrimary: true, isExempted: false }
|
|
16
|
+
* ];
|
|
17
|
+
* findPrimaryTaxResidency(residencies); // returns CA residency
|
|
18
|
+
*/
|
|
19
|
+
export declare const findPrimaryTaxResidency: <T extends BaseTaxResidency>(taxResidencies: readonly T[]) => T | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Filter tax residencies by country code
|
|
22
|
+
*
|
|
23
|
+
* @param taxResidencies - List of tax residencies
|
|
24
|
+
* @param countryCode - Country code to filter by
|
|
25
|
+
* @returns List of tax residencies for the specified country
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const residencies = [
|
|
29
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
30
|
+
* { country: 'US', isPrimary: false, isExempted: true },
|
|
31
|
+
* { country: 'CA', isPrimary: false, isExempted: false }
|
|
32
|
+
* ];
|
|
33
|
+
* filterTaxResidenciesByCountry(residencies, 'US'); // returns 2 US residencies
|
|
34
|
+
*/
|
|
35
|
+
export declare const filterTaxResidenciesByCountry: <T extends BaseTaxResidency>(taxResidencies: readonly T[], countryCode: string) => T[];
|
|
36
|
+
/**
|
|
37
|
+
* Check if user has tax residency in a specific country
|
|
38
|
+
*
|
|
39
|
+
* @param taxResidencies - List of tax residencies
|
|
40
|
+
* @param countryCode - Country code to check
|
|
41
|
+
* @returns True if user has residency in the country, false otherwise
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const residencies = [
|
|
45
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
46
|
+
* { country: 'CA', isPrimary: false, isExempted: false }
|
|
47
|
+
* ];
|
|
48
|
+
* hasTaxResidencyInCountry(residencies, 'US'); // returns true
|
|
49
|
+
* hasTaxResidencyInCountry(residencies, 'UK'); // returns false
|
|
50
|
+
*/
|
|
51
|
+
export declare const hasTaxResidencyInCountry: <T extends BaseTaxResidency>(taxResidencies: readonly T[], countryCode: string) => boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get all non-exempted tax residencies
|
|
54
|
+
*
|
|
55
|
+
* @param taxResidencies - List of tax residencies
|
|
56
|
+
* @returns List of non-exempted tax residencies
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const residencies = [
|
|
60
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
61
|
+
* { country: 'CA', isPrimary: false, isExempted: true },
|
|
62
|
+
* { country: 'UK', isPrimary: false, isExempted: false }
|
|
63
|
+
* ];
|
|
64
|
+
* getNonExemptedTaxResidencies(residencies); // returns US and UK residencies
|
|
65
|
+
*/
|
|
66
|
+
export declare const getNonExemptedTaxResidencies: <T extends BaseTaxResidency>(taxResidencies: readonly T[]) => T[];
|
|
67
|
+
//# sourceMappingURL=tax-residency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tax-residency.d.ts","sourceRoot":"","sources":["../src/tax-residency.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,gBAAgB,EAChE,gBAAgB,SAAS,CAAC,EAAE,KAC3B,CAAC,GAAG,SAEN,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,gBAAgB,EACtE,gBAAgB,SAAS,CAAC,EAAE,EAC5B,aAAa,MAAM,KAClB,CAAC,EAEH,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,gBAAgB,EACjE,gBAAgB,SAAS,CAAC,EAAE,EAC5B,aAAa,MAAM,KAClB,OAEF,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,gBAAgB,EACrE,gBAAgB,SAAS,CAAC,EAAE,KAC3B,CAAC,EAEH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { findByField, hasItemWithFieldValue, filterByBooleanField } from './collections';
|
|
2
|
+
/**
|
|
3
|
+
* Find the primary tax residency from a list
|
|
4
|
+
*
|
|
5
|
+
* @param taxResidencies - List of tax residencies
|
|
6
|
+
* @returns The primary tax residency if found, undefined otherwise
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const residencies = [
|
|
10
|
+
* { country: 'US', isPrimary: false, isExempted: false },
|
|
11
|
+
* { country: 'CA', isPrimary: true, isExempted: false }
|
|
12
|
+
* ];
|
|
13
|
+
* findPrimaryTaxResidency(residencies); // returns CA residency
|
|
14
|
+
*/
|
|
15
|
+
export const findPrimaryTaxResidency = (taxResidencies) => {
|
|
16
|
+
return findByField([...taxResidencies], 'isPrimary', true);
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Filter tax residencies by country code
|
|
20
|
+
*
|
|
21
|
+
* @param taxResidencies - List of tax residencies
|
|
22
|
+
* @param countryCode - Country code to filter by
|
|
23
|
+
* @returns List of tax residencies for the specified country
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const residencies = [
|
|
27
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
28
|
+
* { country: 'US', isPrimary: false, isExempted: true },
|
|
29
|
+
* { country: 'CA', isPrimary: false, isExempted: false }
|
|
30
|
+
* ];
|
|
31
|
+
* filterTaxResidenciesByCountry(residencies, 'US'); // returns 2 US residencies
|
|
32
|
+
*/
|
|
33
|
+
export const filterTaxResidenciesByCountry = (taxResidencies, countryCode) => {
|
|
34
|
+
return taxResidencies.filter((residency) => residency.country === countryCode);
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Check if user has tax residency in a specific country
|
|
38
|
+
*
|
|
39
|
+
* @param taxResidencies - List of tax residencies
|
|
40
|
+
* @param countryCode - Country code to check
|
|
41
|
+
* @returns True if user has residency in the country, false otherwise
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const residencies = [
|
|
45
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
46
|
+
* { country: 'CA', isPrimary: false, isExempted: false }
|
|
47
|
+
* ];
|
|
48
|
+
* hasTaxResidencyInCountry(residencies, 'US'); // returns true
|
|
49
|
+
* hasTaxResidencyInCountry(residencies, 'UK'); // returns false
|
|
50
|
+
*/
|
|
51
|
+
export const hasTaxResidencyInCountry = (taxResidencies, countryCode) => {
|
|
52
|
+
return hasItemWithFieldValue([...taxResidencies], 'country', countryCode);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Get all non-exempted tax residencies
|
|
56
|
+
*
|
|
57
|
+
* @param taxResidencies - List of tax residencies
|
|
58
|
+
* @returns List of non-exempted tax residencies
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const residencies = [
|
|
62
|
+
* { country: 'US', isPrimary: true, isExempted: false },
|
|
63
|
+
* { country: 'CA', isPrimary: false, isExempted: true },
|
|
64
|
+
* { country: 'UK', isPrimary: false, isExempted: false }
|
|
65
|
+
* ];
|
|
66
|
+
* getNonExemptedTaxResidencies(residencies); // returns US and UK residencies
|
|
67
|
+
*/
|
|
68
|
+
export const getNonExemptedTaxResidencies = (taxResidencies) => {
|
|
69
|
+
return filterByBooleanField([...taxResidencies], 'isExempted', false);
|
|
70
|
+
};
|