@cranberry-money/shared-utils 8.23.412 → 8.23.414

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 (45) hide show
  1. package/dist/address.d.ts +4 -6
  2. package/dist/address.d.ts.map +1 -1
  3. package/dist/address.js +6 -100
  4. package/dist/address.js.map +1 -1
  5. package/dist/formatting-labels.d.ts +3 -0
  6. package/dist/formatting-labels.d.ts.map +1 -0
  7. package/dist/formatting-labels.js +26 -0
  8. package/dist/formatting-labels.js.map +1 -0
  9. package/dist/formatting.d.ts +0 -130
  10. package/dist/formatting.d.ts.map +1 -1
  11. package/dist/formatting.js +4 -203
  12. package/dist/formatting.js.map +1 -1
  13. package/dist/index.d.ts +9 -11
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +9 -33
  16. package/dist/index.js.map +1 -1
  17. package/dist/phoneFormatting.d.ts +2 -20
  18. package/dist/phoneFormatting.d.ts.map +1 -1
  19. package/dist/phoneFormatting.js +11 -143
  20. package/dist/phoneFormatting.js.map +1 -1
  21. package/dist/user-validation.d.ts +1 -2
  22. package/dist/user-validation.d.ts.map +1 -1
  23. package/dist/user-validation.js +10 -59
  24. package/dist/user-validation.js.map +1 -1
  25. package/dist/user-verification.d.ts +2 -39
  26. package/dist/user-verification.d.ts.map +1 -1
  27. package/dist/user-verification.js +11 -58
  28. package/dist/user-verification.js.map +1 -1
  29. package/dist/validation.d.ts +1 -3
  30. package/dist/validation.d.ts.map +1 -1
  31. package/dist/validation.js +10 -47
  32. package/dist/validation.js.map +1 -1
  33. package/package.json +3 -3
  34. package/dist/badges.d.ts +0 -2
  35. package/dist/badges.d.ts.map +0 -1
  36. package/dist/badges.js +0 -2
  37. package/dist/badges.js.map +0 -1
  38. package/dist/portfolio.d.ts +0 -12
  39. package/dist/portfolio.d.ts.map +0 -1
  40. package/dist/portfolio.js +0 -37
  41. package/dist/portfolio.js.map +0 -1
  42. package/dist/user-preferences.d.ts +0 -28
  43. package/dist/user-preferences.d.ts.map +0 -1
  44. package/dist/user-preferences.js +0 -88
  45. package/dist/user-preferences.js.map +0 -1
@@ -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,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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"}