UNPKG

@cranberry-money/shared-constants

Version:

Shared constants for Blueberry platform

235 lines 8.64 kB
import { COMMON_THRESHOLDS, DEFAULT_STRINGS, DEFAULT_NUMBERS, LOCALE_CONFIG, DEFAULT_FORMAT_OPTIONS, CONFIG_ALLOCATION_DEFAULTS, } from './config'; // ============================================ // Common Utilities // ============================================ export const DECIMAL_PLACES = COMMON_THRESHOLDS.DEFAULT_DECIMALS; export const DEFAULT_NUMERIC_ZERO = DEFAULT_NUMBERS.ZERO; export const DEFAULT_EMPTY_STRING = DEFAULT_STRINGS.EMPTY; export const QUANTITY_FORMAT_THRESHOLD_MILLION = COMMON_THRESHOLDS.MILLION; export const QUANTITY_FORMAT_THRESHOLD_THOUSAND = COMMON_THRESHOLDS.THOUSAND; export const ERROR_TYPE_BUSINESS_LOGIC = 'business_logic'; export const ERROR_TYPE_PERMISSION = 'permission'; export const ERROR_TYPE_SERVER = 'server'; export const LOCALE_AUSTRALIA = LOCALE_CONFIG.DEFAULT; export const NUMBER_FORMAT_OPTIONS_CURRENCY = DEFAULT_FORMAT_OPTIONS.CURRENCY; export const NUMBER_FORMAT_OPTIONS_CURRENCY_SIGNED = DEFAULT_FORMAT_OPTIONS.CURRENCY_SIGNED; export const QUERY_PARAM_ORDER_BY = 'order_by'; export const ORDER_BY_CREATED_AT = 'created_at'; export const DEFAULT_UNKNOWN_VALUE = DEFAULT_STRINGS.UNKNOWN; export const DEFAULT_ERROR_MESSAGE = DEFAULT_STRINGS.ERROR_MESSAGE; // ============================================ // Default Values // ============================================ export const DEFAULT_VALUES = { ZERO: DEFAULT_STRINGS.ZERO, EMPTY_STRING: DEFAULT_STRINGS.EMPTY, UNKNOWN: 'UNKNOWN', NOT_APPLICABLE: DEFAULT_STRINGS.NOT_APPLICABLE, NULL_UUID: DEFAULT_STRINGS.NULL_UUID, }; export const NUMERIC_DEFAULTS = { MIN_AMOUNT: DEFAULT_NUMBERS.ZERO, MAX_AMOUNT: 999999999.99, DEFAULT_PRECISION: DEFAULT_NUMBERS.PRECISION, PERCENTAGE_PRECISION: DEFAULT_NUMBERS.PERCENTAGE_PRECISION, QUANTITY_PRECISION: DEFAULT_NUMBERS.QUANTITY_PRECISION, }; export const THRESHOLDS = { MIN_PORTFOLIO_VALUE: COMMON_THRESHOLDS.MIN_PORTFOLIO_VALUE, MIN_TRADE_AMOUNT: COMMON_THRESHOLDS.MIN_TRADE_AMOUNT, MIN_WITHDRAWAL_AMOUNT: COMMON_THRESHOLDS.MIN_WITHDRAWAL_AMOUNT, MAX_PORTFOLIOS_PER_USER: COMMON_THRESHOLDS.MAX_PORTFOLIOS_PER_USER, MAX_TRADES_PER_DAY: COMMON_THRESHOLDS.MAX_TRADES_PER_DAY, }; export const DISPLAY_LIMITS = { MAX_NAME_LENGTH: COMMON_THRESHOLDS.MAX_NAME_LENGTH, MAX_DESCRIPTION_LENGTH: COMMON_THRESHOLDS.MAX_DESCRIPTION_LENGTH, MAX_NOTES_LENGTH: COMMON_THRESHOLDS.MAX_NOTES_LENGTH, MAX_FILE_SIZE_MB: COMMON_THRESHOLDS.MAX_FILE_SIZE_MB, MAX_FILE_NAME_LENGTH: COMMON_THRESHOLDS.MAX_FILE_NAME_LENGTH, DASHBOARD_RECENT_TRADES: 5, DASHBOARD_ORDERS: 5, DASHBOARD_TRANSACTIONS: 5, DASHBOARD_WITHDRAWALS: 5, DEFAULT_PAGE_SIZE: 20, PAGE_SIZE_OPTIONS: [10, 20, 50, 100], AUTOCOMPLETE_MAX_RESULTS: 10, RECENT_SEARCHES_MAX: 5, }; export const ALLOCATION_DEFAULTS = { DEFAULT_PERCENTAGE: CONFIG_ALLOCATION_DEFAULTS.DEFAULT_PERCENTAGE, PERCENTAGE_PRECISION: CONFIG_ALLOCATION_DEFAULTS.PERCENTAGE_PRECISION, TARGET_TOTAL: CONFIG_ALLOCATION_DEFAULTS.TARGET_TOTAL, }; // ============================================ // Sorting // ============================================ export const SORT_DIRECTION = { ASC: 'asc', DESC: 'desc', }; export const SORT_FIELDS = { CREATED_AT: 'created_at', UPDATED_AT: 'updated_at', DATE: 'date', NAME: 'name', TITLE: 'title', AMOUNT: 'amount', VALUE: 'value', PRICE: 'price', QUANTITY: 'quantity', STATUS: 'status', PRIORITY: 'priority', SYMBOL: 'symbol', TYPE: 'type', }; export const DEFAULT_SORT_CONFIG = { PORTFOLIOS: { field: SORT_FIELDS.UPDATED_AT, direction: SORT_DIRECTION.DESC, }, TRADES: { field: SORT_FIELDS.CREATED_AT, direction: SORT_DIRECTION.DESC, }, WITHDRAWALS: { field: SORT_FIELDS.CREATED_AT, direction: SORT_DIRECTION.DESC, }, TRANSACTIONS: { field: SORT_FIELDS.DATE, direction: SORT_DIRECTION.DESC, }, }; export const SORT_DIRECTION_ASC = SORT_DIRECTION.ASC; export const SORT_DIRECTION_DESC = SORT_DIRECTION.DESC; // ============================================ // Time and Date // ============================================ export const MILLISECONDS = { SECOND: 1000, MINUTE: 60 * 1000, HOUR: 60 * 60 * 1000, DAY: 24 * 60 * 60 * 1000, WEEK: 7 * 24 * 60 * 60 * 1000, }; export const SECONDS = { MINUTE: 60, HOUR: 60 * 60, DAY: 24 * 60 * 60, WEEK: 7 * 24 * 60 * 60, }; export const DATE_FORMATS = { DISPLAY_DATE: 'MMM dd, yyyy', DISPLAY_DATE_TIME: 'MMM dd, yyyy HH:mm', DISPLAY_DATE_TIME_SECONDS: 'MMM dd, yyyy HH:mm:ss', DISPLAY_SHORT: 'MM/dd/yy', API_DATE: 'yyyy-MM-dd', API_DATETIME: "yyyy-MM-dd'T'HH:mm:ss", API_DATETIME_WITH_TIMEZONE: "yyyy-MM-dd'T'HH:mm:ss'Z'", MONTH_YEAR: 'MMM yyyy', YEAR: 'yyyy', TIME: 'HH:mm', TIME_WITH_SECONDS: 'HH:mm:ss', }; export const TIME_ZONES = { UTC: 'UTC', EST: 'America/New_York', PST: 'America/Los_Angeles', SYDNEY: 'Australia/Sydney', MELBOURNE: 'Australia/Melbourne', }; export const SESSION_DURATIONS = { DEFAULT: 30 * 60 * 1000, EXTENDED: 24 * 60 * 60 * 1000, REMEMBER_ME: 30 * 24 * 60 * 60 * 1000, }; export const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; export const DEFAULT_RECENT_TRANSACTIONS_DAYS = 30; export const DATE_ISO_TIME_SEPARATOR = 'T'; export const TIME_RANGES = [ { label: '1M', value: '1M', days: 30 }, { label: '6M', value: '6M', days: 180 }, { label: '1Y', value: '1Y', days: 365 }, { label: '10Y', value: '10Y', days: 3650 }, ]; // ============================================ // Validation // ============================================ export const REGEX_PATTERNS = { EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, PHONE: /^\+?[\d\s-()]+$/, USERNAME: /^[a-zA-Z0-9_-]{3,30}$/, PASSWORD: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$/, UUID: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, NUMERIC: /^\d+$/, DECIMAL: /^\d+(\.\d{1,2})?$/, ALPHA_ONLY: /^[a-zA-Z]+$/, ALPHANUMERIC: /^[a-zA-Z0-9]+$/, URL: /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/, }; export const VALIDATION_RULES = { MIN_USERNAME_LENGTH: 3, MAX_USERNAME_LENGTH: 30, MIN_PASSWORD_LENGTH: 8, MAX_PASSWORD_LENGTH: 128, MIN_NAME_LENGTH: 2, MAX_NAME_LENGTH: 50, MIN_PORTFOLIO_NAME_LENGTH: 3, MAX_PORTFOLIO_NAME_LENGTH: 100, MIN_PORTFOLIO_DESCRIPTION_LENGTH: 0, MAX_PORTFOLIO_DESCRIPTION_LENGTH: 500, MIN_TRADE_AMOUNT: 0.01, MAX_TRADE_AMOUNT: 1000000, MIN_TRADE_QUANTITY: 0.001, MAX_TRADE_QUANTITY: 1000000, MIN_PRICE: 0.01, MAX_PRICE: 1000000, MIN_WITHDRAWAL_AMOUNT: 100, MAX_WITHDRAWAL_AMOUNT: 1000000, MAX_DESCRIPTION_LENGTH: 500, MAX_NOTES_LENGTH: 1000, MAX_FILE_SIZE_MB: 10, MAX_FILE_NAME_LENGTH: 255, MIN_ADDRESS_LENGTH: 10, MAX_ADDRESS_LENGTH: 200, MIN_POSTAL_CODE_LENGTH: 3, MAX_POSTAL_CODE_LENGTH: 10, }; export const VALIDATION_ERRORS = { REQUIRED: 'This field is required', INVALID_EMAIL: 'Please enter a valid email address', INVALID_PHONE: 'Please enter a valid phone number', INVALID_USERNAME: 'Username must be 3-30 characters, letters, numbers, underscores, and hyphens only', INVALID_PASSWORD: 'Password must be at least 8 characters with uppercase, lowercase, and numbers', MIN_LENGTH: (field, min) => `${field} must be at least ${min} characters`, MAX_LENGTH: (field, max) => `${field} must be no more than ${max} characters`, MIN_VALUE: (field, min) => `${field} must be at least ${min}`, MAX_VALUE: (field, max) => `${field} must be no more than ${max}`, INVALID_FORMAT: (field) => `${field} has an invalid format`, PASSWORDS_DONT_MATCH: 'Passwords do not match', }; // ============================================ // Specific Domain Validation // ============================================ export const PASSWORD_VALIDATION = { MIN_LENGTH: 8, }; export const EMAIL_CONFIRMATION_VALIDATION = { TOKEN_LENGTH: 6, // Exact length for numeric verification tokens TOKEN_MIN_LENGTH: 6, // Kept for backward compatibility TOKEN_MAX_LENGTH: 20, // Kept for backward compatibility }; export const USER_PROFILE_VALIDATION = { MIN_NAME_PARTS: 2, MIN_AGE: 13, MAX_AGE: 120, MIN_ADDRESS_LENGTH: 10, MIN_PHONE_LENGTH: 8, }; export const INVESTMENT_PREFERENCES_VALIDATION = { MIN_INVESTMENT_AMOUNT: 100, MAX_INVESTMENT_AMOUNT: 10000000, MIN_SOURCE_OF_FUNDS: 1, }; //# sourceMappingURL=utilities.js.map