@cranberry-money/shared-utils 4.7.0 → 4.9.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/filters.d.ts +65 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +129 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/validation.d.ts +205 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +275 -0
- package/dist/withdrawal.d.ts.map +1 -1
- package/dist/withdrawal.js +5 -5
- package/package.json +1 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility functions for filter operations
|
|
3
|
+
* Generic, reusable filter functions for managing filter states
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Checks if any filters are active
|
|
7
|
+
* @param filters - The filter object to check
|
|
8
|
+
* @param excludeFields - Fields to exclude from the active check (default: ['searchQuery'])
|
|
9
|
+
* @returns true if any filters are active, false otherwise
|
|
10
|
+
*/
|
|
11
|
+
export declare function hasActiveFilters<T extends Record<string, unknown>>(filters: T, excludeFields?: (keyof T)[]): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Counts the number of active filters
|
|
14
|
+
* @param filters - The filter object to count
|
|
15
|
+
* @param excludeFields - Fields to exclude from the count (default: ['searchQuery'])
|
|
16
|
+
* @returns The number of active filters
|
|
17
|
+
*/
|
|
18
|
+
export declare function countActiveFilters<T extends Record<string, unknown>>(filters: T, excludeFields?: (keyof T)[]): number;
|
|
19
|
+
/**
|
|
20
|
+
* Clears all filters except specified fields
|
|
21
|
+
* @param filters - The filter object to clear
|
|
22
|
+
* @param preserveFields - Fields to preserve when clearing (default: [])
|
|
23
|
+
* @returns A new filter object with cleared values
|
|
24
|
+
*/
|
|
25
|
+
export declare function clearAllFilters<T extends Record<string, unknown>>(filters: T, preserveFields?: (keyof T)[]): Partial<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Type-safe filter update helper
|
|
28
|
+
* @param currentFilters - The current filter state
|
|
29
|
+
* @param updates - The updates to apply
|
|
30
|
+
* @returns A new filter object with updates applied
|
|
31
|
+
*/
|
|
32
|
+
export declare function updateFilters<T extends Record<string, unknown>>(currentFilters: T, updates: Partial<T>): T;
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a filter value is empty
|
|
35
|
+
* @param value - The value to check
|
|
36
|
+
* @returns true if the value is empty, false otherwise
|
|
37
|
+
*/
|
|
38
|
+
export declare function isFilterEmpty(value: unknown): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Removes empty filter values from an object
|
|
41
|
+
* @param filters - The filter object to clean
|
|
42
|
+
* @returns A new filter object with empty values removed
|
|
43
|
+
*/
|
|
44
|
+
export declare function removeEmptyFilters<T extends Record<string, unknown>>(filters: T): Partial<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Merges two filter objects, with the second object taking precedence
|
|
47
|
+
* @param baseFilters - The base filter object
|
|
48
|
+
* @param overrideFilters - The override filter object
|
|
49
|
+
* @returns A new merged filter object
|
|
50
|
+
*/
|
|
51
|
+
export declare function mergeFilters<T extends Record<string, unknown>>(baseFilters: T, overrideFilters: Partial<T>): T;
|
|
52
|
+
/**
|
|
53
|
+
* Compares two filter objects for equality
|
|
54
|
+
* @param filters1 - The first filter object
|
|
55
|
+
* @param filters2 - The second filter object
|
|
56
|
+
* @returns true if the filters are equal, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
export declare function areFiltersEqual<T extends Record<string, unknown>>(filters1: T, filters2: T): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Creates a filter predicate function from a filter object
|
|
61
|
+
* @param filters - The filter object to create a predicate from
|
|
62
|
+
* @returns A predicate function that tests if an item matches the filters
|
|
63
|
+
*/
|
|
64
|
+
export declare function createFilterPredicate<T extends Record<string, unknown>, U extends Record<string, unknown>>(filters: T): (item: U) => boolean;
|
|
65
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,EAAE,CAAC,EACV,aAAa,GAAE,CAAC,MAAM,CAAC,CAAC,EAA+B,GACtD,OAAO,CAOT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,OAAO,EAAE,CAAC,EACV,aAAa,GAAE,CAAC,MAAM,CAAC,CAAC,EAA+B,GACtD,MAAM,CAOR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,OAAO,EAAE,CAAC,EACV,cAAc,GAAE,CAAC,MAAM,CAAC,CAAC,EAAO,GAC/B,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAE1G;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAU5F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAE9G;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAkBpG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxG,OAAO,EAAE,CAAC,GACT,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAuBtB"}
|
package/dist/filters.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility functions for filter operations
|
|
3
|
+
* Generic, reusable filter functions for managing filter states
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Checks if any filters are active
|
|
7
|
+
* @param filters - The filter object to check
|
|
8
|
+
* @param excludeFields - Fields to exclude from the active check (default: ['searchQuery'])
|
|
9
|
+
* @returns true if any filters are active, false otherwise
|
|
10
|
+
*/
|
|
11
|
+
export function hasActiveFilters(filters, excludeFields = ['searchQuery']) {
|
|
12
|
+
const relevantEntries = Object.entries(filters).filter(([key]) => !excludeFields.includes(key));
|
|
13
|
+
return relevantEntries.some(([, value]) => value !== undefined && value !== null && value !== '' && !(Array.isArray(value) && value.length === 0));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Counts the number of active filters
|
|
17
|
+
* @param filters - The filter object to count
|
|
18
|
+
* @param excludeFields - Fields to exclude from the count (default: ['searchQuery'])
|
|
19
|
+
* @returns The number of active filters
|
|
20
|
+
*/
|
|
21
|
+
export function countActiveFilters(filters, excludeFields = ['searchQuery']) {
|
|
22
|
+
const relevantEntries = Object.entries(filters).filter(([key]) => !excludeFields.includes(key));
|
|
23
|
+
return relevantEntries.filter(([, value]) => value !== undefined && value !== null && value !== '' && !(Array.isArray(value) && value.length === 0)).length;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Clears all filters except specified fields
|
|
27
|
+
* @param filters - The filter object to clear
|
|
28
|
+
* @param preserveFields - Fields to preserve when clearing (default: [])
|
|
29
|
+
* @returns A new filter object with cleared values
|
|
30
|
+
*/
|
|
31
|
+
export function clearAllFilters(filters, preserveFields = []) {
|
|
32
|
+
const clearedFilters = {};
|
|
33
|
+
// Preserve specified fields
|
|
34
|
+
preserveFields.forEach((field) => {
|
|
35
|
+
if (field in filters) {
|
|
36
|
+
clearedFilters[field] = filters[field];
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return clearedFilters;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Type-safe filter update helper
|
|
43
|
+
* @param currentFilters - The current filter state
|
|
44
|
+
* @param updates - The updates to apply
|
|
45
|
+
* @returns A new filter object with updates applied
|
|
46
|
+
*/
|
|
47
|
+
export function updateFilters(currentFilters, updates) {
|
|
48
|
+
return { ...currentFilters, ...updates };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checks if a filter value is empty
|
|
52
|
+
* @param value - The value to check
|
|
53
|
+
* @returns true if the value is empty, false otherwise
|
|
54
|
+
*/
|
|
55
|
+
export function isFilterEmpty(value) {
|
|
56
|
+
return (value === undefined ||
|
|
57
|
+
value === null ||
|
|
58
|
+
value === '' ||
|
|
59
|
+
(Array.isArray(value) && value.length === 0) ||
|
|
60
|
+
(typeof value === 'object' && value !== null && Object.keys(value).length === 0));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Removes empty filter values from an object
|
|
64
|
+
* @param filters - The filter object to clean
|
|
65
|
+
* @returns A new filter object with empty values removed
|
|
66
|
+
*/
|
|
67
|
+
export function removeEmptyFilters(filters) {
|
|
68
|
+
const cleanedFilters = {};
|
|
69
|
+
Object.entries(filters).forEach(([key, value]) => {
|
|
70
|
+
if (!isFilterEmpty(value)) {
|
|
71
|
+
cleanedFilters[key] = value;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return cleanedFilters;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Merges two filter objects, with the second object taking precedence
|
|
78
|
+
* @param baseFilters - The base filter object
|
|
79
|
+
* @param overrideFilters - The override filter object
|
|
80
|
+
* @returns A new merged filter object
|
|
81
|
+
*/
|
|
82
|
+
export function mergeFilters(baseFilters, overrideFilters) {
|
|
83
|
+
return { ...baseFilters, ...overrideFilters };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compares two filter objects for equality
|
|
87
|
+
* @param filters1 - The first filter object
|
|
88
|
+
* @param filters2 - The second filter object
|
|
89
|
+
* @returns true if the filters are equal, false otherwise
|
|
90
|
+
*/
|
|
91
|
+
export function areFiltersEqual(filters1, filters2) {
|
|
92
|
+
const keys1 = Object.keys(filters1);
|
|
93
|
+
const keys2 = Object.keys(filters2);
|
|
94
|
+
if (keys1.length !== keys2.length) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return keys1.every((key) => {
|
|
98
|
+
const value1 = filters1[key];
|
|
99
|
+
const value2 = filters2[key];
|
|
100
|
+
if (Array.isArray(value1) && Array.isArray(value2)) {
|
|
101
|
+
return value1.length === value2.length && value1.every((v, i) => v === value2[i]);
|
|
102
|
+
}
|
|
103
|
+
return value1 === value2;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Creates a filter predicate function from a filter object
|
|
108
|
+
* @param filters - The filter object to create a predicate from
|
|
109
|
+
* @returns A predicate function that tests if an item matches the filters
|
|
110
|
+
*/
|
|
111
|
+
export function createFilterPredicate(filters) {
|
|
112
|
+
const activeFilters = removeEmptyFilters(filters);
|
|
113
|
+
const filterEntries = Object.entries(activeFilters);
|
|
114
|
+
if (filterEntries.length === 0) {
|
|
115
|
+
return () => true;
|
|
116
|
+
}
|
|
117
|
+
return (item) => {
|
|
118
|
+
return filterEntries.every(([key, filterValue]) => {
|
|
119
|
+
const itemValue = item[key];
|
|
120
|
+
if (Array.isArray(filterValue)) {
|
|
121
|
+
return filterValue.includes(itemValue);
|
|
122
|
+
}
|
|
123
|
+
if (typeof filterValue === 'string' && typeof itemValue === 'string') {
|
|
124
|
+
return itemValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
125
|
+
}
|
|
126
|
+
return itemValue === filterValue;
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,4 +14,7 @@ export { getTradeStatusBadge, getWithdrawalStatusBadge, getLiquidationStatusBadg
|
|
|
14
14
|
export { formatPortfolioValue, calculateTotalValue, getMarketAllocation, getCashAllocation } from './portfolio';
|
|
15
15
|
export type { LiquidationProgress } from './withdrawal';
|
|
16
16
|
export { formatWithdrawalAmount, formatLiquidationValue, formatSharesQuantity, calculateLiquidationProgress, getTotalEstimatedValue, } from './withdrawal';
|
|
17
|
+
export type { PasswordValidation, EmailConfirmationValidation, ExtendedPasswordValidation } from './validation';
|
|
18
|
+
export { isNumericOnly, validatePassword, isValidTokenFormat, formatVerificationToken, validateEmailConfirmation, isValidEmail, hasUppercase, hasLowercase, hasSpecialCharacter, hasDigit, validatePasswordExtended, isValidPhoneNumber, isValidPhoneFormat, isValidUrl, isValidDate, isEmptyOrWhitespace, meetsMinLength, meetsMaxLength, isInRange, isPositiveNumber, isNonNegativeNumber, isValidFullName, isValidDateOfBirth, formatPhoneNumber, isValidInvestmentAmount, hasMinimumSelection, isSelected, } from './validation';
|
|
19
|
+
export { hasActiveFilters, countActiveFilters, clearAllFilters, updateFilters, isFilterEmpty, removeEmptyFilters, mergeFilters, areFiltersEqual, createFilterPredicate, } from './filters';
|
|
17
20
|
//# 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;;;;;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,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,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,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,cAAc,CAAC"}
|
|
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,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,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,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,QAAQ,EACR,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,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,GACtB,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,3 +15,6 @@ export { getTradeStatusBadge, getWithdrawalStatusBadge, getLiquidationStatusBadg
|
|
|
15
15
|
// Portfolio utilities
|
|
16
16
|
export { formatPortfolioValue, calculateTotalValue, getMarketAllocation, getCashAllocation } from './portfolio';
|
|
17
17
|
export { formatWithdrawalAmount, formatLiquidationValue, formatSharesQuantity, calculateLiquidationProgress, getTotalEstimatedValue, } from './withdrawal';
|
|
18
|
+
export { isNumericOnly, validatePassword, isValidTokenFormat, formatVerificationToken, validateEmailConfirmation, isValidEmail, hasUppercase, hasLowercase, hasSpecialCharacter, hasDigit, validatePasswordExtended, isValidPhoneNumber, isValidPhoneFormat, isValidUrl, isValidDate, isEmptyOrWhitespace, meetsMinLength, meetsMaxLength, isInRange, isPositiveNumber, isNonNegativeNumber, isValidFullName, isValidDateOfBirth, formatPhoneNumber, isValidInvestmentAmount, hasMinimumSelection, isSelected, } from './validation';
|
|
19
|
+
// Filter utilities
|
|
20
|
+
export { hasActiveFilters, countActiveFilters, clearAllFilters, updateFilters, isFilterEmpty, removeEmptyFilters, mergeFilters, areFiltersEqual, createFilterPredicate, } from './filters';
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utility functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Checks if a string contains only numeric characters
|
|
6
|
+
* @param str - The string to validate
|
|
7
|
+
* @returns true if the string contains only digits, false otherwise
|
|
8
|
+
*/
|
|
9
|
+
export declare function isNumericOnly(str: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Password validation result interface
|
|
12
|
+
*/
|
|
13
|
+
export interface PasswordValidation {
|
|
14
|
+
lengthValid: boolean;
|
|
15
|
+
notNumeric: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validates password strength based on minimum requirements
|
|
19
|
+
* @param password - The password to validate
|
|
20
|
+
* @param minLength - Minimum password length (default: 8)
|
|
21
|
+
* @returns An object containing validation results
|
|
22
|
+
*/
|
|
23
|
+
export declare function validatePassword(password: string, minLength?: number): PasswordValidation;
|
|
24
|
+
/**
|
|
25
|
+
* Validates if a verification token is in the expected format
|
|
26
|
+
* @param token - The verification token to validate
|
|
27
|
+
* @param minLength - Minimum token length (default: 6)
|
|
28
|
+
* @returns true if token appears to be valid format, false otherwise
|
|
29
|
+
*/
|
|
30
|
+
export declare function isValidTokenFormat(token: string, minLength?: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Formats a verification token by removing whitespace and converting to uppercase
|
|
33
|
+
* @param token - The token to format
|
|
34
|
+
* @returns The formatted token
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatVerificationToken(token: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Email confirmation validation result interface
|
|
39
|
+
*/
|
|
40
|
+
export interface EmailConfirmationValidation {
|
|
41
|
+
isValid: boolean;
|
|
42
|
+
isEmpty: boolean;
|
|
43
|
+
isValidFormat: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validates email confirmation form data
|
|
47
|
+
* @param token - The verification token
|
|
48
|
+
* @param minLength - Minimum token length (default: 6)
|
|
49
|
+
* @returns An object containing validation results
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateEmailConfirmation(token: string, minLength?: number): EmailConfirmationValidation;
|
|
52
|
+
/**
|
|
53
|
+
* Validates if an email address is in a valid format
|
|
54
|
+
* @param email - The email address to validate
|
|
55
|
+
* @returns true if email format is valid, false otherwise
|
|
56
|
+
*/
|
|
57
|
+
export declare function isValidEmail(email: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Validates if a string contains at least one uppercase letter
|
|
60
|
+
* @param str - The string to validate
|
|
61
|
+
* @returns true if contains uppercase, false otherwise
|
|
62
|
+
*/
|
|
63
|
+
export declare function hasUppercase(str: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Validates if a string contains at least one lowercase letter
|
|
66
|
+
* @param str - The string to validate
|
|
67
|
+
* @returns true if contains lowercase, false otherwise
|
|
68
|
+
*/
|
|
69
|
+
export declare function hasLowercase(str: string): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Validates if a string contains at least one special character
|
|
72
|
+
* @param str - The string to validate
|
|
73
|
+
* @returns true if contains special character, false otherwise
|
|
74
|
+
*/
|
|
75
|
+
export declare function hasSpecialCharacter(str: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Validates if a string contains at least one digit
|
|
78
|
+
* @param str - The string to validate
|
|
79
|
+
* @returns true if contains digit, false otherwise
|
|
80
|
+
*/
|
|
81
|
+
export declare function hasDigit(str: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Extended password validation result interface
|
|
84
|
+
*/
|
|
85
|
+
export interface ExtendedPasswordValidation extends PasswordValidation {
|
|
86
|
+
hasUppercase: boolean;
|
|
87
|
+
hasLowercase: boolean;
|
|
88
|
+
hasSpecialCharacter: boolean;
|
|
89
|
+
hasDigit: boolean;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Performs extended password validation with additional strength checks
|
|
93
|
+
* @param password - The password to validate
|
|
94
|
+
* @param minLength - Minimum password length (default: 8)
|
|
95
|
+
* @returns An object containing detailed validation results
|
|
96
|
+
*/
|
|
97
|
+
export declare function validatePasswordExtended(password: string, minLength?: number): ExtendedPasswordValidation;
|
|
98
|
+
/**
|
|
99
|
+
* Validates if a phone number is in a valid format
|
|
100
|
+
* @param phoneNumber - The phone number to validate
|
|
101
|
+
* @returns true if phone number format is valid, false otherwise
|
|
102
|
+
*/
|
|
103
|
+
export declare function isValidPhoneNumber(phoneNumber: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Validates if a phone number appears to be in a valid format (less strict)
|
|
106
|
+
* @param phoneNumber - The phone number to validate
|
|
107
|
+
* @param minLength - Minimum length for the phone number (default: 8)
|
|
108
|
+
* @returns true if phone number appears valid, false otherwise
|
|
109
|
+
*/
|
|
110
|
+
export declare function isValidPhoneFormat(phoneNumber: string, minLength?: number): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Validates if a URL is in a valid format
|
|
113
|
+
* @param url - The URL to validate
|
|
114
|
+
* @returns true if URL format is valid, false otherwise
|
|
115
|
+
*/
|
|
116
|
+
export declare function isValidUrl(url: string): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Validates if a date string is in a valid format
|
|
119
|
+
* @param dateString - The date string to validate
|
|
120
|
+
* @returns true if date format is valid, false otherwise
|
|
121
|
+
*/
|
|
122
|
+
export declare function isValidDate(dateString: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Validates if a string is empty or contains only whitespace
|
|
125
|
+
* @param str - The string to validate
|
|
126
|
+
* @returns true if string is empty or whitespace only, false otherwise
|
|
127
|
+
*/
|
|
128
|
+
export declare function isEmptyOrWhitespace(str: string): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Validates if a string meets a minimum length requirement
|
|
131
|
+
* @param str - The string to validate
|
|
132
|
+
* @param minLength - The minimum length required
|
|
133
|
+
* @returns true if string meets minimum length, false otherwise
|
|
134
|
+
*/
|
|
135
|
+
export declare function meetsMinLength(str: string, minLength: number): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Validates if a string meets a maximum length requirement
|
|
138
|
+
* @param str - The string to validate
|
|
139
|
+
* @param maxLength - The maximum length allowed
|
|
140
|
+
* @returns true if string meets maximum length, false otherwise
|
|
141
|
+
*/
|
|
142
|
+
export declare function meetsMaxLength(str: string, maxLength: number): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Validates if a number is within a specified range
|
|
145
|
+
* @param value - The number to validate
|
|
146
|
+
* @param min - The minimum value (inclusive)
|
|
147
|
+
* @param max - The maximum value (inclusive)
|
|
148
|
+
* @returns true if number is within range, false otherwise
|
|
149
|
+
*/
|
|
150
|
+
export declare function isInRange(value: number, min: number, max: number): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Validates if a value is a positive number
|
|
153
|
+
* @param value - The value to validate
|
|
154
|
+
* @returns true if value is a positive number, false otherwise
|
|
155
|
+
*/
|
|
156
|
+
export declare function isPositiveNumber(value: number): boolean;
|
|
157
|
+
/**
|
|
158
|
+
* Validates if a value is a non-negative number
|
|
159
|
+
* @param value - The value to validate
|
|
160
|
+
* @returns true if value is a non-negative number, false otherwise
|
|
161
|
+
*/
|
|
162
|
+
export declare function isNonNegativeNumber(value: number): boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Validates if a full name contains at least first and last name
|
|
165
|
+
* @param fullName - The full name to validate
|
|
166
|
+
* @param minParts - Minimum number of name parts required (default: 2)
|
|
167
|
+
* @returns true if appears to contain required name parts, false otherwise
|
|
168
|
+
*/
|
|
169
|
+
export declare function isValidFullName(fullName: string, minParts?: number): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Validates if a date is a valid date of birth (not in future, reasonable age range)
|
|
172
|
+
* @param dateOfBirth - The date string in YYYY-MM-DD format
|
|
173
|
+
* @param minAge - Minimum age requirement (default: 13)
|
|
174
|
+
* @param maxAge - Maximum reasonable age (default: 120)
|
|
175
|
+
* @returns true if valid date of birth, false otherwise
|
|
176
|
+
*/
|
|
177
|
+
export declare function isValidDateOfBirth(dateOfBirth: string, minAge?: number, maxAge?: number): boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Formats a phone number by removing extra spaces and standardizing format
|
|
180
|
+
* @param phoneNumber - The phone number to format
|
|
181
|
+
* @returns The formatted phone number
|
|
182
|
+
*/
|
|
183
|
+
export declare function formatPhoneNumber(phoneNumber: string): string;
|
|
184
|
+
/**
|
|
185
|
+
* Validates if investment amount is within acceptable range
|
|
186
|
+
* @param amount - The investment amount to validate
|
|
187
|
+
* @param minAmount - Minimum investment amount (default: 100)
|
|
188
|
+
* @param maxAmount - Maximum investment amount (default: 10000000)
|
|
189
|
+
* @returns true if amount is within range, false otherwise
|
|
190
|
+
*/
|
|
191
|
+
export declare function isValidInvestmentAmount(amount: number, minAmount?: number, maxAmount?: number): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Validates if at least minimum number of items are selected
|
|
194
|
+
* @param items - Array of selected items
|
|
195
|
+
* @param minItems - Minimum number of items required (default: 1)
|
|
196
|
+
* @returns true if minimum items are selected, false otherwise
|
|
197
|
+
*/
|
|
198
|
+
export declare function hasMinimumSelection<T>(items: T[], minItems?: number): boolean;
|
|
199
|
+
/**
|
|
200
|
+
* Validates if a value is selected (not null, undefined, or empty string)
|
|
201
|
+
* @param value - The value to check
|
|
202
|
+
* @returns true if value is selected, false otherwise
|
|
203
|
+
*/
|
|
204
|
+
export declare function isSelected(value: unknown): boolean;
|
|
205
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utility functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Checks if a string contains only numeric characters
|
|
6
|
+
* @param str - The string to validate
|
|
7
|
+
* @returns true if the string contains only digits, false otherwise
|
|
8
|
+
*/
|
|
9
|
+
export function isNumericOnly(str) {
|
|
10
|
+
return /^\d+$/.test(str);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validates password strength based on minimum requirements
|
|
14
|
+
* @param password - The password to validate
|
|
15
|
+
* @param minLength - Minimum password length (default: 8)
|
|
16
|
+
* @returns An object containing validation results
|
|
17
|
+
*/
|
|
18
|
+
export function validatePassword(password, minLength = 8) {
|
|
19
|
+
return {
|
|
20
|
+
lengthValid: password.length >= minLength,
|
|
21
|
+
notNumeric: !isNumericOnly(password),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validates if a verification token is in the expected format
|
|
26
|
+
* @param token - The verification token to validate
|
|
27
|
+
* @param minLength - Minimum token length (default: 6)
|
|
28
|
+
* @returns true if token appears to be valid format, false otherwise
|
|
29
|
+
*/
|
|
30
|
+
export function isValidTokenFormat(token, minLength = 6) {
|
|
31
|
+
const trimmedToken = token.trim();
|
|
32
|
+
// Assuming tokens are alphanumeric and meet minimum length
|
|
33
|
+
return trimmedToken.length >= minLength && /^[a-zA-Z0-9]+$/.test(trimmedToken);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Formats a verification token by removing whitespace and converting to uppercase
|
|
37
|
+
* @param token - The token to format
|
|
38
|
+
* @returns The formatted token
|
|
39
|
+
*/
|
|
40
|
+
export function formatVerificationToken(token) {
|
|
41
|
+
return token.trim().toUpperCase();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validates email confirmation form data
|
|
45
|
+
* @param token - The verification token
|
|
46
|
+
* @param minLength - Minimum token length (default: 6)
|
|
47
|
+
* @returns An object containing validation results
|
|
48
|
+
*/
|
|
49
|
+
export function validateEmailConfirmation(token, minLength = 6) {
|
|
50
|
+
const formattedToken = formatVerificationToken(token);
|
|
51
|
+
return {
|
|
52
|
+
isValid: formattedToken.length > 0 && isValidTokenFormat(formattedToken, minLength),
|
|
53
|
+
isEmpty: formattedToken.length === 0,
|
|
54
|
+
isValidFormat: isValidTokenFormat(formattedToken, minLength),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validates if an email address is in a valid format
|
|
59
|
+
* @param email - The email address to validate
|
|
60
|
+
* @returns true if email format is valid, false otherwise
|
|
61
|
+
*/
|
|
62
|
+
export function isValidEmail(email) {
|
|
63
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
64
|
+
return emailRegex.test(email.trim());
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validates if a string contains at least one uppercase letter
|
|
68
|
+
* @param str - The string to validate
|
|
69
|
+
* @returns true if contains uppercase, false otherwise
|
|
70
|
+
*/
|
|
71
|
+
export function hasUppercase(str) {
|
|
72
|
+
return /[A-Z]/.test(str);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validates if a string contains at least one lowercase letter
|
|
76
|
+
* @param str - The string to validate
|
|
77
|
+
* @returns true if contains lowercase, false otherwise
|
|
78
|
+
*/
|
|
79
|
+
export function hasLowercase(str) {
|
|
80
|
+
return /[a-z]/.test(str);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validates if a string contains at least one special character
|
|
84
|
+
* @param str - The string to validate
|
|
85
|
+
* @returns true if contains special character, false otherwise
|
|
86
|
+
*/
|
|
87
|
+
export function hasSpecialCharacter(str) {
|
|
88
|
+
return /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(str);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validates if a string contains at least one digit
|
|
92
|
+
* @param str - The string to validate
|
|
93
|
+
* @returns true if contains digit, false otherwise
|
|
94
|
+
*/
|
|
95
|
+
export function hasDigit(str) {
|
|
96
|
+
return /\d/.test(str);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Performs extended password validation with additional strength checks
|
|
100
|
+
* @param password - The password to validate
|
|
101
|
+
* @param minLength - Minimum password length (default: 8)
|
|
102
|
+
* @returns An object containing detailed validation results
|
|
103
|
+
*/
|
|
104
|
+
export function validatePasswordExtended(password, minLength = 8) {
|
|
105
|
+
const basicValidation = validatePassword(password, minLength);
|
|
106
|
+
return {
|
|
107
|
+
...basicValidation,
|
|
108
|
+
hasUppercase: hasUppercase(password),
|
|
109
|
+
hasLowercase: hasLowercase(password),
|
|
110
|
+
hasSpecialCharacter: hasSpecialCharacter(password),
|
|
111
|
+
hasDigit: hasDigit(password),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validates if a phone number is in a valid format
|
|
116
|
+
* @param phoneNumber - The phone number to validate
|
|
117
|
+
* @returns true if phone number format is valid, false otherwise
|
|
118
|
+
*/
|
|
119
|
+
export function isValidPhoneNumber(phoneNumber) {
|
|
120
|
+
// Remove common formatting characters
|
|
121
|
+
const cleaned = phoneNumber.replace(/[\s\-\(\)\.]/g, '');
|
|
122
|
+
// Check if it's a valid phone number (digits only, 10-15 digits)
|
|
123
|
+
return /^\+?\d{10,15}$/.test(cleaned);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Validates if a phone number appears to be in a valid format (less strict)
|
|
127
|
+
* @param phoneNumber - The phone number to validate
|
|
128
|
+
* @param minLength - Minimum length for the phone number (default: 8)
|
|
129
|
+
* @returns true if phone number appears valid, false otherwise
|
|
130
|
+
*/
|
|
131
|
+
export function isValidPhoneFormat(phoneNumber, minLength = 8) {
|
|
132
|
+
const trimmedPhone = phoneNumber.trim();
|
|
133
|
+
// Basic validation: must contain digits and common phone number characters
|
|
134
|
+
return trimmedPhone.length >= minLength && /^[+\-\s\d()]+$/.test(trimmedPhone);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validates if a URL is in a valid format
|
|
138
|
+
* @param url - The URL to validate
|
|
139
|
+
* @returns true if URL format is valid, false otherwise
|
|
140
|
+
*/
|
|
141
|
+
export function isValidUrl(url) {
|
|
142
|
+
try {
|
|
143
|
+
new URL(url);
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Validates if a date string is in a valid format
|
|
152
|
+
* @param dateString - The date string to validate
|
|
153
|
+
* @returns true if date format is valid, false otherwise
|
|
154
|
+
*/
|
|
155
|
+
export function isValidDate(dateString) {
|
|
156
|
+
const date = new Date(dateString);
|
|
157
|
+
return !isNaN(date.getTime());
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validates if a string is empty or contains only whitespace
|
|
161
|
+
* @param str - The string to validate
|
|
162
|
+
* @returns true if string is empty or whitespace only, false otherwise
|
|
163
|
+
*/
|
|
164
|
+
export function isEmptyOrWhitespace(str) {
|
|
165
|
+
return str.trim().length === 0;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Validates if a string meets a minimum length requirement
|
|
169
|
+
* @param str - The string to validate
|
|
170
|
+
* @param minLength - The minimum length required
|
|
171
|
+
* @returns true if string meets minimum length, false otherwise
|
|
172
|
+
*/
|
|
173
|
+
export function meetsMinLength(str, minLength) {
|
|
174
|
+
return str.length >= minLength;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Validates if a string meets a maximum length requirement
|
|
178
|
+
* @param str - The string to validate
|
|
179
|
+
* @param maxLength - The maximum length allowed
|
|
180
|
+
* @returns true if string meets maximum length, false otherwise
|
|
181
|
+
*/
|
|
182
|
+
export function meetsMaxLength(str, maxLength) {
|
|
183
|
+
return str.length <= maxLength;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Validates if a number is within a specified range
|
|
187
|
+
* @param value - The number to validate
|
|
188
|
+
* @param min - The minimum value (inclusive)
|
|
189
|
+
* @param max - The maximum value (inclusive)
|
|
190
|
+
* @returns true if number is within range, false otherwise
|
|
191
|
+
*/
|
|
192
|
+
export function isInRange(value, min, max) {
|
|
193
|
+
return value >= min && value <= max;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Validates if a value is a positive number
|
|
197
|
+
* @param value - The value to validate
|
|
198
|
+
* @returns true if value is a positive number, false otherwise
|
|
199
|
+
*/
|
|
200
|
+
export function isPositiveNumber(value) {
|
|
201
|
+
return typeof value === 'number' && value > 0 && isFinite(value);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Validates if a value is a non-negative number
|
|
205
|
+
* @param value - The value to validate
|
|
206
|
+
* @returns true if value is a non-negative number, false otherwise
|
|
207
|
+
*/
|
|
208
|
+
export function isNonNegativeNumber(value) {
|
|
209
|
+
return typeof value === 'number' && value >= 0 && isFinite(value);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Validates if a full name contains at least first and last name
|
|
213
|
+
* @param fullName - The full name to validate
|
|
214
|
+
* @param minParts - Minimum number of name parts required (default: 2)
|
|
215
|
+
* @returns true if appears to contain required name parts, false otherwise
|
|
216
|
+
*/
|
|
217
|
+
export function isValidFullName(fullName, minParts = 2) {
|
|
218
|
+
const trimmedName = fullName.trim();
|
|
219
|
+
const nameParts = trimmedName.split(/\s+/);
|
|
220
|
+
return nameParts.length >= minParts && nameParts.every((part) => part.length > 0);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Validates if a date is a valid date of birth (not in future, reasonable age range)
|
|
224
|
+
* @param dateOfBirth - The date string in YYYY-MM-DD format
|
|
225
|
+
* @param minAge - Minimum age requirement (default: 13)
|
|
226
|
+
* @param maxAge - Maximum reasonable age (default: 120)
|
|
227
|
+
* @returns true if valid date of birth, false otherwise
|
|
228
|
+
*/
|
|
229
|
+
export function isValidDateOfBirth(dateOfBirth, minAge = 13, maxAge = 120) {
|
|
230
|
+
if (!dateOfBirth)
|
|
231
|
+
return false;
|
|
232
|
+
const birthDate = new Date(dateOfBirth);
|
|
233
|
+
const today = new Date();
|
|
234
|
+
const age = today.getFullYear() - birthDate.getFullYear();
|
|
235
|
+
const monthDiff = today.getMonth() - birthDate.getMonth();
|
|
236
|
+
const dayDiff = today.getDate() - birthDate.getDate();
|
|
237
|
+
// Adjust age if birthday hasn't occurred this year
|
|
238
|
+
const actualAge = monthDiff < 0 || (monthDiff === 0 && dayDiff < 0) ? age - 1 : age;
|
|
239
|
+
return actualAge >= minAge && actualAge <= maxAge && birthDate <= today;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Formats a phone number by removing extra spaces and standardizing format
|
|
243
|
+
* @param phoneNumber - The phone number to format
|
|
244
|
+
* @returns The formatted phone number
|
|
245
|
+
*/
|
|
246
|
+
export function formatPhoneNumber(phoneNumber) {
|
|
247
|
+
return phoneNumber.trim();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Validates if investment amount is within acceptable range
|
|
251
|
+
* @param amount - The investment amount to validate
|
|
252
|
+
* @param minAmount - Minimum investment amount (default: 100)
|
|
253
|
+
* @param maxAmount - Maximum investment amount (default: 10000000)
|
|
254
|
+
* @returns true if amount is within range, false otherwise
|
|
255
|
+
*/
|
|
256
|
+
export function isValidInvestmentAmount(amount, minAmount = 100, maxAmount = 10000000) {
|
|
257
|
+
return amount >= minAmount && amount <= maxAmount;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Validates if at least minimum number of items are selected
|
|
261
|
+
* @param items - Array of selected items
|
|
262
|
+
* @param minItems - Minimum number of items required (default: 1)
|
|
263
|
+
* @returns true if minimum items are selected, false otherwise
|
|
264
|
+
*/
|
|
265
|
+
export function hasMinimumSelection(items, minItems = 1) {
|
|
266
|
+
return items && items.length >= minItems;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Validates if a value is selected (not null, undefined, or empty string)
|
|
270
|
+
* @param value - The value to check
|
|
271
|
+
* @returns true if value is selected, false otherwise
|
|
272
|
+
*/
|
|
273
|
+
export function isSelected(value) {
|
|
274
|
+
return value !== null && value !== undefined && value !== '';
|
|
275
|
+
}
|
package/dist/withdrawal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawal.d.ts","sourceRoot":"","sources":["../src/withdrawal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"withdrawal.d.ts","sourceRoot":"","sources":["../src/withdrawal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,EAClF,YAAY,EAAE,CAAC,EAAE,GAChB,mBAAmB,CAkBrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,MAAM,CAI9G"}
|
package/dist/withdrawal.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* calculating liquidation progress, and other withdrawal-related operations.
|
|
6
6
|
* Functions are designed to work with generic types to maintain flexibility.
|
|
7
7
|
*/
|
|
8
|
-
import { LOCALE_AUSTRALIA, CURRENCY_AUD, LIQUIDATION_STATUS_PENDING, LIQUIDATION_STATUS_TRADES_CREATED, LIQUIDATION_STATUS_EXECUTED, LIQUIDATION_STATUS_SETTLED, LIQUIDATION_STATUS_FAILED } from '@cranberry-money/shared-constants';
|
|
8
|
+
import { LOCALE_AUSTRALIA, CURRENCY_AUD, LIQUIDATION_STATUS_PENDING, LIQUIDATION_STATUS_TRADES_CREATED, LIQUIDATION_STATUS_EXECUTED, LIQUIDATION_STATUS_SETTLED, LIQUIDATION_STATUS_FAILED, } from '@cranberry-money/shared-constants';
|
|
9
9
|
import { NUMBER_FORMAT_OPTIONS_CURRENCY } from './currency';
|
|
10
10
|
/**
|
|
11
11
|
* Formats a withdrawal amount as currency
|
|
@@ -82,10 +82,10 @@ export function formatSharesQuantity(shares) {
|
|
|
82
82
|
*/
|
|
83
83
|
export function calculateLiquidationProgress(liquidations) {
|
|
84
84
|
const total = liquidations.length;
|
|
85
|
-
const pending = liquidations.filter(
|
|
86
|
-
const inProgress = liquidations.filter(
|
|
87
|
-
const completed = liquidations.filter(
|
|
88
|
-
const failed = liquidations.filter(
|
|
85
|
+
const pending = liquidations.filter(l => l.liquidationStatus === LIQUIDATION_STATUS_PENDING).length;
|
|
86
|
+
const inProgress = liquidations.filter(l => [LIQUIDATION_STATUS_TRADES_CREATED, LIQUIDATION_STATUS_EXECUTED].includes(l.liquidationStatus)).length;
|
|
87
|
+
const completed = liquidations.filter(l => l.liquidationStatus === LIQUIDATION_STATUS_SETTLED).length;
|
|
88
|
+
const failed = liquidations.filter(l => l.liquidationStatus === LIQUIDATION_STATUS_FAILED).length;
|
|
89
89
|
const completionRate = total > 0 ? (completed / total) * 100 : 0;
|
|
90
90
|
return {
|
|
91
91
|
total,
|