@cranberry-money/shared-constants
Version:
Shared constants for Blueberry platform
235 lines • 8.64 kB
JavaScript
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