@cranberry-money/shared-utils 8.23.411 → 8.23.413

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.
Files changed (41) hide show
  1. package/dist/formatting.d.ts +0 -130
  2. package/dist/formatting.d.ts.map +1 -1
  3. package/dist/formatting.js +4 -203
  4. package/dist/formatting.js.map +1 -1
  5. package/dist/index.d.ts +6 -13
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -35
  8. package/dist/index.js.map +1 -1
  9. package/dist/validation.d.ts +0 -5
  10. package/dist/validation.d.ts.map +1 -1
  11. package/dist/validation.js +3 -62
  12. package/dist/validation.js.map +1 -1
  13. package/package.json +3 -3
  14. package/dist/address.d.ts +0 -7
  15. package/dist/address.d.ts.map +0 -1
  16. package/dist/address.js +0 -104
  17. package/dist/address.js.map +0 -1
  18. package/dist/badges.d.ts +0 -2
  19. package/dist/badges.d.ts.map +0 -1
  20. package/dist/badges.js +0 -2
  21. package/dist/badges.js.map +0 -1
  22. package/dist/phoneFormatting.d.ts +0 -21
  23. package/dist/phoneFormatting.d.ts.map +0 -1
  24. package/dist/phoneFormatting.js +0 -146
  25. package/dist/phoneFormatting.js.map +0 -1
  26. package/dist/portfolio.d.ts +0 -12
  27. package/dist/portfolio.d.ts.map +0 -1
  28. package/dist/portfolio.js +0 -37
  29. package/dist/portfolio.js.map +0 -1
  30. package/dist/user-preferences.d.ts +0 -28
  31. package/dist/user-preferences.d.ts.map +0 -1
  32. package/dist/user-preferences.js +0 -88
  33. package/dist/user-preferences.js.map +0 -1
  34. package/dist/user-validation.d.ts +0 -3
  35. package/dist/user-validation.d.ts.map +0 -1
  36. package/dist/user-validation.js +0 -60
  37. package/dist/user-validation.js.map +0 -1
  38. package/dist/user-verification.d.ts +0 -40
  39. package/dist/user-verification.d.ts.map +0 -1
  40. package/dist/user-verification.js +0 -60
  41. package/dist/user-verification.js.map +0 -1
