@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.
- package/dist/formatting.d.ts +0 -130
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +4 -203
- package/dist/formatting.js.map +1 -1
- package/dist/index.d.ts +6 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -35
- package/dist/index.js.map +1 -1
- package/dist/validation.d.ts +0 -5
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +3 -62
- package/dist/validation.js.map +1 -1
- package/package.json +3 -3
- package/dist/address.d.ts +0 -7
- package/dist/address.d.ts.map +0 -1
- package/dist/address.js +0 -104
- package/dist/address.js.map +0 -1
- package/dist/badges.d.ts +0 -2
- package/dist/badges.d.ts.map +0 -1
- package/dist/badges.js +0 -2
- package/dist/badges.js.map +0 -1
- package/dist/phoneFormatting.d.ts +0 -21
- package/dist/phoneFormatting.d.ts.map +0 -1
- package/dist/phoneFormatting.js +0 -146
- package/dist/phoneFormatting.js.map +0 -1
- package/dist/portfolio.d.ts +0 -12
- package/dist/portfolio.d.ts.map +0 -1
- package/dist/portfolio.js +0 -37
- package/dist/portfolio.js.map +0 -1
- package/dist/user-preferences.d.ts +0 -28
- package/dist/user-preferences.d.ts.map +0 -1
- package/dist/user-preferences.js +0 -88
- package/dist/user-preferences.js.map +0 -1
- package/dist/user-validation.d.ts +0 -3
- package/dist/user-validation.d.ts.map +0 -1
- package/dist/user-validation.js +0 -60
- package/dist/user-validation.js.map +0 -1
- package/dist/user-verification.d.ts +0 -40
- package/dist/user-verification.d.ts.map +0 -1
- package/dist/user-verification.js +0 -60
- 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
|
package/dist/address.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"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"}
|
package/dist/badges.d.ts
DELETED
package/dist/badges.d.ts.map
DELETED
|
@@ -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
package/dist/badges.js.map
DELETED
|
@@ -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"}
|
package/dist/phoneFormatting.js
DELETED
|
@@ -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":"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"}
|
package/dist/portfolio.d.ts
DELETED
|
@@ -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
|
package/dist/portfolio.d.ts.map
DELETED
|
@@ -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
|
package/dist/portfolio.js.map
DELETED
|
@@ -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"}
|
package/dist/user-preferences.js
DELETED
|
@@ -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 +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"}
|
package/dist/user-validation.js
DELETED
|
@@ -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"}
|