package/dist/address.js DELETED
@@ -1,104 +0,0 @@
1
- export function parseAddress(address) {
2
- if (!address || !address.trim()) {
3
- return {};
4
- }
5
- const trimmed = address.trim();
6
- const parts = trimmed
7
- .split(',')
8
- .map((part) => part.trim())
9
- .filter((part) => part.length > 0);
10
- if (parts.length === 0) {
11
- return { formatted: trimmed };
12
- }
13
- const result = {};
14
- const firstPart = parts[0];
15
- if (firstPart) {
16
- const unitMatch = firstPart.match(/^(unit|apt|apartment|suite|ste|#)\s*(\d+[a-z]?)/i);
17
- if (unitMatch) {
18
- result.unit = unitMatch[2];
19
- const remainingFirstPart = firstPart.replace(unitMatch[0], '').trim();
20
- if (remainingFirstPart) {
21
- const streetMatch = remainingFirstPart.match(/^(\d+)\s+(.+)/);
22
- if (streetMatch) {
23
- result.streetNumber = streetMatch[1];
24
- result.streetName = streetMatch[2];
25
- }
26
- else {
27
- result.streetName = remainingFirstPart;
28
- }
29
- }
30
- }
31
- else {
32
- const streetMatch = firstPart.match(/^(\d+)\s+(.+)/);
33
- if (streetMatch) {
34
- result.streetNumber = streetMatch[1];
35
- result.streetName = streetMatch[2];
36
- }
37
- else {
38
- result.streetName = firstPart;
39
- }
40
- }
41
- }
42
- if (parts.length >= 2) {
43
- result.neighborhood = parts[1];
44
- }
45
- if (parts.length >= 3) {
46
- result.city = parts[2];
47
- }
48
- if (parts.length >= 4) {
49
- const fourthPart = parts[3];
50
- if (fourthPart) {
51
- const zipcodeMatch = fourthPart.match(/\b(\d{4,5})\b/);
52
- if (zipcodeMatch) {
53
- result.zipcode = zipcodeMatch[1];
54
- result.state = fourthPart.replace(zipcodeMatch[0], '').trim();
55
- }
56
- else {
57
- result.state = fourthPart;
58
- }
59
- }
60
- }
61
- if (parts.length >= 5) {
62
- result.country = parts[4];
63
- }
64
- if (parts.length >= 6) {
65
- result.country = parts[parts.length - 1];
66
- if (parts.length === 6) {
67
- result.state = parts[4];
68
- }
69
- }
70
- const componentParts = [];
71
- if (result.unit)
72
- componentParts.push(`Unit ${result.unit}`);
73
- if (result.streetNumber)
74
- componentParts.push(result.streetNumber);
75
- if (result.streetName)
76
- componentParts.push(result.streetName);
77
- if (result.neighborhood)
78
- componentParts.push(result.neighborhood);
79
- result.formatted = componentParts.join(' ');
80
- return result;
81
- }
82
- export function getAddressDisplayLines(parsed) {
83
- const lines = [];
84
- if (parsed.formatted) {
85
- lines.push({ label: 'Street:', value: parsed.formatted });
86
- }
87
- if (parsed.city) {
88
- lines.push({ label: 'City:', value: parsed.city });
89
- }
90
- if (parsed.zipcode && parsed.state) {
91
- lines.push({ label: 'Postal:', value: `${parsed.zipcode}, ${parsed.state}` });
92
- }
93
- else if (parsed.zipcode) {
94
- lines.push({ label: 'Postal:', value: parsed.zipcode });
95
- }
96
- else if (parsed.state) {
97
- lines.push({ label: 'State:', value: parsed.state });
98
- }
99
- if (parsed.country) {
100
- lines.push({ label: 'Country:', value: parsed.country });
101
- }
102
- return lines;
103
- }
104
- //# sourceMappingURL=address.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"address.js","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtF,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC9D,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBACrC,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACrD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACvD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,IAAI;QAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,YAAY;QAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,UAAU;QAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,YAAY;QAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAElE,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAqB;IAC1D,MAAM,KAAK,GAA4C,EAAE,CAAC;IAE1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/badges.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=badges.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badges.d.ts","sourceRoot":"","sources":["../src/badges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
package/dist/badges.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=badges.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badges.js","sourceRoot":"","sources":["../src/badges.ts"],"names":[],"mappings":""}
@@ -1,21 +0,0 @@
1
- import type { CountryData } from '@cranberry-money/shared-constants';
2
- /**
3
- * Format a phone number for display based on country
4
- * @param phoneNumber - Raw phone number string
5
- * @param country - Country data object
6
- * @returns Formatted phone number string
7
- */
8
- export declare const formatPhoneForDisplay: (phoneNumber: string, country: CountryData) => string;
9
- /**
10
- * Remove formatting from phone number to get clean digits
11
- * @param formattedNumber - Formatted phone number string
12
- * @returns Clean digit-only string
13
- */
14
- export declare const cleanPhoneNumber: (formattedNumber: string) => string;
15
- /**
16
- * Get the expected phone number length for a country
17
- * @param country - Country data object
18
- * @returns Expected number of digits (without country code)
19
- */
20
- export declare const getExpectedPhoneLength: (country: CountryData) => number;
21
- //# sourceMappingURL=phoneFormatting.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phoneFormatting.d.ts","sourceRoot":"","sources":["../src/phoneFormatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAkErE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,aAAa,MAAM,EAAE,SAAS,WAAW,KAAG,MAiBjF,CAAC;AAyCF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,iBAAiB,MAAM,KAAG,MAE1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,WAAW,KAAG,MAe7D,CAAC"}
@@ -1,146 +0,0 @@
1
- /**
2
- * Phone number formatting utilities for international phone numbers
3
- * Provides country-specific formatting patterns and input helpers
4
- */
5
- // Phone number formatting patterns for different countries
6
- const PHONE_PATTERNS = {
7
- // Australia: 04XX XXX XXX or 03 XXXX XXXX
8
- AU: {
9
- pattern: /^(\d{3})(\d{3})(\d{3})$/,
10
- format: '$1 $2 $3',
11
- },
12
- // US/Canada: (XXX) XXX-XXXX
13
- US: {
14
- pattern: /^(\d{3})(\d{3})(\d{4})$/,
15
- format: '($1) $2-$3',
16
- },
17
- CA: {
18
- pattern: /^(\d{3})(\d{3})(\d{4})$/,
19
- format: '($1) $2-$3',
20
- },
21
- // UK: 07XXX XXXXXX
22
- GB: {
23
- pattern: /^(\d{4})(\d{6})$/,
24
- format: '$1 $2',
25
- },
26
- // Germany: 01XX XXXXXXX
27
- DE: {
28
- pattern: /^(\d{4})(\d{7})$/,
29
- format: '$1 $2',
30
- },
31
- // France: 06 XX XX XX XX
32
- FR: {
33
- pattern: /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/,
34
- format: '$1 $2 $3 $4 $5',
35
- },
36
- // Japan: 090-XXXX-XXXX
37
- JP: {
38
- pattern: /^(\d{3})(\d{4})(\d{4})$/,
39
- format: '$1-$2-$3',
40
- },
41
- // Singapore: 9XXX XXXX
42
- SG: {
43
- pattern: /^(\d{4})(\d{4})$/,
44
- format: '$1 $2',
45
- },
46
- // New Zealand: 02X XXX XXXX
47
- NZ: {
48
- pattern: /^(\d{3})(\d{3})(\d{4})$/,
49
- format: '$1 $2 $3',
50
- },
51
- // India: 9XXXX XXXXX
52
- IN: {
53
- pattern: /^(\d{5})(\d{5})$/,
54
- format: '$1 $2',
55
- },
56
- };
57
- // Default pattern for unknown countries
58
- const DEFAULT_PATTERN = {
59
- pattern: /^(\d{3})(\d{3})(\d+)$/,
60
- format: '$1 $2 $3',
61
- };
62
- /**
63
- * Format a phone number for display based on country
64
- * @param phoneNumber - Raw phone number string
65
- * @param country - Country data object
66
- * @returns Formatted phone number string
67
- */
68
- export const formatPhoneForDisplay = (phoneNumber, country) => {
69
- // Remove all non-digit characters
70
- const digits = phoneNumber.replace(/\D/g, '');
71
- if (!digits)
72
- return '';
73
- // Get formatting pattern for country
74
- const pattern = PHONE_PATTERNS[country.code] || DEFAULT_PATTERN;
75
- // Apply formatting if the number matches the expected length/pattern
76
- const match = digits.match(pattern.pattern);
77
- if (match) {
78
- return digits.replace(pattern.pattern, pattern.format);
79
- }
80
- // For partial numbers, apply basic spacing
81
- return applyBasicSpacing(digits, country);
82
- };
83
- /**
84
- * Apply basic spacing for partial numbers during typing
85
- * @param digits - Clean digit string
86
- * @param country - Country data object
87
- * @returns Partially formatted phone number
88
- */
89
- const applyBasicSpacing = (digits, country) => {
90
- if (digits.length <= 3)
91
- return digits;
92
- // Different spacing patterns based on country
93
- switch (country.code) {
94
- case 'US':
95
- case 'CA':
96
- // (XXX) XXX-XXXX pattern
97
- if (digits.length <= 6) {
98
- return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;
99
- }
100
- return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6, 10)}`;
101
- case 'FR':
102
- // 06 XX XX XX XX pattern
103
- return digits.replace(/(\d{2})(?=\d)/g, '$1 ').trim();
104
- case 'JP':
105
- // 090-XXXX-XXXX pattern
106
- if (digits.length <= 7) {
107
- return `${digits.slice(0, 3)}-${digits.slice(3)}`;
108
- }
109
- return `${digits.slice(0, 3)}-${digits.slice(3, 7)}-${digits.slice(7, 11)}`;
110
- default:
111
- // Default: XXX XXX XXX pattern (good for AU, GB, etc.)
112
- if (digits.length <= 6) {
113
- return `${digits.slice(0, 3)} ${digits.slice(3)}`;
114
- }
115
- return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6)}`;
116
- }
117
- };
118
- /**
119
- * Remove formatting from phone number to get clean digits
120
- * @param formattedNumber - Formatted phone number string
121
- * @returns Clean digit-only string
122
- */
123
- export const cleanPhoneNumber = (formattedNumber) => {
124
- return formattedNumber.replace(/\D/g, '');
125
- };
126
- /**
127
- * Get the expected phone number length for a country
128
- * @param country - Country data object
129
- * @returns Expected number of digits (without country code)
130
- */
131
- export const getExpectedPhoneLength = (country) => {
132
- const lengthMap = {
133
- AU: 9, // 04X XXX XXX
134
- US: 10, // XXX XXX XXXX
135
- CA: 10, // XXX XXX XXXX
136
- GB: 10, // 07XXX XXXXXX
137
- DE: 11, // 01XX XXXXXXX
138
- FR: 10, // 06 XX XX XX XX
139
- JP: 11, // 090 XXXX XXXX
140
- SG: 8, // 9XXX XXXX
141
- NZ: 10, // 02X XXX XXXX
142
- IN: 10, // 9XXXX XXXXX
143
- };
144
- return lengthMap[country.code] || 10; // Default to 10 digits
145
- };
146
- //# sourceMappingURL=phoneFormatting.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phoneFormatting.js","sourceRoot":"","sources":["../src/phoneFormatting.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,2DAA2D;AAC3D,MAAM,cAAc,GAAwD;IAC1E,0CAA0C;IAC1C,EAAE,EAAE;QACF,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,4BAA4B;IAC5B,EAAE,EAAE;QACF,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,YAAY;KACrB;IACD,EAAE,EAAE;QACF,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,YAAY;KACrB;IACD,mBAAmB;IACnB,EAAE,EAAE;QACF,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,OAAO;KAChB;IACD,wBAAwB;IACxB,EAAE,EAAE;QACF,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,OAAO;KAChB;IACD,yBAAyB;IACzB,EAAE,EAAE;QACF,OAAO,EAAE,uCAAuC;QAChD,MAAM,EAAE,gBAAgB;KACzB;IACD,uBAAuB;IACvB,EAAE,EAAE;QACF,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,uBAAuB;IACvB,EAAE,EAAE;QACF,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,OAAO;KAChB;IACD,4BAA4B;IAC5B,EAAE,EAAE;QACF,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,qBAAqB;IACrB,EAAE,EAAE;QACF,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,OAAO;KAChB;CACF,CAAC;AAEF,wCAAwC;AACxC,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,uBAAuB;IAChC,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,WAAmB,EAAE,OAAoB,EAAU,EAAE;IACzF,kCAAkC;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,qCAAqC;IACrC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC;IAEhE,qEAAqE;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,2CAA2C;IAC3C,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,OAAoB,EAAU,EAAE;IACzE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAEtC,8CAA8C;IAC9C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC;QACV,KAAK,IAAI;YACP,yBAAyB;YACzB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAEhF,KAAK,IAAI;YACP,yBAAyB;YACzB,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAExD,KAAK,IAAI;YACP,wBAAwB;YACxB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,CAAC;YACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAE9E;YACE,uDAAuD;YACvD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,CAAC;YACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,eAAuB,EAAU,EAAE;IAClE,OAAO,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAoB,EAAU,EAAE;IACrE,MAAM,SAAS,GAA2B;QACxC,EAAE,EAAE,CAAC,EAAE,cAAc;QACrB,EAAE,EAAE,EAAE,EAAE,eAAe;QACvB,EAAE,EAAE,EAAE,EAAE,eAAe;QACvB,EAAE,EAAE,EAAE,EAAE,eAAe;QACvB,EAAE,EAAE,EAAE,EAAE,eAAe;QACvB,EAAE,EAAE,EAAE,EAAE,iBAAiB;QACzB,EAAE,EAAE,EAAE,EAAE,gBAAgB;QACxB,EAAE,EAAE,CAAC,EAAE,YAAY;QACnB,EAAE,EAAE,EAAE,EAAE,eAAe;QACvB,EAAE,EAAE,EAAE,EAAE,cAAc;KACvB,CAAC;IAEF,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,uBAAuB;AAC/D,CAAC,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { AssetAllocation } from '@cranberry-money/shared-types';
2
- export declare function formatPortfolioValue(value: string | number): string;
3
- /**
4
- * Calculate portfolio return percentage
5
- */
6
- export declare function calculateReturnPercentage(marketValue: string | number, transfersIn: string | number, transfersOut: string | number): number;
7
- /**
8
- * Parse numeric value from string or number
9
- */
10
- export declare function parseNumericValue(value: string | number | undefined | null): number;
11
- export declare const validateAllocations: (allocations: readonly AssetAllocation[]) => boolean;
12
- //# sourceMappingURL=portfolio.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../src/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMnE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,YAAY,EAAE,MAAM,GAAG,MAAM,GAC5B,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAGnF;AAED,eAAO,MAAM,mBAAmB,GAAI,aAAa,SAAS,eAAe,EAAE,KAAG,OAM7E,CAAC"}
package/dist/portfolio.js DELETED
@@ -1,37 +0,0 @@
1
- import { LOCALE_AUSTRALIA, DEFAULT_NUMERIC_ZERO, DEFAULT_EMPTY_STRING, AUD } from '@cranberry-money/shared-constants';
2
- import { NUMBER_FORMAT_OPTIONS_CURRENCY } from './formatting';
3
- export function formatPortfolioValue(value) {
4
- const numValue = typeof value === 'string' ? parseFloat(value) : value;
5
- return new Intl.NumberFormat(LOCALE_AUSTRALIA, {
6
- ...NUMBER_FORMAT_OPTIONS_CURRENCY,
7
- currency: AUD,
8
- }).format(numValue);
9
- }
10
- /**
11
- * Calculate portfolio return percentage
12
- */
13
- export function calculateReturnPercentage(marketValue, transfersIn, transfersOut) {
14
- const current = typeof marketValue === 'string' ? parseFloat(marketValue || DEFAULT_EMPTY_STRING) : marketValue;
15
- const inflows = typeof transfersIn === 'string' ? parseFloat(transfersIn || DEFAULT_EMPTY_STRING) : transfersIn;
16
- const outflows = typeof transfersOut === 'string' ? parseFloat(transfersOut || DEFAULT_EMPTY_STRING) : transfersOut;
17
- const invested = inflows - outflows;
18
- if (invested <= DEFAULT_NUMERIC_ZERO)
19
- return DEFAULT_NUMERIC_ZERO;
20
- const gain = current - invested;
21
- return (gain / invested) * 100;
22
- }
23
- /**
24
- * Parse numeric value from string or number
25
- */
26
- export function parseNumericValue(value) {
27
- if (value === undefined || value === null)
28
- return DEFAULT_NUMERIC_ZERO;
29
- return typeof value === 'string' ? parseFloat(value || DEFAULT_EMPTY_STRING) : value;
30
- }
31
- export const validateAllocations = (allocations) => {
32
- const totalPercentage = allocations.reduce((sum, allocation) => {
33
- return sum + (allocation.percentage ? parseFloat(allocation.percentage) : 0);
34
- }, 0);
35
- return Math.abs(totalPercentage - 100) < 0.01;
36
- };
37
- //# sourceMappingURL=portfolio.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../src/portfolio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,mCAAmC,CAAC;AACtH,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACzD,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACvE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;QAC7C,GAAG,8BAA8B;QACjC,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAA4B,EAC5B,WAA4B,EAC5B,YAA6B;IAE7B,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAChH,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAChH,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAEpH,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,IAAI,QAAQ,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAElE,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAyC;IACzE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,oBAAoB,CAAC;IACvE,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAuC,EAAW,EAAE;IACtF,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;QAC7D,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC,CAAC"}
@@ -1,28 +0,0 @@
1
- import type { UserPreferences, UserPreferencesValidationError } from '@cranberry-money/shared-types';
2
- export declare const validateUserPreferences: (preferences: Partial<UserPreferences>, userAccounts?: string[], userPortfolios?: {
3
- uuid: string;
4
- userAccountUuid: string;
5
- }[]) => {
6
- isValid: boolean;
7
- errors?: UserPreferencesValidationError;
8
- };
9
- export declare const hasUserPreferences: (preferences: UserPreferences | null) => boolean;
10
- export declare const getUserPreferencesSummary: (preferences: UserPreferences | null) => string;
11
- export declare const formatUserPreferencesForDisplay: (preferences: UserPreferences | null) => {
12
- hasPreferences: boolean;
13
- favoriteAccount: string | null;
14
- favoritePortfolio: string | null;
15
- summary: string;
16
- };
17
- export declare const getAvailablePortfoliosForAccount: (userAccountUuid: string, allPortfolios: {
18
- uuid: string;
19
- userAccountUuid: string;
20
- name: string;
21
- }[]) => {
22
- uuid: string;
23
- name: string;
24
- }[];
25
- export declare const isValidUserPreferencesUpdate: (currentPreferences: UserPreferences | null, updates: Partial<UserPreferences>) => boolean;
26
- export declare const getUserPreferencesCacheKey: (userProfileUuid: string) => string;
27
- export declare const sanitizeUserPreferencesInput: (input: unknown) => Partial<UserPreferences>;
28
- //# sourceMappingURL=user-preferences.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../src/user-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAGrG,eAAO,MAAM,uBAAuB,GAClC,aAAa,OAAO,CAAC,eAAe,CAAC,EACrC,eAAc,MAAM,EAAO,EAC3B,iBAAgB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EAAO,KAC/D;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,8BAA8B,CAAA;CA2B7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,aAAa,eAAe,GAAG,IAAI,KAAG,OAGxE,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,aAAa,eAAe,GAAG,IAAI,KAAG,MAc/E,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,aAAa,eAAe,GAAG,IAAI;;;;;CAOlF,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,iBAAiB,MAAM,EACvB,eAAe;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KACvE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAIhC,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,oBAAoB,eAAe,GAAG,IAAI,EAC1C,SAAS,OAAO,CAAC,eAAe,CAAC,KAChC,OAWF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,iBAAiB,MAAM,KAAG,MAEpE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,OAAO,OAAO,KAAG,OAAO,CAAC,eAAe,CAoBpF,CAAC"}
@@ -1,88 +0,0 @@
1
- import { USER_PREFERENCES_ERROR_MESSAGES } from '@cranberry-money/shared-constants';
2
- export const validateUserPreferences = (preferences, userAccounts = [], userPortfolios = []) => {
3
- const errors = {};
4
- if (preferences.favoritePortfolio && !preferences.favoriteAccount) {
5
- errors.favoriteAccount = USER_PREFERENCES_ERROR_MESSAGES.FAVORITE_ACCOUNT_REQUIRED_FOR_PORTFOLIO;
6
- }
7
- if (preferences.favoriteAccount && !userAccounts.includes(preferences.favoriteAccount)) {
8
- errors.favoriteAccount = USER_PREFERENCES_ERROR_MESSAGES.FAVORITE_ACCOUNT_NOT_OWNED;
9
- }
10
- if (preferences.favoritePortfolio) {
11
- const portfolioExists = userPortfolios.some((p) => p.uuid === preferences.favoritePortfolio);
12
- if (!portfolioExists) {
13
- errors.favoritePortfolio = USER_PREFERENCES_ERROR_MESSAGES.FAVORITE_PORTFOLIO_NOT_OWNED;
14
- }
15
- else {
16
- const portfolio = userPortfolios.find((p) => p.uuid === preferences.favoritePortfolio);
17
- if (portfolio && preferences.favoriteAccount && portfolio.userAccountUuid !== preferences.favoriteAccount) {
18
- errors.favoritePortfolio = USER_PREFERENCES_ERROR_MESSAGES.FAVORITE_PORTFOLIO_ACCOUNT_MISMATCH;
19
- }
20
- }
21
- }
22
- return {
23
- isValid: Object.keys(errors).length === 0,
24
- errors: Object.keys(errors).length > 0 ? errors : undefined,
25
- };
26
- };
27
- export const hasUserPreferences = (preferences) => {
28
- if (!preferences)
29
- return false;
30
- return Boolean(preferences.favoriteAccount || preferences.favoritePortfolio);
31
- };
32
- export const getUserPreferencesSummary = (preferences) => {
33
- if (!preferences || !hasUserPreferences(preferences))
34
- return 'No preferences set';
35
- const parts = [];
36
- if (preferences.favoriteAccount) {
37
- parts.push(`Account: ${preferences.favoriteAccount}`);
38
- }
39
- if (preferences.favoritePortfolio) {
40
- parts.push(`Portfolio: ${preferences.favoritePortfolio}`);
41
- }
42
- return parts.length > 0 ? parts.join(', ') : 'No preferences set';
43
- };
44
- export const formatUserPreferencesForDisplay = (preferences) => {
45
- return {
46
- hasPreferences: hasUserPreferences(preferences),
47
- favoriteAccount: preferences?.favoriteAccount || null,
48
- favoritePortfolio: preferences?.favoritePortfolio || null,
49
- summary: getUserPreferencesSummary(preferences),
50
- };
51
- };
52
- export const getAvailablePortfoliosForAccount = (userAccountUuid, allPortfolios) => {
53
- return allPortfolios
54
- .filter((portfolio) => portfolio.userAccountUuid === userAccountUuid)
55
- .map(({ uuid, name }) => ({ uuid, name }));
56
- };
57
- export const isValidUserPreferencesUpdate = (currentPreferences, updates) => {
58
- if (!updates || Object.keys(updates).length === 0)
59
- return false;
60
- if (!currentPreferences) {
61
- return Boolean(updates.favoriteAccount || updates.favoritePortfolio);
62
- }
63
- return (updates.favoriteAccount !== currentPreferences.favoriteAccount ||
64
- updates.favoritePortfolio !== currentPreferences.favoritePortfolio);
65
- };
66
- export const getUserPreferencesCacheKey = (userProfileUuid) => {
67
- return `user_preferences_${userProfileUuid}`;
68
- };
69
- export const sanitizeUserPreferencesInput = (input) => {
70
- const sanitized = {};
71
- if (input && typeof input === 'object') {
72
- const inputObj = input;
73
- if (typeof inputObj.favoriteAccount === 'string' && inputObj.favoriteAccount.trim()) {
74
- sanitized.favoriteAccount = inputObj.favoriteAccount.trim();
75
- }
76
- else if (inputObj.favoriteAccount === null || inputObj.favoriteAccount === '') {
77
- sanitized.favoriteAccount = null;
78
- }
79
- if (typeof inputObj.favoritePortfolio === 'string' && inputObj.favoritePortfolio.trim()) {
80
- sanitized.favoritePortfolio = inputObj.favoritePortfolio.trim();
81
- }
82
- else if (inputObj.favoritePortfolio === null || inputObj.favoritePortfolio === '') {
83
- sanitized.favoritePortfolio = null;
84
- }
85
- }
86
- return sanitized;
87
- };
88
- //# sourceMappingURL=user-preferences.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-preferences.js","sourceRoot":"","sources":["../src/user-preferences.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { UserProfileFieldValidation } from '@cranberry-money/shared-types';
2
- export declare const validateUserProfileField: UserProfileFieldValidation;
3
- //# sourceMappingURL=user-validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-validation.d.ts","sourceRoot":"","sources":["../src/user-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAIlG,eAAO,MAAM,wBAAwB,EAAE,0BAmEtC,CAAC"}
@@ -1,60 +0,0 @@
1
- import { USER_PROFILE_VALIDATION } from '@cranberry-money/shared-constants';
2
- import { isValidPhoneFormat, isValidFullName } from './validation';
3
- export const validateUserProfileField = {
4
- fullName: (value) => {
5
- const trimmed = value.trim();
6
- if (trimmed.length === 0) {
7
- return {
8
- isValid: false,
9
- message: 'Full name is required',
10
- };
11
- }
12
- if (!isValidFullName(trimmed)) {
13
- return {
14
- isValid: false,
15
- message: `Please enter at least ${USER_PROFILE_VALIDATION.MIN_NAME_PARTS} names`,
16
- };
17
- }
18
- return {
19
- isValid: true,
20
- };
21
- },
22
- phoneNumber: (value) => {
23
- const trimmed = value.trim();
24
- if (trimmed.length === 0) {
25
- return {
26
- isValid: false,
27
- message: 'Phone number is required',
28
- };
29
- }
30
- if (!isValidPhoneFormat(trimmed)) {
31
- return {
32
- isValid: false,
33
- message: 'Please enter a valid phone number',
34
- };
35
- }
36
- return {
37
- isValid: true,
38
- };
39
- },
40
- residentialAddress: (value) => {
41
- const trimmed = value.trim();
42
- const minLength = USER_PROFILE_VALIDATION.MIN_ADDRESS_LENGTH || 10;
43
- if (trimmed.length === 0) {
44
- return {
45
- isValid: false,
46
- message: 'Residential address is required',
47
- };
48
- }
49
- if (trimmed.length < minLength) {
50
- return {
51
- isValid: false,
52
- message: `Address must be at least ${minLength} characters`,
53
- };
54
- }
55
- return {
56
- isValid: true,
57
- };
58
- },
59
- };
60
- //# sourceMappingURL=user-validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-validation.js","sourceRoot":"","sources":["../src/user-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,wBAAwB,GAA+B;IAClE,QAAQ,EAAE,CAAC,KAAa,EAAoB,EAAE;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,uBAAuB;aACjC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yBAAyB,uBAAuB,CAAC,cAAc,QAAQ;aACjF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,WAAW,EAAE,CAAC,KAAa,EAAoB,EAAE;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,0BAA0B;aACpC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,mCAAmC;aAC7C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,kBAAkB,EAAE,CAAC,KAAa,EAAoB,EAAE;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,uBAAuB,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,iCAAiC;aAC3C,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,4BAA4B,SAAS,aAAa;aAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1,40 +0,0 @@
1
- /**
2
- * User verification status utilities for consistent verification status display
3
- */
4
- import type { UserProfile } from '@cranberry-money/shared-types';
5
- /**
6
- * Verification status types
7
- */
8
- export type VerificationStatusType = 'verified' | 'pending' | 'rejected' | 'not_verified' | 'unknown';
9
- /**
10
- * Verification status with type and display label
11
- */
12
- export interface VerificationStatus {
13
- type: VerificationStatusType;
14
- label: string;
15
- }
16
- /**
17
- * Gets the verification status for a user profile
18
- * @param userProfile - User profile object or null
19
- * @returns Verification status with type and label
20
- */
21
- export declare function getUserVerificationStatus(userProfile: UserProfile | null | undefined): VerificationStatus;
22
- /**
23
- * Checks if a user profile is verified
24
- * @param userProfile - User profile object or null
25
- * @returns True if user is verified
26
- */
27
- export declare function isUserVerified(userProfile: UserProfile | null | undefined): boolean;
28
- /**
29
- * Checks if a user profile has pending verification
30
- * @param userProfile - User profile object or null
31
- * @returns True if verification is pending
32
- */
33
- export declare function isVerificationPending(userProfile: UserProfile | null | undefined): boolean;
34
- /**
35
- * Checks if a user profile verification was rejected
36
- * @param userProfile - User profile object or null
37
- * @returns True if verification was rejected
38
- */
39
- export declare function isVerificationRejected(userProfile: UserProfile | null | undefined): boolean;
40
- //# sourceMappingURL=user-verification.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-verification.d.ts","sourceRoot":"","sources":["../src/user-verification.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,kBAAkB,CA0BzG;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQ1F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI3F"}