@alviere/core 0.15.0 → 0.15.2
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/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/infrastructure/logging/logger.service.ts","../src/entities/constants/environment.ts","../src/infrastructure/security/cryptor.service.ts","../src/infrastructure/security/validator.service.ts","../src/entities/errors/alcore-api.error.ts","../src/entities/constants/error-codes.ts","../src/infrastructure/gateways/alcore-base.gateway.ts","../src/entities/requests/utility.ts","../src/infrastructure/gateways/payments.gateway.ts","../src/infrastructure/gateways/wallets.gateway.ts","../src/infrastructure/gateways/payment-instruments.gateway.ts","../src/infrastructure/gateways/accounts.gateway.ts","../src/infrastructure/gateways/auth.gateway.ts","../src/services/wallets-api.service.ts","../src/services/payment-instruments-api.service.ts","../src/services/accounts-api.service.ts","../src/services/payment-processor.service.ts","../src/services/bank-info-api.service.ts","../src/services/legal-texts-api.service.ts","../src/infrastructure/gateways/bank-info.gateway.ts","../src/infrastructure/gateways/legal-texts.gateway.ts","../src/entities/requests/payments/payments.ts","../src/entities/requests/payments/payment-instruments.ts","../src/entities/requests/payments/bank-accounts.ts","../src/entities/requests/wallets/wallets.ts","../src/entities/requests/accounts/accounts.ts","../src/entities/requests/auth/auth.ts","../src/entities/requests/accounts/dossiers.ts","../src/entities/responses/dossiers/dossiers.ts","../src/plugins/field-plugin.interface.ts","../src/plugins/fields/card-number.plugin.ts","../src/plugins/field-plugin-registry.ts","../src/index.ts"],"sourcesContent":["import { LoggerInterface } from \"../../entities/interfaces/logger.interface\";\n\n/**\n * This is our Logger concrete class that implements\n * our LoggerInterface contract. This Logger is used\n * throughout our application to log information to\n * console, as long as `debug` is true\n */\nexport class Logger implements LoggerInterface {\n private isDebug: boolean;\n logger: string = 'CORE_LOGGER';\n /**\n * Logger constructor.\n *\n * @param isDebug This is what enables/disables our output messages\n */\n constructor(isDebug: boolean) {\n this.isDebug = isDebug;\n\n }\n\n /**\n * This is the method to output a debug message to console.\n *\n * @param msg The message to output to console\n */\n debug(msg: string) {\n if (this.isDebug) {\n if (typeof console.debug !== \"undefined\") {\n console.debug(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * This is the method to output a warning message to console.\n *\n * @param msg The message to output to console\n */\n warning(msg: string) {\n if (this.isDebug) {\n if (typeof console.warn !== \"undefined\") {\n console.warn(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * Alias for warning() for consistency with console API\n *\n * @param msg The message to output to console\n */\n warn(msg: string) {\n this.warning(msg);\n }\n\n /**\n * This is the method to output an info message to console.\n *\n * @param msg The message to output to console\n */\n info(msg: string) {\n if (this.isDebug) {\n if (typeof console.info !== \"undefined\") {\n console.info(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * This is the method to output an error message to console.\n *\n * @param msg The message to output to console\n */\n error(msg: string) {\n if (this.isDebug) {\n if (typeof console.error !== \"undefined\") {\n console.error(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * Check if debug mode is enabled\n */\n isDebugEnabled(): boolean {\n return this.isDebug;\n }\n}\n","// Runtime configuration interface - these values should be set when instantiating the core package\nexport interface AlviereConfig {\n domain: string;\n access_token: string;\n certificate: {\n id: string;\n public_key: string;\n };\n}\n\n// Default values (can be overridden)\nexport const DEFAULT_CONFIG: AlviereConfig = {\n domain: 'https://api.dev.alviere.com',\n access_token: '',\n certificate: {\n id: '',\n public_key: '',\n },\n};\n\n// Runtime configuration storage\nlet runtimeConfig: AlviereConfig = { ...DEFAULT_CONFIG };\n\n/**\n * Set runtime configuration for the Alviere core package\n * This should be called before using any core services\n */\nexport function setRuntimeConfig(config: Partial<AlviereConfig>): void {\n runtimeConfig = { ...runtimeConfig, ...config };\n}\n\n/**\n * Get current runtime configuration\n */\nexport function getRuntimeConfig(): AlviereConfig {\n return runtimeConfig;\n}\n\n/**\n * Get environment variable value (for development environments)\n */\nfunction getEnvVar(key: string): string | undefined {\n if (typeof window !== 'undefined' && (window as any).VITE_DEBUG) {\n // In browser environment, try to get from VITE_ prefixed variables\n const viteKey = `VITE_${key}`;\n return (window as any)[viteKey];\n }\n return undefined;\n}\n\n/**\n * Initialize configuration from environment variables (development only)\n */\nexport function initializeFromEnvironment(): void {\n // Only initialize if we haven't set runtime config yet\n if (runtimeConfig.domain && runtimeConfig.certificate) {\n return; // Already configured\n }\n\n const envConfig: Partial<AlviereConfig> = {};\n\n // Try to get values from environment variables\n const envDomain = getEnvVar('ALVIERE_DOMAIN');\n const envCertificate = getEnvVar('CERTIFICATE');\n\n if (envDomain) envConfig.domain = envDomain;\n if (envCertificate) {\n try {\n const cert = JSON.parse(envCertificate);\n if (cert && typeof cert.id === 'string' && typeof cert.public_key === 'string') {\n envConfig.certificate = { id: cert.id, public_key: cert.public_key };\n }\n } catch {\n // If parsing fails, ignore and do not set certificate\n }\n }\n\n // Only set if we have meaningful values\n if (envConfig.domain || envConfig.certificate) {\n setRuntimeConfig(envConfig);\n }\n}\n\n// Export individual config getters for backward compatibility\nexport const getALVIERE_DOMAIN = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.domain) {\n initializeFromEnvironment();\n }\n return runtimeConfig.domain;\n};\n\nexport const getRSA_PUB_KEY = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.certificate) {\n initializeFromEnvironment();\n }\n // Clean the RSA key: remove both literal '\\n' strings and actual newline characters\n // The key might come from JSON/env vars as literal '\\n' (backslash + n), not actual newlines\n return runtimeConfig.certificate.public_key\n .replace(/\\\\n/g, '') // Replace literal '\\n' strings (escaped backslash + n in regex)\n .replace(/\\r\\n/g, '') // Replace Windows line endings\n .replace(/\\n/g, '') // Replace actual newline characters\n .replace(/\\r/g, '') // Replace carriage returns\n .trim();\n};\n\nexport const getCERTIFICATE_ID = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.certificate) {\n initializeFromEnvironment();\n }\n return runtimeConfig.certificate.id;\n};\n\n// export const getFRAUD_PROVIDER_KEY = () => {\n// // Auto-initialize from environment if not configured\n// if (!runtimeConfig.fraudProviderKey) {\n// initializeFromEnvironment();\n// }\n// return runtimeConfig.fraudProviderKey;\n// };\n\n// Legacy exports for backward compatibility (deprecated)\nexport const ALVIERE_DOMAIN = getALVIERE_DOMAIN();\nexport const RSA_PUB_KEY = getRSA_PUB_KEY();\nexport const CERTIFICATE_ID = getCERTIFICATE_ID();\n// export const FRAUD_PROVIDER_KEY = getFRAUD_PROVIDER_KEY();\n\n// Note: AUTH_TOKEN, ACCOUNT_UUID, and SESSION_ID are now extracted from JWT\n// and should not be stored as global constants\n","import { pki } from 'node-forge';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { getRSA_PUB_KEY, getCERTIFICATE_ID } from '../../entities/constants/environment';\nimport { EncryptedRequest } from '../../entities/requests/_alcore';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\n\n/**\n *\n */\nexport class Cryptor implements CryptorInterface {\n /**\n *\n */\n private rsa_key: string;\n\n /**\n *\n */\n private key: Uint8Array;\n\n /**\n *\n */\n private nonce: Uint8Array;\n\n /**\n *\n */\n private logger?: LoggerInterface;\n\n /**\n *\n */\n constructor(logger?: LoggerInterface) {\n this.logger = logger;\n this.rsa_key = getRSA_PUB_KEY();\n this.key = this.generate_key();\n this.nonce = this.generate_nonce();\n this.logger?.debug('🔐 Cryptor initialized');\n }\n\n /**\n *\n * @param data\n * @returns\n */\n async encrypt(data: object): Promise<EncryptedRequest> {\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const alg = { name: 'AES-GCM', iv: this.nonce };\n const crypto_key = await this.import_key();\n const cipher = await crypto.subtle.encrypt(alg, crypto_key, encoded);\n const cipherStr = this.bufferToStr(cipher);\n const cipherB64 = btoa(cipherStr);\n\n const keyStr = this.bufferToStr(this.key);\n const keyB64 = btoa(keyStr);\n const nonceStr = this.bufferToStr(this.nonce);\n const nonceB64 = btoa(nonceStr);\n this.logger?.debug(`🔐 RSA_KEY: ${this.rsa_key.substring(0, 50)}...`);\n const publicKey = pki.publicKeyFromPem(this.rsa_key);\n const keyNonceCipher = publicKey.encrypt(keyB64 + '::' + nonceB64);\n const keyNonceB64 = btoa(keyNonceCipher);\n\n const encrypted_request = {\n p: cipherB64, // base64(AES-GCM(<sdk_envelope>))\n k: keyNonceB64, // base64(RSA(base64(SDK_KEY)::base64(<sdk_nonce>)))\n i: getCERTIFICATE_ID(), // certificate id - configurable via environment variable\n };\n this.logger?.debug(\n `🔐 ENCRYPTED_REQUEST: p=${encrypted_request.p.substring(0, 20)}..., i=${encrypted_request.i}`\n );\n return encrypted_request;\n }\n\n /**\n *\n * @param data\n * @returns\n */\n async decrypt(data: EncryptedResponse): Promise<object> {\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: this.nonce },\n await this.import_key(),\n Uint8Array.from(atob(data.p), c => c.charCodeAt(0))\n );\n const decryptedText = new TextDecoder().decode(decrypted);\n this.logger?.debug(`🔐 DECRYPTED: ${decryptedText}`);\n return JSON.parse(decryptedText);\n }\n\n /**\n *\n * @returns\n */\n private generate_key(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(32));\n }\n\n /**\n *\n * @returns\n */\n private generate_nonce(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(12));\n }\n\n /**\n *\n * @returns\n */\n private async import_key(): Promise<CryptoKey> {\n return await crypto.subtle.importKey('raw', this.key, { name: 'AES-GCM' }, true, [\n 'encrypt',\n 'decrypt',\n ]);\n }\n\n /**\n *\n * @param data\n * @returns\n */\n private async rsa_encrypt(data: string): Promise<string> {\n this.logger?.debug(`🔐 RSA_ENCRYPT: Data to encrypt: ${data.substring(0, 50)}...`);\n this.logger?.debug(`🔐 RSA_KEY: ${this.rsa_key.substring(0, 50)}...`);\n const publicKey = pki.publicKeyFromPem(this.rsa_key);\n return btoa(publicKey.encrypt(data));\n }\n /**\n *\n * @param buf\n */\n private bufferToStr(buf: ArrayBuffer): string {\n const cb = Array.from(new Uint8Array(buf));\n const cs = cb.map(byte => String.fromCharCode(byte)).join('');\n\n return cs;\n }\n}\n","import { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { ValidatorInterface } from '../../entities/interfaces/validator.interface';\n\n/**\n *\n */\nexport class Validator implements ValidatorInterface {\n private logger: LoggerInterface;\n\n /**\n *\n * @param logger\n */\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n /**\n *\n * @param name\n */\n credit_card_name(name: string): string | null {\n this.logger.debug(`🔐 CREDIT_CARD_NAME: ${name}`);\n\n // Add null/undefined check\n if (!name || typeof name !== 'string') {\n return 'Card holder name cannot be empty.';\n }\n\n if (name.trim().length === 0) {\n return 'Card holder name cannot be empty.';\n }\n\n return null;\n }\n\n /**\n *\n * @param number\n */\n credit_card_number(number: string): string | null {\n // Add null/undefined check\n\n if (!number || typeof number !== 'string') {\n return 'Please enter a valid card number.';\n }\n\n // Credit Card Number RegEx\n const visaRegEx = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/;\n const mastercardRegEx = /^(?:5[1-5][0-9]{14})$/;\n const amexpRegEx = /^(?:3[47][0-9]{13})$/;\n const discovRegEx = /^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/;\n\n if (visaRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (mastercardRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (amexpRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (discovRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n }\n this.logger.debug('🔐 card number is not a recognized brand');\n return 'Please enter a valid card number.';\n }\n\n /**\n *\n * @param expiry\n */\n credit_card_expiry_date(expiry: string): string | null {\n // Add null/undefined check\n if (!expiry || typeof expiry !== 'string') {\n return 'Expiry date cannot be empty.';\n }\n\n if (expiry.trim().length === 0) {\n return 'Expiry date cannot be empty.';\n }\n\n const expiryRegEx = /^(0[1-9]|1[0-2])\\/?([0-9]{4}|[0-9]{2})$/;\n if (!expiryRegEx.test(expiry)) {\n return 'Please enter a valid expiry date.';\n }\n\n return null;\n }\n\n /**\n *\n * @param code\n */\n credit_card_sec_code(code: string): string | null {\n // Add null/undefined check\n if (!code || typeof code !== 'string') {\n return 'Security code cannot be empty.';\n }\n\n if (code.trim().length === 0) {\n return 'Security code cannot be empty.';\n }\n\n const secCodeRegEx = /^[0-9]{3,4}$/;\n if (!secCodeRegEx.test(code)) {\n return 'Please enter a valid security code.';\n }\n\n return null;\n }\n\n /**\n *\n * @param zip\n */\n credit_card_zip_code(zip: string): string | null {\n // Add null/undefined check\n if (!zip || typeof zip !== 'string') {\n return 'Zip code cannot be empty.';\n }\n\n if (zip.trim().length === 0) {\n return 'Zip code cannot be empty.';\n }\n\n return null;\n }\n\n /**\n *\n * @param pin\n */\n credit_card_pin(pin: string): string | null {\n // Add null/undefined check\n if (!pin || typeof pin !== 'string') {\n return 'PIN cannot be empty.';\n }\n\n if (pin.trim().length === 0) {\n return 'PIN cannot be empty.';\n }\n\n const pinRegEx = /^[0-9]{4}$/;\n if (!pinRegEx.test(pin)) {\n return 'Please enter a valid PIN.';\n }\n\n return null;\n }\n\n /**\n *\n * @param uuid\n */\n is_valid_uuid(uuid: string): string | null {\n // Add null/undefined check\n if (!uuid || typeof uuid !== 'string') {\n return 'UUID cannot be empty.';\n }\n\n if (uuid.trim().length === 0) {\n return 'UUID cannot be empty.';\n }\n\n const uuidRegEx = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n if (!uuidRegEx.test(uuid)) {\n return 'Please enter a valid UUID.';\n }\n\n return null;\n }\n\n /**\n * Validates that a field is not empty or null\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n required(value: string | null | undefined, fieldName?: string): string | null {\n if (\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim().length === 0)\n ) {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n return null;\n }\n\n /**\n * Validates email address format\n * @param email - The email to validate\n */\n email(email: string): string | null {\n if (!email || typeof email !== 'string') {\n return 'Please enter a valid email address.';\n }\n\n const trimmed = email.trim();\n\n // Check for consecutive dots\n if (trimmed.includes('..')) {\n return 'Please enter a valid email address.';\n }\n\n // RFC 5322 compliant email regex (simplified) - requires TLD\n const emailRegEx =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n\n if (!emailRegEx.test(trimmed)) {\n return 'Please enter a valid email address.';\n }\n\n return null;\n }\n\n /**\n * Validates phone number format\n * @param phone - The phone number to validate\n */\n phone(phone: string): string | null {\n if (!phone || typeof phone !== 'string') {\n return 'Please enter a valid phone number.';\n }\n\n // E.164 format: \"+\" followed by 2-15 digits, first digit cannot be 0\n const e164Regex = /^\\+[1-9]\\d{1,14}$/;\n return e164Regex.test(phone.trim()) ? null : 'Please enter a valid phone number.';\n }\n\n /**\n * Validates date format and calendar validity\n * @param date - The date string to validate\n * @param format - The expected date format (default: 'YYYY-MM-DD')\n */\n date(date: string, format: 'YYYY-MM-DD' = 'YYYY-MM-DD'): string | null {\n if (!date || typeof date !== 'string') {\n return 'Please enter a valid date.';\n }\n\n // Validate YYYY-MM-DD format\n const dateRegex = /^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/;\n if (!dateRegex.test(date)) {\n return 'Please enter a valid date in YYYY-MM-DD format';\n }\n\n // Extract year, month, and day for detailed validation\n const [, yearStr, monthStr, dayStr] = date.match(dateRegex) || [];\n const year = parseInt(yearStr);\n const month = parseInt(monthStr);\n const day = parseInt(dayStr);\n\n // Validate actual calendar date\n if (!this.isValidCalendarDate(year, month, day)) {\n return 'Invalid date - this date does not exist';\n }\n\n // Additional validation: check if date is reasonable (not in future, not too far in past)\n const dateObj = new Date(date);\n const now = new Date();\n const minDate = new Date('1900-01-01');\n\n if (dateObj > now) {\n return 'Date cannot be in the future';\n }\n\n if (dateObj < minDate) {\n return 'Date cannot be before 1900';\n }\n\n return null;\n }\n\n /**\n * Helper function to validate calendar dates\n * @param year - The year\n * @param month - The month (1-12)\n * @param day - The day (1-31)\n */\n private isValidCalendarDate(year: number, month: number, day: number): boolean {\n // Create a Date object and check if it's valid\n const date = new Date(year, month - 1, day); // month is 0-indexed in Date constructor\n\n // Check if the date is valid and matches the input values\n // This handles leap years, different month lengths, etc.\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n }\n\n /**\n * Validates minimum length\n * @param value - The value to validate\n * @param minLength - Minimum required length\n * @param fieldName - Optional field name for error message\n */\n min_length(value: string, minLength: number, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (value.length < minLength) {\n return fieldName\n ? `${fieldName} must be at least ${minLength} characters long.`\n : `Must be at least ${minLength} characters long.`;\n }\n\n return null;\n }\n\n /**\n * Validates maximum length\n * @param value - The value to validate\n * @param maxLength - Maximum allowed length\n * @param fieldName - Optional field name for error message\n */\n max_length(value: string, maxLength: number, fieldName?: string): string | null {\n if (value && typeof value === 'string' && value.length > maxLength) {\n return fieldName\n ? `${fieldName} must be no more than ${maxLength} characters long.`\n : `Must be no more than ${maxLength} characters long.`;\n }\n\n return null;\n }\n\n /**\n * Validates against a custom pattern\n * @param value - The value to validate\n * @param pattern - RegExp pattern to match\n * @param errorMessage - Custom error message\n */\n pattern(value: string, pattern: RegExp, errorMessage?: string): string | null {\n if (!value || typeof value !== 'string') {\n return errorMessage || 'Please enter a valid value.';\n }\n\n if (!pattern.test(value)) {\n return errorMessage || 'Please enter a valid value.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only numbers\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n numeric(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^\\d+$/.test(value.trim())) {\n return fieldName ? `${fieldName} must contain only numbers.` : 'Must contain only numbers.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only letters\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n alphabetic(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^[a-zA-Z\\s]+$/.test(value.trim())) {\n return fieldName\n ? `${fieldName} must contain only letters and spaces.`\n : 'Must contain only letters and spaces.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only letters and numbers\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n alphanumeric(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^[a-zA-Z0-9\\s]+$/.test(value.trim())) {\n return fieldName\n ? `${fieldName} must contain only letters, numbers, and spaces.`\n : 'Must contain only letters, numbers, and spaces.';\n }\n\n return null;\n }\n\n /**\n * Validates URL format\n * @param url - The URL to validate\n */\n url(url: string): string | null {\n if (!url || typeof url !== 'string') {\n return 'Please enter a valid URL.';\n }\n\n const trimmed = url.trim();\n\n try {\n const urlObj = new URL(trimmed);\n\n // Additional validation for malformed URLs that URL constructor allows\n if (\n urlObj.hostname === '' ||\n urlObj.hostname.startsWith('.') ||\n urlObj.hostname.endsWith('.')\n ) {\n return 'Please enter a valid URL.';\n }\n\n return null;\n } catch {\n return 'Please enter a valid URL.';\n }\n }\n\n /**\n * Validates postal code based on country\n * @param code - The postal code to validate\n * @param country - Country code (default: US)\n */\n postal_code(code: string, country: string = 'US'): string | null {\n if (!code || typeof code !== 'string') {\n return 'Please enter a valid postal code.';\n }\n\n const cleanCode = code.trim();\n\n switch (country.toUpperCase()) {\n case 'US':\n // US ZIP code: 12345 or 12345-6789\n if (!/^\\d{5}(-\\d{4})?$/.test(cleanCode)) {\n return 'Please enter a valid US ZIP code (e.g., 12345 or 12345-6789).';\n }\n break;\n case 'CA':\n // Canadian postal code: A1A 1A1\n if (!/^[A-Za-z]\\d[A-Za-z] \\d[A-Za-z]\\d$/.test(cleanCode)) {\n return 'Please enter a valid Canadian postal code (e.g., A1A 1A1).';\n }\n break;\n case 'UK':\n case 'GB':\n // UK postal code: SW1A 1AA\n if (!/^[A-Za-z]{1,2}\\d[A-Za-z\\d]?\\s\\d[A-Za-z]{2}$/.test(cleanCode)) {\n return 'Please enter a valid UK postal code (e.g., SW1A 1AA).';\n }\n break;\n default:\n // Generic validation for other countries (3-10 alphanumeric characters)\n if (!/^[A-Za-z0-9\\s-]{3,10}$/.test(cleanCode)) {\n return 'Please enter a valid postal code.';\n }\n }\n\n return null;\n }\n}\n","/**\n * AlcoreApiError - Custom error class for Alcore API errors\n * Preserves error_code and error_description as separate properties\n */\nexport class AlcoreApiError extends Error {\n public readonly errorCode: string;\n public readonly errorDescription: string;\n public readonly statusCode?: number;\n\n constructor(errorCode: string, errorDescription: string, statusCode?: number) {\n super(`Alcore API Error ${errorCode}: ${errorDescription}`);\n this.name = 'AlcoreApiError';\n this.errorCode = errorCode;\n this.errorDescription = errorDescription;\n this.statusCode = statusCode;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AlcoreApiError);\n }\n }\n\n /**\n * Check if error matches a specific error code\n */\n isErrorCode(code: string): boolean {\n return this.errorCode === code;\n }\n\n /**\n * Check if error matches any of the provided error codes\n */\n isAnyErrorCode(codes: string[]): boolean {\n return codes.includes(this.errorCode);\n }\n}\n\n","/**\n * Alcore API Error Codes\n * Centralized mapping of all known error codes from the backend API\n */\nexport const AlcoreErrorCodes = {\n ALVIERE_CORE_NOT_INITIALIZED: '000000',\n // Authentication errors (100xxx)\n UNPROCESSABLE_ENCRYPTED_DATA: '100011',\n WRONG_ENCRYPTED_ENDPOINT: '100012',\n UNDECRYPTABLE_DATA_AT_ENDPOINT: '100013',\n DECRYPTED_DATA_UNUSABLE_AT_ENDPOINT: '100014',\n WRONG_DECRYPTED_ENDPOINT: '100015',\n WRONG_VERSION_OR_ENDPOINT: '100016',\n OPERATION_HALTED: '100017',\n INVALID_REQUEST_PAYLOAD: '100300',\n INVALID_REQUEST_PAYLOAD_FIELD: '100301',\n INVALID_PATH_PARAMETER: '100302',\n INVALID_HEADER: '100303',\n INVALID_QUERY_PARAMETER: '100304',\n INVALID_JWT: '100305',\n AUTH_FAILED: '100306',\n SESSION_NOT_FOUND: '110000',\n PARENT_ACCOUNT_NOT_FOUND: '110001',\n NOT_FOUND: '110002',\n ACCOUNT_TYPE_NOT_SUPPORTED: '110004',\n UNDERLYING_API_ERROR: '115000',\n ACCOUNT_STATUS_NOT_ACTIVE: '115001',\n ACCOUNT_CHILD_FORBIDDEN: '320129',\n PARENT_ACCOUNT_NOT_ALLOWED: '320104',\n BANK_ACCOUNT_PRIMARY_REQUIRES_ACTIVE_STATUS: '340028',\n\n // Add more error codes as you discover them from the API\n} as const;\n\n/**\n * Error code type for type safety\n */\nexport type AlcoreErrorCode = (typeof AlcoreErrorCodes)[keyof typeof AlcoreErrorCodes];\n\n/**\n * Error code descriptions for user-friendly messages\n */\nexport const AlcoreErrorMessages: Record<string, string> = {\n [AlcoreErrorCodes.INVALID_JWT]: 'Invalid authentication token. Please log in again.',\n [AlcoreErrorCodes.AUTH_FAILED]:\n 'Authentication failed. Please check your credentials and try again.',\n [AlcoreErrorCodes.SESSION_NOT_FOUND]: 'Session not found. Please log in again.',\n [AlcoreErrorCodes.PARENT_ACCOUNT_NOT_FOUND]: 'Parent account not found.',\n [AlcoreErrorCodes.NOT_FOUND]: 'Resource not found.',\n [AlcoreErrorCodes.ACCOUNT_TYPE_NOT_SUPPORTED]: 'Account type not supported.',\n [AlcoreErrorCodes.INVALID_REQUEST_PAYLOAD]:\n 'Invalid request payload. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_REQUEST_PAYLOAD_FIELD]:\n 'Invalid request payload field. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_PATH_PARAMETER]:\n 'Invalid path parameter. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_HEADER]: 'Invalid header. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_QUERY_PARAMETER]:\n 'Invalid query parameter. Please check your request and try again.',\n [AlcoreErrorCodes.UNPROCESSABLE_ENCRYPTED_DATA]:\n 'Unprocessable encrypted data. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_ENCRYPTED_ENDPOINT]:\n 'Wrong encrypted endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.UNDECRYPTABLE_DATA_AT_ENDPOINT]:\n 'Undecryptable data at endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.DECRYPTED_DATA_UNUSABLE_AT_ENDPOINT]:\n 'Decrypted data unusable at endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_DECRYPTED_ENDPOINT]:\n 'Wrong decrypted endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_VERSION_OR_ENDPOINT]:\n 'Wrong version or endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.OPERATION_HALTED]: 'Operation halted. Please check your request and try again.',\n [AlcoreErrorCodes.UNDERLYING_API_ERROR]: 'Underlying API Error. ',\n [AlcoreErrorCodes.ACCOUNT_STATUS_NOT_ACTIVE]:\n 'Account status not active. Please check your request and try again.',\n [AlcoreErrorCodes.ACCOUNT_CHILD_FORBIDDEN]:\n \"Used Account can't be used to create a child account.\",\n [AlcoreErrorCodes.PARENT_ACCOUNT_NOT_ALLOWED]:\n 'Parent account not allowed. Please check your request and try again.',\n [AlcoreErrorCodes.BANK_ACCOUNT_PRIMARY_REQUIRES_ACTIVE_STATUS]:\n 'Only ACTIVE bank accounts can be set as primary.',\n};\n\n/**\n * Get user-friendly error message for an error code\n */\nexport function getErrorMessage(errorCode: string): string {\n return AlcoreErrorMessages[errorCode] || 'An unexpected error occurred. Please try again.';\n}\n\n/**\n * Critical error codes that should halt the entire flow/process\n * These errors cannot be recovered from and require user intervention\n */\nexport const CriticalErrorCodes = [\n AlcoreErrorCodes.INVALID_JWT,\n AlcoreErrorCodes.AUTH_FAILED,\n AlcoreErrorCodes.SESSION_NOT_FOUND,\n AlcoreErrorCodes.UNPROCESSABLE_ENCRYPTED_DATA,\n AlcoreErrorCodes.WRONG_ENCRYPTED_ENDPOINT,\n AlcoreErrorCodes.UNDECRYPTABLE_DATA_AT_ENDPOINT,\n AlcoreErrorCodes.OPERATION_HALTED,\n AlcoreErrorCodes.ALVIERE_CORE_NOT_INITIALIZED,\n AlcoreErrorCodes.UNDERLYING_API_ERROR,\n AlcoreErrorCodes.ACCOUNT_STATUS_NOT_ACTIVE,\n AlcoreErrorCodes.ACCOUNT_CHILD_FORBIDDEN,\n AlcoreErrorCodes.PARENT_ACCOUNT_NOT_ALLOWED,\n] as const;\n\n/**\n * Check if an error code is critical (requires flow halt)\n */\nexport function isCriticalError(errorCode: string): boolean {\n return CriticalErrorCodes.includes(errorCode as any);\n}\n","import { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { getALVIERE_DOMAIN } from '../../entities/constants/environment';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { AlcoreApiError } from '../../entities/errors/alcore-api.error';\nimport { AlcoreErrorCodes, getErrorMessage } from '@/entities/constants/error-codes';\n\ntype AlcoreRequest = {\n method: string;\n endpoint: string;\n payload: string;\n};\n\n/**\n *\n */\nexport abstract class AlcoreBase {\n /**\n *\n */\n private readonly jwt: string;\n\n /**\n *\n */\n private cryptor: CryptorInterface;\n\n /**\n *\n */\n private domain: string;\n\n /**\n *\n */\n private endpoint = '/alcore';\n\n /**\n *\n */\n protected logger: LoggerInterface;\n\n /**\n *\n * @param jwt\n * @param cryptor\n * @param logger\n */\n protected constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n this.jwt = jwt;\n this.cryptor = cryptor;\n this.domain = getALVIERE_DOMAIN();\n this.logger = logger;\n this.logger.debug(`🔐 AlcoreBase initialized with domain: ${this.domain}`);\n }\n\n /**\n * send\n */\n protected async send(method: string, endpoint: string, payload: object): Promise<Response> {\n const request: AlcoreRequest = {\n method: method,\n endpoint: endpoint,\n payload: JSON.stringify(payload),\n };\n this.logger.debug('🌐 AlcoreBase: Preparing to send request');\n this.logger.debug('🌐 Method: ' + method);\n this.logger.debug('🌐 Endpoint: ' + endpoint);\n this.logger.debug('🌐 Domain: ' + (this.domain || 'undefined'));\n this.logger.debug('🌐 JWT Token: ' + (this.jwt ? '✅ Present' : '❌ Missing'));\n this.logger.debug('🌐 Payload size: ' + JSON.stringify(payload).length + ' chars');\n this.logger.debug(this.jwt);\n\n this.logger.debug('DATA TO SEND before encrypt');\n this.logger.debug(payload as any);\n\n let encryptedData;\n try {\n encryptedData = await this.cryptor.encrypt(request);\n this.logger.debug('🔐 Encryption successful');\n } catch (encryptError) {\n this.logger.debug(\n '❌ Encryption failed: ' +\n (encryptError instanceof Error ? encryptError.message : 'Unknown error')\n );\n throw encryptError;\n }\n\n this.logger.debug('BASE GATEWAY: posting to ' + this.endpoint);\n this.logger.debug(encryptedData as any);\n\n const url = this.domain + this.endpoint;\n this.logger.debug('🌐 Full URL: ' + url);\n\n try {\n const response = await fetch(url, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + this.jwt,\n Version: '2021-11-18',\n },\n body: JSON.stringify(encryptedData),\n });\n\n this.logger.debug(\n '🌐 Response received - Status: ' + response.status + ' ' + response.statusText\n );\n this.logger.debug('🌐 Response OK: ' + response.ok);\n if (!response.ok) {\n let error = await response.json();\n if (error.p) {\n error = await this.decrypt(error);\n }\n const errorCode =\n response.status === 500 ? AlcoreErrorCodes.UNDERLYING_API_ERROR : error.error_code;\n const errorDescription = error.error_description || getErrorMessage(errorCode);\n\n this.logger.debug(`❌ API Error - Code: ${errorCode}, Description: ${errorDescription}`);\n\n throw new AlcoreApiError(errorCode, errorDescription, response.status);\n }\n return response;\n } catch (fetchError) {\n this.logger.debug(\n '❌ Fetch failed: ' + (fetchError instanceof Error ? fetchError.message : 'Unknown error')\n );\n throw fetchError;\n }\n }\n\n /**\n *\n * @param data\n */\n protected async decrypt(data: EncryptedResponse): Promise<object> {\n return this.cryptor.decrypt(data);\n }\n}\n","/**\n * Removes key/value pairs that are empty string, null or undefined.\n *\n * Note: It's not recursive! It only works on the 1st level of depth.\n *\n * @param data\n * @returns object without null/undefined/empty string values\n */\nexport function getSanitizedBody<T>(data: T) {\n const body = {} as T;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key] as any;\n\n if (!['', null, undefined].includes(value)) {\n body[key] = value;\n }\n }\n }\n\n return body;\n}\n\n/**\n * Throws an Error if the decrypted API response contains error_code or error_description.\n * Returns the response unchanged if no error is present.\n */\nexport function throwIfApiError<T extends object>(decrypted: T): T {\n if (\n decrypted &&\n typeof decrypted === 'object' &&\n ('error_code' in decrypted || 'error_description' in decrypted)\n ) {\n const errorMessage = (decrypted as any).error_description || 'Unknown API error';\n const errorCode = (decrypted as any).error_code || 'UNKNOWN';\n throw new Error(`${errorCode}: ${errorMessage}`);\n }\n return decrypted;\n}\n\n/**\n * JWT utility functions for extracting configuration from JWT tokens\n */\n\nexport interface JWTPayload {\n // Standard JWT claims\n iss?: string; // issuer\n sub?: string; // subject - Account UUID from Sierra API v3\n aud?: string | string[]; // audience - can be string or array\n exp?: number; // expiration time\n iat?: number; // issued at\n\n // Sierra API v3 custom claims\n api_domain?: string; // Alviere API domain\n scope?: string; // token scope\n roles?: {\n account?: string[];\n application?: string[];\n realm?: string[];\n };\n\n // Any other custom claims\n [key: string]: any;\n}\n\n/**\n * Decode JWT payload without verification (for configuration extraction)\n * Note: This is safe for configuration extraction, not for authentication\n */\nexport function decodeJWTPayload(jwt: string): JWTPayload | null {\n try {\n // Split JWT into parts\n const parts = jwt.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode payload (second part)\n const payload = parts[1];\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n\n return JSON.parse(decoded);\n } catch (error) {\n console.warn('Failed to decode JWT payload:', error);\n return null;\n }\n}\n\n/**\n * Extract Alviere configuration from JWT token (Sierra API v3)\n * Extracts api_domain from JWT payload\n */\nexport function extractAlviereConfigFromJWT(jwt: string): Partial<{\n domain: string;\n}> {\n const payload = decodeJWTPayload(jwt);\n if (!payload) {\n return {};\n }\n\n return {\n domain: payload.api_domain || 'https://api.dev.alviere.com',\n };\n}\n\n/**\n * Extract account_uuid from JWT's sub field (Sierra API v3)\n * The 'sub' field contains the authenticated account UUID\n *\n * @param jwt - The JWT token string\n * @returns The account UUID from the sub field, or null if not available\n */\nexport function extractAccountUuidFromJWT(jwt: string): string | null {\n const payload = decodeJWTPayload(jwt);\n if (!payload) {\n return null;\n }\n\n return payload.sub || null;\n}\n\n/**\n * Check if JWT is expired\n */\nexport function isJWTExpired(jwt: string): boolean {\n const payload = decodeJWTPayload(jwt);\n if (!payload || !payload.exp) {\n return true; // Consider expired if no expiration time\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n}\n\n/**\n * Get JWT expiration time as Date object\n */\nexport function getJWTExpiration(jwt: string): Date | null {\n const payload = decodeJWTPayload(jwt);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n","import { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { AddCardRequest } from '../../entities/requests/payments/payments';\nimport { AddCardResponse } from '../../entities/responses/payments/add_card';\nimport {\n AddBankAccountRequest,\n UpdateBankAccountRequest,\n} from '../../entities/requests/payments/bank-accounts';\nimport {\n AddBankAccountResponse,\n GetBankAccountsResponse,\n} from '../../entities/responses/payments/bank_accounts';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { PaymentsGatewayInterface } from '../../entities/interfaces/gateways/payments.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\n/**\n *\n */\nexport class PaymentsGateway extends AlcoreBase implements PaymentsGatewayInterface {\n /**\n *\n * @param jwt\n * @param cryptor\n */\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async add_card(accountUuid: string, data: AddCardRequest): Promise<AddCardResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/cards`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddCardResponse;\n }\n\n async add_bank_account(\n accountUuid: string,\n data: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddBankAccountResponse;\n }\n\n async get_bank_accounts(accountUuid: string): Promise<GetBankAccountsResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as GetBankAccountsResponse;\n }\n\n async delete_bank_account(accountUuid: string, uuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts/${uuid}`;\n const response = await this.send('DELETE', endpoint, {});\n return throwIfApiError(response) as unknown as void;\n }\n\n async update_bank_account(\n accountUuid: string,\n uuid: string,\n data: UpdateBankAccountRequest\n ): Promise<GetBankAccountsResponse> {\n const endpoint = `/payment-methods/bank-accounts/${uuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as GetBankAccountsResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport {\n WalletsGatewayInterface,\n WalletListParams,\n} from '../../entities/interfaces/gateways/wallets.interface';\nimport {\n WalletListResponse,\n WalletResponse,\n WalletTransactionResponse,\n WalletStatementResponse,\n} from '../../entities/responses/wallets/wallets';\nimport {\n LoadFundsRequest,\n WithdrawFundsRequest,\n SendFundsRequest,\n TransferFundsRequest,\n CreditFundsRequest,\n PromoFundsRequest,\n} from '../../entities/requests/wallets/wallets';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class WalletsGateway extends AlcoreBase implements WalletsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async listWallets(accountUuid: string, params?: WalletListParams): Promise<WalletListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/wallets${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as WalletListResponse;\n }\n\n // async getWallet(accountUuid: string, walletUuid: string): Promise<WalletResponse> {\n // throw new Error('getWallet not implemented');\n // }\n async loadFunds(walletUuid: string, data: LoadFundsRequest): Promise<WalletTransactionResponse> {\n const endpoint = `/wallets/${walletUuid}/load`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as WalletTransactionResponse;\n }\n // async withdrawFunds(walletUuid: string, data: WithdrawFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('withdrawFunds not implemented');\n // }\n // async sendFunds(walletUuid: string, data: SendFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('sendFunds not implemented');\n // }\n // async transferFunds(walletUuid: string, data: TransferFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('transferFunds not implemented');\n // }\n // async creditFunds(walletUuid: string, data: CreditFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('creditFunds not implemented');\n // }\n // async creditPromoFunds(walletUuid: string, data: PromoFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('creditPromoFunds not implemented');\n // }\n // async getWalletStatement(walletUuid: string, monthYear: string, scope?: 'DEBITS' | 'CREDITS' | 'FEES' | 'ALL'): Promise<WalletStatementResponse> {\n // throw new Error('getWalletStatement not implemented');\n // }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport { PaymentInstrumentsGatewayInterface, CardListParams } from '../../entities/interfaces/gateways/payment-instruments.interface';\nimport { PaymentInstrumentRequest, DebitFundsRequest } from '../../entities/requests/payments/payment-instruments';\nimport { PaymentInstrumentResponse, DebitFundsResponse, CardListResponse } from '../../entities/responses/payments/payment-instruments';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class PaymentInstrumentsGateway extends AlcoreBase implements PaymentInstrumentsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async createPaymentInstrument(data: PaymentInstrumentRequest): Promise<PaymentInstrumentResponse> {\n const endpoint = '/payments/payment-instruments';\n const response = await this.send('POST', endpoint, data);\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as PaymentInstrumentResponse;\n }\n\n async getPaymentInstrument(paymentInstrumentUuid: string): Promise<PaymentInstrumentResponse> {\n const endpoint = `/payments/payment-instruments/${paymentInstrumentUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as PaymentInstrumentResponse;\n }\n\n async deletePaymentInstrument(paymentInstrumentUuid: string): Promise<void> {\n const endpoint = `/payments/payment-instruments/${paymentInstrumentUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async debitFunds(data: DebitFundsRequest): Promise<DebitFundsResponse> {\n const endpoint = '/payments/debit';\n const response = await this.send('POST', endpoint, data);\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DebitFundsResponse;\n }\n\n async listCards(accountUuid: string, params?: CardListParams): Promise<CardListResponse> {\n const query = params\n ? '?' + new URLSearchParams(Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][])\n : '';\n const endpoint = `/accounts/${accountUuid}/payment-methods/cards${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as CardListResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport {\n AccountsGatewayInterface,\n AccountListParams,\n AddressListParams,\n DossierListParams,\n OnboardingAction,\n} from '../../entities/interfaces/gateways/accounts.interface';\nimport {\n AccountRequest,\n AccountUpdateRequest,\n AddressRequest,\n AddressUpdateRequest,\n} from '../../entities/requests/accounts/accounts';\nimport {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from '../../entities/requests/accounts/dossiers';\nimport {\n AccountResponse,\n AccountListResponse,\n AddressResponse,\n AddressListResponse,\n} from '../../entities/responses/accounts/accounts';\nimport { DossierResponse, DossierListResponse } from '../../entities/responses/dossiers/dossiers';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class AccountsGateway extends AlcoreBase implements AccountsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 AccountsGateway initialized');\n }\n\n async createAccount(data: AccountRequest): Promise<AccountResponse> {\n const endpoint = '/accounts';\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async getAccount(accountUuid: string): Promise<AccountResponse> {\n const endpoint = `/accounts/${accountUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async updateAccount(accountUuid: string, data: AccountUpdateRequest): Promise<AccountResponse> {\n const endpoint = `/accounts/${accountUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async deleteAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async listAccounts(params?: AccountListParams): Promise<AccountListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountListResponse;\n }\n\n async activateAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/activate`;\n await this.send('POST', endpoint, {});\n }\n\n async deactivateAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/deactivate`;\n await this.send('POST', endpoint, {});\n }\n\n async manageOnboarding(accountUuid: string, action: OnboardingAction): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/onboarding`;\n await this.send('PUT', endpoint, { action });\n }\n\n async createAddress(accountUuid: string, data: AddressRequest): Promise<AddressResponse> {\n const endpoint = `/accounts/${accountUuid}/addresses`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressResponse;\n }\n\n async getAddresses(\n accountUuid: string,\n params?: AddressListParams\n ): Promise<AddressListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/addresses${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressListResponse;\n }\n\n async updateAddress(\n accountUuid: string,\n addressUuid: string,\n data: AddressUpdateRequest\n ): Promise<AddressResponse> {\n const endpoint = `/accounts/${accountUuid}/addresses/${addressUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressResponse;\n }\n\n async deleteAddress(accountUuid: string, addressUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/addresses/${addressUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async createDossier(accountUuid: string, data: DossierRequest): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async getDossiers(accountUuid: string, params?: DossierListParams): Promise<DossierListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/dossiers${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierListResponse;\n }\n\n async getDossier(accountUuid: string, dossierUuid: string): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async updateDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierUpdateRequest\n ): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('PUT', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async replaceDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierReplaceRequest\n ): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async deleteDossier(accountUuid: string, dossierUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n}\n","import { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { GenerateScopedTokenRequest } from '../../entities/requests/auth/auth';\nimport { ScopedTokenResponse } from '../../entities/responses/auth/auth';\n\n/**\n * Auth Gateway - Handles authentication operations\n * Extends AlcoreBase to follow the same pattern as other gateways\n */\nexport class AuthGateway extends AlcoreBase {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug(`🔐 AuthGateway initialized`);\n }\n\n /**\n * Generate scoped JWT for specific account (JWT downgrade)\n * Exchanges business-level JWT for consumer-level JWT\n * Uses AlcoreBase.send() to follow the same pattern as all other gateways:\n * - Endpoint passed in encrypted payload\n * - Request sent to /alcore (not /alcore/v3/auth)\n * - Middleware handles routing\n *\n * @param data - Request containing account_uuid to scope to\n * @returns New scoped JWT token\n */\n async generateScopedToken(data: GenerateScopedTokenRequest): Promise<ScopedTokenResponse> {\n this.logger.debug('🔐 AuthGateway: Generating scoped token');\n this.logger.debug('🌐 Endpoint: /v3/auth');\n this.logger.debug('🌐 Account UUID: ' + data.account_uuid);\n\n // Use inherited send() method from AlcoreBase\n // This encrypts the payload and sends to /alcore with endpoint in the payload\n const response = await this.send('POST', '/v3/auth', data);\n\n // Decrypt the response\n const decryptedResponse = await this.decrypt(await response.json());\n\n this.logger.debug('✅ Scoped token generated successfully');\n\n return decryptedResponse as ScopedTokenResponse;\n }\n}\n\n","import { LoadFundsRequest } from '@/entities/requests/wallets/wallets';\nimport { WalletsGatewayInterface, WalletListParams } from '../entities/interfaces/gateways/wallets.interface';\nimport { WalletListResponse, WalletTransactionResponse } from '../entities/responses/wallets/wallets';\n\nexport class WalletsApiService {\n constructor(private gateway: WalletsGatewayInterface) {}\n\n async listWallets(accountUuid: string, params?: WalletListParams): Promise<WalletListResponse> {\n return this.gateway.listWallets(accountUuid, params);\n }\n async loadFunds(walletUuid: string, params: LoadFundsRequest): Promise<WalletTransactionResponse> {\n return this.gateway.loadFunds(walletUuid, params)\n }\n}\n","import { PaymentInstrumentsGatewayInterface, CardListParams } from '../entities/interfaces/gateways/payment-instruments.interface';\nimport { PaymentInstrumentRequest, DebitFundsRequest } from '../entities/requests/payments/payment-instruments';\nimport { PaymentInstrumentResponse, DebitFundsResponse, CardListResponse } from '../entities/responses/payments/payment-instruments';\n\nexport class PaymentInstrumentsApiService {\n constructor(private gateway: PaymentInstrumentsGatewayInterface) {}\n\n async createPaymentInstrument(data: PaymentInstrumentRequest): Promise<PaymentInstrumentResponse> {\n return this.gateway.createPaymentInstrument(data);\n }\n\n async getPaymentInstrument(paymentInstrumentUuid: string): Promise<PaymentInstrumentResponse> {\n return this.gateway.getPaymentInstrument(paymentInstrumentUuid);\n }\n\n async deletePaymentInstrument(paymentInstrumentUuid: string): Promise<void> {\n return this.gateway.deletePaymentInstrument(paymentInstrumentUuid);\n }\n\n async debitFunds(data: DebitFundsRequest): Promise<DebitFundsResponse> {\n return this.gateway.debitFunds(data);\n }\n\n async listCards(accountUuid: string, params?: CardListParams): Promise<CardListResponse> {\n return this.gateway.listCards(accountUuid, params);\n }\n}\n","import {\n AccountsGatewayInterface,\n AccountListParams,\n AddressListParams,\n DossierListParams,\n OnboardingAction,\n} from '../entities/interfaces/gateways/accounts.interface';\nimport {\n AccountRequest,\n AccountUpdateRequest,\n AddressRequest,\n AddressUpdateRequest,\n} from '../entities/requests/accounts/accounts';\nimport {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from '../entities/requests/accounts/dossiers';\nimport {\n AccountResponse,\n AccountListResponse,\n AddressResponse,\n AddressListResponse,\n} from '../entities/responses/accounts/accounts';\nimport { DossierResponse, DossierListResponse } from '../entities/responses/dossiers/dossiers';\n\nexport class AccountsApiService {\n constructor(private gateway: AccountsGatewayInterface) {}\n\n async createAccount(data: AccountRequest): Promise<AccountResponse> {\n return this.gateway.createAccount(data);\n }\n\n async getAccount(accountUuid: string): Promise<AccountResponse> {\n return this.gateway.getAccount(accountUuid);\n }\n\n async updateAccount(accountUuid: string, data: AccountUpdateRequest): Promise<AccountResponse> {\n return this.gateway.updateAccount(accountUuid, data);\n }\n\n async deleteAccount(accountUuid: string): Promise<void> {\n return this.gateway.deleteAccount(accountUuid);\n }\n\n async listAccounts(params?: AccountListParams): Promise<AccountListResponse> {\n return this.gateway.listAccounts(params);\n }\n\n async activateAccount(accountUuid: string): Promise<void> {\n return this.gateway.activateAccount(accountUuid);\n }\n\n async deactivateAccount(accountUuid: string): Promise<void> {\n return this.gateway.deactivateAccount(accountUuid);\n }\n\n async manageOnboarding(accountUuid: string, action: OnboardingAction): Promise<void> {\n return this.gateway.manageOnboarding(accountUuid, action);\n }\n\n async createAddress(accountUuid: string, data: AddressRequest): Promise<AddressResponse> {\n return this.gateway.createAddress(accountUuid, data);\n }\n\n async getAddresses(\n accountUuid: string,\n params?: AddressListParams\n ): Promise<AddressListResponse> {\n return this.gateway.getAddresses(accountUuid, params);\n }\n\n async updateAddress(\n accountUuid: string,\n addressUuid: string,\n data: AddressUpdateRequest\n ): Promise<AddressResponse> {\n return this.gateway.updateAddress(accountUuid, addressUuid, data);\n }\n\n async deleteAddress(accountUuid: string, addressUuid: string): Promise<void> {\n return this.gateway.deleteAddress(accountUuid, addressUuid);\n }\n\n async createDossier(accountUuid: string, data: DossierRequest): Promise<DossierResponse> {\n return this.gateway.createDossier(accountUuid, data);\n }\n\n async getDossiers(accountUuid: string, params?: DossierListParams): Promise<DossierListResponse> {\n return this.gateway.getDossiers(accountUuid, params);\n }\n\n async getDossier(accountUuid: string, dossierUuid: string): Promise<DossierResponse> {\n return this.gateway.getDossier(accountUuid, dossierUuid);\n }\n\n async updateDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierUpdateRequest\n ): Promise<DossierResponse> {\n return this.gateway.updateDossier(accountUuid, dossierUuid, data);\n }\n\n async replaceDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierReplaceRequest\n ): Promise<DossierResponse> {\n return this.gateway.replaceDossier(accountUuid, dossierUuid, data);\n }\n\n async deleteDossier(accountUuid: string, dossierUuid: string): Promise<void> {\n return this.gateway.deleteDossier(accountUuid, dossierUuid);\n }\n}\n","import type { PaymentsGatewayInterface } from '../entities/interfaces/gateways/payments.interface';\nimport type { LoggerInterface } from '../entities/interfaces/logger.interface';\nimport { AddCardRequest } from '../entities/requests/payments/payments';\nimport { AddCardResponse } from '../entities/responses/payments/add_card';\nimport {\n AddBankAccountRequest,\n UpdateBankAccountRequest,\n} from '../entities/requests/payments/bank-accounts';\nimport {\n AddBankAccountResponse,\n GetBankAccountsResponse,\n} from '../entities/responses/payments/bank_accounts';\nimport { stringify } from 'querystring';\n\n/**\n * PaymentProcessor handles the core payment processing logic.\n * It extracts payment processing logic that was previously embedded in the binder service\n * and makes it reusable for both iframe and headless modes.\n */\nexport class PaymentProcessor {\n constructor(\n private gateway: PaymentsGatewayInterface,\n private logger: LoggerInterface\n ) {}\n\n /**\n * Process an add card request through the gateway\n */\n async processAddCard(accountUuid: string, request: AddCardRequest): Promise<AddCardResponse> {\n this.logger.debug('PaymentProcessor: Starting add card processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n\n try {\n // Call the gateway to process the payment\n const result = await this.gateway.add_card(accountUuid, request);\n\n this.logger.debug('PaymentProcessor: Add card processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Add card processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n /**\n * Validate that a request has all required fields before processing\n */\n validateRequest(request: AddCardRequest): void {\n const requiredFields: (keyof AddCardRequest)[] = [\n 'external_id',\n 'pan',\n 'exp_year',\n 'exp_month',\n 'postal_code',\n 'security_code',\n ];\n\n for (const field of requiredFields) {\n if (!request[field]) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n\n this.logger.debug('PaymentProcessor: Request validation passed');\n }\n\n /**\n * Process payment with pre-validation\n */\n async processAddCardWithValidation(\n accountUuid: string,\n request: AddCardRequest\n ): Promise<AddCardResponse> {\n this.logger.debug('PaymentProcessor: Starting add card processing with validation');\n\n // Validate request first\n this.validateRequest(request);\n\n // Process the payment\n return await this.processAddCard(accountUuid, request);\n }\n\n /**\n * Process an add bank account request through the gateway\n */\n async processAddBankAccount(\n accountUuid: string,\n request: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n this.logger.debug('PaymentProcessor: Starting add bank account processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n\n try {\n // Call the gateway to process the bank account addition\n const result = await this.gateway.add_bank_account(accountUuid, request);\n\n this.logger.debug('PaymentProcessor: Add bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Add bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n /**\n * Validate that a bank account request has all required fields before processing\n */\n validateBankAccountRequest(request: AddBankAccountRequest): void {\n const requiredFields: (keyof AddBankAccountRequest)[] = [\n 'external_id',\n 'country',\n 'currency',\n 'bank_account_details',\n ];\n\n for (const field of requiredFields) {\n if (!request[field]) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n\n this.logger.debug('PaymentProcessor: Bank account request validation passed');\n }\n\n /**\n * Process bank account addition with pre-validation\n */\n async processAddBankAccountWithValidation(\n accountUuid: string,\n request: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n this.logger.debug('PaymentProcessor: Starting add bank account processing with validation');\n\n // Validate request first\n this.validateBankAccountRequest(request);\n\n // Process the bank account addition\n return await this.processAddBankAccount(accountUuid, request);\n }\n\n async processGetBankAccounts(accountUuid: string): Promise<GetBankAccountsResponse> {\n this.logger.debug('PaymentProcessor: Starting get bank accounts processing');\n try {\n const result = await this.gateway.get_bank_accounts(accountUuid);\n this.logger.debug('PaymentProcessor: Get bank accounts processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Get bank accounts processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n async processDeleteBankAccount(accountUuid: string, uuid: string): Promise<void> {\n this.logger.debug('PaymentProcessor: Starting delete bank account processing');\n try {\n const result = await this.gateway.delete_bank_account(accountUuid, uuid);\n this.logger.debug('PaymentProcessor: Delete bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Delete bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n async processUpdateBankAccount(\n accountUuid: string,\n uuid: string,\n request: UpdateBankAccountRequest\n ): Promise<GetBankAccountsResponse> {\n this.logger.debug('PaymentProcessor: Starting update bank account processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n try {\n const result = await this.gateway.update_bank_account(accountUuid, uuid, request);\n this.logger.debug('PaymentProcessor: Update bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Update bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n}\n","import { BankInfoResponse } from '../entities/responses/bank-info/bank-info';\nimport { BankInfoGatewayInterface } from '@/entities/interfaces/gateways/bank-info.interface';\n\nexport class BankInfoApiService {\n constructor(private gateway: BankInfoGatewayInterface) {}\n\n async getBankInfo(routingNumber: string): Promise<BankInfoResponse> {\n return this.gateway.getBankInfo(routingNumber);\n }\n}\n","import { LegalTextsResponse } from '../entities/responses/legal-texts/legal-texts';\nimport { LegalTextsGatewayInterface } from '@/entities/interfaces/gateways/legal-texts.interface';\n\nexport class LegalTextsApiService {\n constructor(private gateway: LegalTextsGatewayInterface) {}\n\n async getLegalTexts(type: string, version?: string): Promise<LegalTextsResponse> {\n return this.gateway.getLegalTexts(type, version);\n }\n}\n","import { BankInfoGatewayInterface } from '@/entities/interfaces/gateways/bank-info.interface';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { BankInfoResponse } from '@/entities/responses/bank-info/bank-info';\nimport { EncryptedResponse } from '@/entities/responses/alcore';\nimport { throwIfApiError } from '@/entities/requests/utility';\nimport { LoggerInterface } from '@/entities/interfaces/logger.interface';\nimport { CryptorInterface } from '@/entities/interfaces/cryptor.interface';\n\nexport class BankInfoGateway extends AlcoreBase implements BankInfoGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 BankInfoGateway initialized');\n }\n\n async getBankInfo(routingNumber: string): Promise<BankInfoResponse> {\n const endpoint = `/v3/bank-info?routing_number=${routingNumber}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as BankInfoResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport { LegalTextsGatewayInterface } from '@/entities/interfaces/gateways/legal-texts.interface';\nimport { LegalTextsResponse } from '@/entities/responses/legal-texts/legal-texts';\nimport { EncryptedResponse } from '@/entities/responses/alcore';\nimport { throwIfApiError } from '@/entities/requests/utility';\nimport { LoggerInterface } from '@/entities/interfaces/logger.interface';\nimport { CryptorInterface } from '@/entities/interfaces/cryptor.interface';\n\nexport class LegalTextsGateway extends AlcoreBase implements LegalTextsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 LegalTextsGateway initialized');\n }\n\n async getLegalTexts(type: string, version?: string): Promise<LegalTextsResponse> {\n const queryParams = new URLSearchParams({ type });\n if (version) {\n queryParams.set('version', version);\n }\n const endpoint = `/v3/legal-texts?${queryParams.toString()}`;\n this.logger.debug(`endpoint -> ${endpoint}`);\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as LegalTextsResponse;\n }\n}\n","import { getSanitizedBody } from '../utility';\n\n/**\n *\n */\nexport type AddCardRequest = {\n external_id: string;\n pan: string;\n exp_year: string;\n exp_month: string;\n postal_code: string;\n security_code: string;\n name_on_card?: string;\n};\n\ninterface NewAddCardRequestParams {\n external_id: string;\n name?: string;\n pan: string;\n expiry: string;\n code: string;\n zip: string;\n}\nexport function NewAddCardRequest(\n params: NewAddCardRequestParams,\n): AddCardRequest {\n const { external_id, name, pan, expiry, code, zip } = params;\n\n const expiryParts = expiry.split('/');\n const month = expiryParts[0];\n const year = expiryParts[1];\n\n let data: AddCardRequest = {\n external_id: external_id,\n pan: pan,\n exp_year: year,\n exp_month: month,\n security_code: code,\n postal_code: zip,\n name_on_card: name,\n };\n\n data = getSanitizedBody(data);\n\n return data;\n}\n","// Card instrument request structure\nexport interface CardInstrumentRequest {\n pan: string;\n exp_month: string;\n exp_year: string;\n security_code: string;\n name_on_card: string;\n phone_number?: string;\n email_address?: string;\n billing_address: {\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n };\n}\n\n// Payment instrument details union type\nexport interface PaymentInstrumentDetails {\n card: CardInstrumentRequest;\n}\n\n// Main payment instrument request\nexport interface PaymentInstrumentRequest {\n account_uuid: string;\n external_id?: string;\n payment_instrument_type: 'CARD';\n payment_instrument_details: PaymentInstrumentDetails;\n metadata?: string;\n}\n\n// Payment instrument for adhoc debit requests\nexport interface PaymentInstrumentAdhoc {\n payment_instrument_type: 'CARD';\n payment_instrument_details: PaymentInstrumentDetails;\n}\n\n// Merchant details for debit requests\nexport interface MerchantDetails {\n name: string; // required\n merchant_id: string; // required\n address?: {\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n };\n email_address?: string;\n phone_number?: string;\n url?: string;\n}\n\n// 3DS options for debit requests\nexport interface ThreeDSOptions {\n '3ds_preference'?: 'DISABLED' | 'ENABLED' | 'DOWNGRADE_ALLOWED';\n}\n\n// Debit funds request\nexport interface DebitFundsRequest {\n wallet_uuid: string;\n external_id: string;\n amount: number;\n currency: string;\n auth_type: 'AUTHCAP';\n payment_instrument_uuid?: string;\n payment_instrument?: PaymentInstrumentAdhoc;\n description?: string;\n merchant_details: MerchantDetails; // now required\n '3ds_options'?: ThreeDSOptions;\n metadata?: object;\n}\n\n// Factory functions for creating new requests\nexport function NewPaymentInstrumentRequest(\n accountUuid: string,\n paymentInstrumentType: 'CARD',\n cardDetails: CardInstrumentRequest,\n externalId?: string,\n metadata?: string\n): PaymentInstrumentRequest {\n return {\n account_uuid: accountUuid,\n external_id: externalId,\n payment_instrument_type: paymentInstrumentType,\n payment_instrument_details: {\n card: cardDetails\n },\n metadata\n };\n}\n\n// Helper function to create card details from form data\nexport function NewCardInstrumentFromForm(\n pan: string,\n expiry: string, // MM/YY format\n securityCode: string,\n nameOnCard: string,\n addressLine1: string,\n city: string,\n state: string,\n postal_code: string,\n country: string,\n addressLine2?: string,\n phoneNumber?: string,\n emailAddress?: string\n): CardInstrumentRequest {\n // Parse expiry date\n const expiryParts = expiry.split('/');\n const exp_month = expiryParts[0];\n const exp_year = expiryParts[1];\n\n return {\n pan: pan.replace(/\\s/g, ''), // Remove spaces\n exp_month,\n exp_year,\n security_code: securityCode,\n name_on_card: nameOnCard,\n phone_number: phoneNumber,\n email_address: emailAddress,\n billing_address: {\n line_1: addressLine1,\n line_2: addressLine2,\n city,\n state,\n postal_code,\n country\n }\n };\n}\n\nexport function NewDebitFundsRequest(\n walletUuid: string,\n externalId: string,\n amount: number,\n currency: string,\n merchantDetails: MerchantDetails,\n authType: 'AUTHCAP' = 'AUTHCAP',\n paymentInstrumentUuid?: string,\n paymentInstrument?: PaymentInstrumentAdhoc,\n description?: string,\n threeDSOptions?: ThreeDSOptions,\n metadata?: object\n): DebitFundsRequest {\n return {\n wallet_uuid: walletUuid,\n external_id: externalId,\n amount,\n currency,\n auth_type: authType,\n payment_instrument_uuid: paymentInstrumentUuid,\n payment_instrument: paymentInstrument,\n description,\n merchant_details: merchantDetails,\n '3ds_options': threeDSOptions,\n metadata\n };\n}\n\n// Helper function to create default merchant details for demos\nexport function createDefaultMerchantDetails(): MerchantDetails {\n return {\n name: \"Demo Merchant Store\",\n merchant_id: \"DEMO_MERCHANT_001\"\n };\n}\n","import { getSanitizedBody } from '../utility';\n\n// Bank account details interfaces\nexport type AchDetailsRequest = {\n routing_number: string;\n account_number: string;\n type?: 'CHECKING' | 'SAVINGS' | 'GENERAL_LEDGER' | 'LOAN';\n};\n\nexport type EftDetailsRequest = {\n institution_number: string;\n transit_number: string;\n account_number: string;\n};\n\nexport type SwiftDetailsRequest = {\n swift_code: string;\n account_number: string;\n};\n\nexport type ClabeDetailsRequest = {\n swift_code: string;\n account_number: string;\n};\n\nexport type IbanDetailsRequest = {\n iban: string;\n};\n\nexport type BankAccountDetailsRequest = {\n ach_details?: AchDetailsRequest;\n eft_details?: EftDetailsRequest;\n swift_details?: SwiftDetailsRequest;\n clabe_details?: ClabeDetailsRequest;\n iban_details?: IbanDetailsRequest;\n};\n\n/**\n * Bank account request interface\n */\nexport type AddBankAccountRequest = {\n external_id: string;\n country: string;\n currency: string;\n bank_account_details: BankAccountDetailsRequest;\n primary?: boolean;\n metadata?: object;\n};\n\nexport type UpdateBankAccountRequest = {\n external_id?: string;\n metadata?: object;\n primary?: boolean;\n};\n\ninterface NewAddBankAccountRequestParams {\n external_id: string;\n country: string;\n currency: string;\n bank_account_details: BankAccountDetailsRequest;\n primary?: boolean;\n metadata?: object;\n}\n\nexport function NewAddBankAccountRequest(\n params: NewAddBankAccountRequestParams\n): AddBankAccountRequest {\n const { external_id, country, currency, bank_account_details, primary, metadata } = params;\n\n let data: AddBankAccountRequest = {\n external_id,\n country,\n currency,\n bank_account_details,\n primary,\n metadata,\n };\n\n data = getSanitizedBody(data);\n\n return data;\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface ServiceFeeTransaction {\n utx_uuid: string;\n amount: number;\n currency: string;\n description: string;\n}\n\nexport interface TransactionOptions {\n payment_options?: {\n ACH_type?: 'SAME_DAY' | 'NEXT_DAY';\n prefund?: boolean;\n };\n}\n\nexport interface LoadFundsRequest {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}\n\nexport interface WithdrawFundsRequest {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}\n\nexport interface SendFundsRequest {\n destination_wallet_uuid: string;\n external_id: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface TransferFundsRequest {\n beneficiary_uuid: string;\n payout_method_uuid?: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n external_id: string;\n metadata?: Record<string, any>;\n}\n\nexport interface CreditFundsRequest {\n amount: number;\n currency: string;\n external_id: string;\n vault_name?: 'OPERATIONS';\n metadata?: Record<string, any>;\n}\n\nexport interface PromoFundsRequest {\n amount: number;\n external_id: string;\n description?: string;\n metadata?: Record<string, any>;\n}\n\n// Factory functions\nexport function NewLoadFundsRequest(params: {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}): LoadFundsRequest {\n const data: LoadFundsRequest = {\n payment_method_uuid: params.payment_method_uuid,\n amount: params.amount,\n external_id: params.external_id,\n service_fees: params.service_fees,\n transaction_options: params.transaction_options,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewWithdrawFundsRequest(params: {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}): WithdrawFundsRequest {\n const data: WithdrawFundsRequest = {\n payment_method_uuid: params.payment_method_uuid,\n amount: params.amount,\n external_id: params.external_id,\n service_fees: params.service_fees,\n transaction_options: params.transaction_options,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewSendFundsRequest(params: {\n destination_wallet_uuid: string;\n external_id: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n metadata?: Record<string, any>;\n}): SendFundsRequest {\n const data: SendFundsRequest = {\n destination_wallet_uuid: params.destination_wallet_uuid,\n external_id: params.external_id,\n amount: params.amount,\n service_fees: params.service_fees,\n description: params.description,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewTransferFundsRequest(params: {\n beneficiary_uuid: string;\n payout_method_uuid?: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n external_id: string;\n metadata?: Record<string, any>;\n}): TransferFundsRequest {\n const data: TransferFundsRequest = {\n beneficiary_uuid: params.beneficiary_uuid,\n payout_method_uuid: params.payout_method_uuid,\n amount: params.amount,\n service_fees: params.service_fees,\n description: params.description,\n external_id: params.external_id,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewCreditFundsRequest(params: {\n amount: number;\n currency: string;\n external_id: string;\n vault_name?: 'OPERATIONS';\n metadata?: Record<string, any>;\n}): CreditFundsRequest {\n const data: CreditFundsRequest = {\n amount: params.amount,\n currency: params.currency,\n external_id: params.external_id,\n vault_name: params.vault_name,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewPromoFundsRequest(params: {\n amount: number;\n external_id: string;\n description?: string;\n metadata?: Record<string, any>;\n}): PromoFundsRequest {\n const data: PromoFundsRequest = {\n amount: params.amount,\n external_id: params.external_id,\n description: params.description,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n","import { getSanitizedBody } from '../utility';\n\n// Employment status types\nexport type EmploymentStatus =\n | 'FULL_TIME'\n | 'PART_TIME'\n | 'SELF_EMPLOYED'\n | 'FREELANCER'\n | 'UNEMPLOYED'\n | 'STUDENT'\n | 'RETIRED';\n\n// Business types\nexport type BusinessType =\n | 'SOLE_PROPRIETORSHIP'\n | 'LLC'\n | 'LLP'\n | 'CORPORATION_C'\n | 'CORPORATION_S';\n\n// Account purpose types\nexport type AccountPurpose = 'GENERAL_USE' | 'PAYROLL' | 'TAXES' | 'MERCHANT_SERVICES' | 'OTHER';\n\n// Source of funds types\nexport type SourceOfFunds =\n | 'SERVICES_PRODUCTS'\n | 'ESTATE'\n | 'HOLDING_COMPANY'\n | 'INVESTMENTS'\n | 'LOANS'\n | 'PARNET_COMPANY'\n | 'SUBSIDIARY'\n | 'TRUST';\n\n// Profession types\nexport type Profession =\n | 'ACCOUNTANT'\n | 'ACTOR'\n | 'ADMINISTRATIVE_ASSISTANT'\n | 'ANALYST'\n | 'ARCHITECT'\n | 'ARTIST'\n | 'CARPENTER'\n | 'CASHIER'\n | 'CHILDCARE'\n | 'COOK'\n | 'CLEANER'\n | 'COACH'\n | 'CONSTRUCTION_WORKER'\n | 'CONSULTANT'\n | 'CONTENT_CREATOR'\n | 'COUNSELOR'\n | 'CUSTOMER_SERVICE'\n | 'DATA_ENTRY'\n | 'DESIGNER'\n | 'DENTIST'\n | 'DEVELOPER'\n | 'DIETITIAN'\n | 'DOCTOR'\n | 'DRIVER'\n | 'EDITOR'\n | 'ELECTRICIAN'\n | 'ENGINEER'\n | 'ESTHETICIAN'\n | 'EXECUTIVE'\n | 'EXECUTIVE_ASSISTANT'\n | 'FARMER'\n | 'FINANCIAL_ADVISOR'\n | 'FIREFIGHTER'\n | 'GRAPHIC_DESIGNER'\n | 'HAIRDRESSER'\n | 'HUMAN_RESOURCES'\n | 'IT_SUPPORT'\n | 'JANITOR'\n | 'JUDGE'\n | 'LAWYER'\n | 'LIBRARIAN'\n | 'MAINTENANCE_WORKER'\n | 'MANAGER'\n | 'MEDICAL_ASSISTANT'\n | 'MECHANIC'\n | 'MILITARY'\n | 'MUSICIAN'\n | 'NURSE'\n | 'PARALEGAL'\n | 'PARAMEDIC'\n | 'PHARMACIST'\n | 'PHOTOGRAPHER'\n | 'PHYSICAL_THERAPIST'\n | 'PILOT'\n | 'PLUMBER'\n | 'POLICE_OFFICER'\n | 'POLITICIAN'\n | 'PROJECT_MANAGER'\n | 'PSYCHOLOGIST'\n | 'RECEPTIONIST'\n | 'RESEARCHER'\n | 'RETAIL_ASSOCIATE'\n | 'SALES_REPRESENTATIVE'\n | 'SCIENTIST'\n | 'SECURITY_GUARD'\n | 'SOCIAL_WORKER'\n | 'TEACHER'\n | 'TECHNICIAN'\n | 'TRANSLATOR'\n | 'VETERINARIAN'\n | 'WAREHOUSE_WORKER'\n | 'WELDER'\n | 'WRITER';\n\n// Consumer Account Information\nexport interface ConsumerAccountInformation {\n first_name: string;\n middle_name?: string;\n last_name: string;\n date_of_birth?: string;\n ssn?: string;\n phone_number?: string;\n email_address: string;\n occupation?: {\n employment_status: EmploymentStatus;\n profession?: Profession;\n };\n}\n\n// Business Account Information\nexport interface BusinessAccountInformation {\n business_type: BusinessType;\n business_name: string;\n doing_business_as?: string;\n state_of_incorporation: string; // Min 2, Max 2\n country_of_incorporation: string; // Min 3, Max 3\n incorporation_date?: string;\n ein?: string;\n phone_number?: string;\n website?: string;\n email_address?: string;\n nature_of_business?: number;\n nature_of_business_details?: string;\n account_purpose?: AccountPurpose;\n account_purpose_details?: string;\n trading_volume?: string;\n transaction_volume?: string;\n source_of_funds?: SourceOfFunds;\n number_of_employees?: string;\n}\n\n// Stakeholder Account Information\nexport interface StakeholderAccountInformation {\n // Add stakeholder-specific fields as needed\n // This interface can be extended based on requirements\n}\n\n// Cardholder Account Information\nexport interface CardholderAccountInformation {\n // Add cardholder-specific fields as needed\n // This interface can be extended based on requirements\n}\n\n// Union type for account information based on account type\nexport type AccountInformation =\n | { consumer_information: ConsumerAccountInformation }\n | { business_information: BusinessAccountInformation }\n | { stakeholder_information: StakeholderAccountInformation }\n | { cardholder_information: CardholderAccountInformation };\n\nexport interface AddressRequest {\n label: string;\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n primary?: boolean;\n external_id?: string;\n}\n\nexport interface AccountRequest {\n external_id: string;\n account_type: 'CONSUMER' | 'BUSINESS' | 'STAKEHOLDER' | 'CARDHOLDER';\n profile?: string;\n information: AccountInformation;\n primary_address?: AddressRequest; // Required for CONSUMER accounts\n business_account_uuid?: string; // Required for STAKEHOLDER accounts\n parent_account_uuid?: string; // Parent (Merchant) Business UUID - Required for CONSUMER, BUSINESS, and CARDHOLDER accounts\n metadata?: Record<string, any>;\n}\n\nexport interface AccountUpdateRequest {\n profile?: string;\n information?: Partial<AccountInformation>;\n metadata?: Record<string, any>;\n external_id?: string;\n accepted_legal_texts?: string[];\n}\n\nexport interface AddressUpdateRequest {\n label?: string;\n line_1?: string;\n line_2?: string;\n city?: string;\n state?: string;\n postal_code?: string;\n country?: string;\n primary?: boolean;\n}\n\n// Factory functions\nexport function NewAccountRequest(params: {\n external_id: string;\n account_type: 'CONSUMER' | 'BUSINESS' | 'STAKEHOLDER' | 'CARDHOLDER';\n profile?: string;\n information: AccountInformation;\n primary_address?: AddressRequest;\n business_account_uuid?: string;\n parent_account_uuid?: string;\n metadata?: Record<string, any>;\n}): AccountRequest {\n const data: AccountRequest = {\n external_id: params.external_id,\n account_type: params.account_type,\n profile: params.profile,\n information: params.information,\n primary_address: params.primary_address,\n business_account_uuid: params.business_account_uuid,\n parent_account_uuid: params.parent_account_uuid,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewAddressRequest(params: {\n label: string;\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n primary?: boolean;\n external_id?: string;\n}): AddressRequest {\n const data: AddressRequest = {\n label: params.label,\n line_1: params.line_1,\n line_2: params.line_2,\n city: params.city,\n state: params.state,\n postal_code: params.postal_code,\n country: params.country,\n primary: params.primary,\n external_id: params.external_id,\n };\n\n return getSanitizedBody(data);\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface GenerateMobileTokenRequest {\n account_uuid: string;\n with_plaid_sdk_token?: 'ANDROID' | 'IOS';\n}\n\nexport interface GeneratePlaidTokenRequest {\n account_uuid: string;\n platform: 'IOS' | 'ANDROID' | 'WEB';\n payment_method_uuid?: string;\n}\n\nexport interface GenerateWebSessionRequest {\n account_uuid: string;\n}\n\nexport interface GeneratePdsTokenRequest {\n wallet_uuid: string;\n}\n\n/**\n * Request to generate scoped JWT for specific account (JWT downgrade)\n * Used to exchange business-level JWT for consumer-level JWT\n */\nexport interface GenerateScopedTokenRequest {\n account_uuid: string;\n}\n\n// Factory functions\nexport function NewGenerateMobileTokenRequest(params: {\n account_uuid: string;\n with_plaid_sdk_token?: 'ANDROID' | 'IOS';\n}): GenerateMobileTokenRequest {\n const data: GenerateMobileTokenRequest = {\n account_uuid: params.account_uuid,\n with_plaid_sdk_token: params.with_plaid_sdk_token,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGeneratePlaidTokenRequest(params: {\n account_uuid: string;\n platform: 'IOS' | 'ANDROID' | 'WEB';\n payment_method_uuid?: string;\n}): GeneratePlaidTokenRequest {\n const data: GeneratePlaidTokenRequest = {\n account_uuid: params.account_uuid,\n platform: params.platform,\n payment_method_uuid: params.payment_method_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGenerateWebSessionRequest(params: {\n account_uuid: string;\n}): GenerateWebSessionRequest {\n const data: GenerateWebSessionRequest = {\n account_uuid: params.account_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGeneratePdsTokenRequest(params: {\n wallet_uuid: string;\n}): GeneratePdsTokenRequest {\n const data: GeneratePdsTokenRequest = {\n wallet_uuid: params.wallet_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGenerateScopedTokenRequest(params: {\n account_uuid: string;\n}): GenerateScopedTokenRequest {\n return {\n account_uuid: params.account_uuid\n };\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface DossierDocument {\n document_type: string;\n document_number?: string;\n issuing_country?: string;\n issuing_authority?: string;\n issue_date?: string;\n expiry_date?: string;\n file_content: string; // Base64 encoded file content\n file_name: string;\n mime_type: string;\n}\n\nexport interface DossierRequest {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\nexport interface DossierUpdateRequest {\n documents?: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\nexport interface DossierReplaceRequest {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\n// Factory functions\nexport function NewDossierRequest(params: {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}): DossierRequest {\n const data: DossierRequest = {\n external_id: params.external_id,\n documents: params.documents,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewDossierReplaceRequest(params: {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}): DossierReplaceRequest {\n const data: DossierReplaceRequest = {\n external_id: params.external_id,\n documents: params.documents,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n","export enum DossierType {\n PASSPORT = 'PASSPORT',\n ID_DOCUMENT_FRONT = 'ID_DOCUMENT_FRONT',\n ID_DOCUMENT_BACK = 'ID_DOCUMENT_BACK',\n DRIVER_LICENSE_FRONT = 'DRIVER_LICENSE_FRONT',\n DRIVER_LICENSE_BACK = 'DRIVER_LICENSE_BACK',\n SELFIE = 'SELFIE',\n PROOF_OF_ADDRESS = 'PROOF_OF_ADDRESS',\n PROOF_OF_FUNDS = 'PROOF_OF_FUNDS',\n MC_DOCUMENT_FRONT = 'MC_DOCUMENT_FRONT',\n MC_DOCUMENT_BACK = 'MC_DOCUMENT_BACK',\n INE_FRONT = 'INE_FRONT',\n INE_BACK = 'INE_BACK',\n ARTICLES_OF_INCORPORATION = 'ARTICLES_OF_INCORPORATION',\n CERTIFICATE_OF_GOOD_STANDING = 'CERTIFICATE_OF_GOOD_STANDING',\n ORG_CHART = 'ORG_CHART',\n UBO_FORM = 'UBO_FORM',\n REG_GG_ATTESTATION = 'REG_GG_ATTESTATION',\n}\n\nexport enum DossierStatus {\n CREATED = 'CREATED',\n PENDING = 'PENDING',\n MANUAL_REVIEW = 'MANUAL_REVIEW',\n VERIFIED = 'VERIFIED',\n EXPIRED = 'EXPIRED',\n REJECTED = 'REJECTED',\n FAILED = 'FAILED',\n DELETED = 'DELETED',\n}\n\nexport interface DossierDocument {\n type: DossierType;\n file: Base64URLString;\n barcode_data?: string;\n fail_reasons?: string[];\n extracted_data: Record<string, any>;\n}\n\nexport interface DossierResponse {\n dossier_uuid: string;\n account_uuid: string;\n primary: boolean;\n status: DossierStatus;\n status_reason?: string;\n status_reason_description?: string;\n external_id: string;\n country_of_issuance: string;\n created_at: string;\n updated_at: string;\n documents: DossierDocument[];\n}\n\nexport interface DossierListResponse {\n dossiers: DossierResponse[];\n}\n","export interface FieldPluginConfig {\n // Validation options\n validateOnType?: boolean;\n validateOnBlur?: boolean;\n validateOnSubmit?: boolean;\n\n // Formatting options\n formatOnType?: boolean;\n formatOnBlur?: boolean;\n\n // Visual feedback options\n showErrorsInline?: boolean;\n errorClassName?: string;\n successClassName?: string;\n\n // Custom attributes\n placeholder?: string;\n maxLength?: number;\n\n // Custom validation rules (in addition to built-in)\n customValidation?: (value: string) => string | null;\n\n // Accessibility\n ariaLabel?: string;\n ariaDescribedBy?: string;\n}\n\nexport interface FieldValidationResult {\n isValid: boolean;\n error?: string;\n suggestions?: string[];\n}\n\nexport interface FieldFormatResult {\n formattedValue: string;\n cursorPosition?: number;\n}\n\nexport interface FieldPluginEvents {\n onMount?: (element: HTMLElement) => void;\n onUnmount?: (element: HTMLElement) => void;\n onChange?: (value: string, element: HTMLElement) => void;\n onFocus?: (element: HTMLElement) => void;\n onBlur?: (element: HTMLElement) => void;\n onKeyDown?: (event: KeyboardEvent, element: HTMLElement) => boolean; // return false to prevent default\n onKeyUp?: (event: KeyboardEvent, element: HTMLElement) => void;\n onPaste?: (event: ClipboardEvent, element: HTMLElement) => boolean; // return false to prevent default\n}\n\n/**\n * Base interface for all field plugins in the headless SDK.\n * Plugins handle validation, formatting, and user interaction for specific field types.\n */\nexport interface FieldPlugin {\n readonly name: string;\n readonly version: string;\n readonly description?: string;\n\n /**\n * Validate field value and return validation result\n */\n validate(value: string, config?: FieldPluginConfig): FieldValidationResult;\n\n /**\n * Format field value for display (e.g., add spaces to card numbers)\n */\n format(value: string, config?: FieldPluginConfig): FieldFormatResult;\n\n /**\n * Sanitize/clean input value (remove unwanted characters)\n */\n sanitize(value: string, config?: FieldPluginConfig): string;\n\n /**\n * Get the raw value for API submission (opposite of format)\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string;\n\n /**\n * Initialize plugin on a DOM element\n */\n mount(element: HTMLElement, config?: FieldPluginConfig): void;\n\n /**\n * Cleanup plugin from a DOM element\n */\n unmount(element: HTMLElement): void;\n\n /**\n * Check if this plugin can handle a specific field type\n */\n canHandle(fieldType: string): boolean;\n\n /**\n * Get plugin-specific configuration defaults\n */\n getDefaultConfig(): FieldPluginConfig;\n}\n\n/**\n * Abstract base class for field plugins providing common functionality\n */\nexport abstract class BaseFieldPlugin implements FieldPlugin {\n abstract readonly name: string;\n abstract readonly version: string;\n abstract readonly description?: string;\n\n protected eventListeners: Map<HTMLElement, Map<string, EventListener>> = new Map();\n protected configs: Map<HTMLElement, FieldPluginConfig> = new Map();\n\n abstract validate(value: string, config?: FieldPluginConfig): FieldValidationResult;\n abstract format(value: string, config?: FieldPluginConfig): FieldFormatResult;\n abstract canHandle(fieldType: string): boolean;\n\n /**\n * Default sanitization - remove leading/trailing whitespace\n */\n sanitize(value: string, config?: FieldPluginConfig): string {\n return value.trim();\n }\n\n /**\n * Default raw value - just remove formatting spaces\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string {\n return formattedValue.replace(/\\s/g, '');\n }\n\n /**\n * Mount plugin to DOM element with event listeners\n */\n mount(element: HTMLElement, config?: FieldPluginConfig): void {\n const finalConfig = { ...this.getDefaultConfig(), ...config };\n this.configs.set(element, finalConfig);\n\n const listeners = new Map<string, EventListener>();\n this.eventListeners.set(element, listeners);\n\n // Setup input validation and formatting\n if (element instanceof HTMLInputElement) {\n this.setupInputElement(element as HTMLInputElement, finalConfig);\n }\n\n // Call plugin-specific mount logic\n this.onMount?.(element, finalConfig);\n }\n\n /**\n * Unmount plugin from DOM element\n */\n unmount(element: HTMLElement): void {\n const listeners = this.eventListeners.get(element);\n if (listeners) {\n listeners.forEach((listener, event) => {\n element.removeEventListener(event, listener);\n });\n this.eventListeners.delete(element);\n }\n\n this.configs.delete(element);\n this.onUnmount?.(element);\n }\n\n /**\n * Setup event listeners for input elements\n */\n protected setupInputElement(input: HTMLInputElement, config: FieldPluginConfig): void {\n const listeners = this.eventListeners.get(input)!;\n\n // Format on type\n if (config.formatOnType) {\n const inputListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const result = this.format(target.value, config);\n if (result.formattedValue !== target.value) {\n target.value = result.formattedValue;\n\n // Restore cursor position if specified\n if (result.cursorPosition !== undefined) {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition);\n }\n }\n };\n input.addEventListener('input', inputListener);\n listeners.set('input', inputListener);\n }\n\n // Validate on blur\n if (config.validateOnBlur) {\n const blurListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const validation = this.validate(target.value, config);\n this.displayValidation(target, validation, config);\n };\n input.addEventListener('blur', blurListener);\n listeners.set('blur', blurListener);\n }\n\n // Validate on type (real-time)\n if (config.validateOnType) {\n const validateListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const validation = this.validate(target.value, config);\n this.displayValidation(target, validation, config);\n };\n input.addEventListener('input', validateListener);\n listeners.set('input-validate', validateListener);\n }\n\n // Apply initial configuration\n if (config.placeholder) input.placeholder = config.placeholder;\n if (config.maxLength) input.maxLength = config.maxLength;\n if (config.ariaLabel) input.setAttribute('aria-label', config.ariaLabel);\n if (config.ariaDescribedBy) input.setAttribute('aria-describedby', config.ariaDescribedBy);\n }\n\n /**\n * Display validation results on the element\n */\n protected displayValidation(element: HTMLElement, result: FieldValidationResult, config: FieldPluginConfig): void {\n if (!config.showErrorsInline) return;\n\n // Remove existing classes\n if (config.errorClassName) element.classList.remove(config.errorClassName);\n if (config.successClassName) element.classList.remove(config.successClassName);\n\n // Add appropriate class\n if (result.isValid && config.successClassName) {\n element.classList.add(config.successClassName);\n } else if (!result.isValid && config.errorClassName) {\n element.classList.add(config.errorClassName);\n }\n\n // Update error message\n this.updateErrorMessage(element, result.error);\n }\n\n /**\n * Update error message display\n */\n protected updateErrorMessage(element: HTMLElement, error?: string): void {\n let errorElement = element.parentElement?.querySelector('.alviere-field-error') as HTMLElement;\n\n if (error) {\n if (!errorElement) {\n errorElement = document.createElement('div');\n errorElement.className = 'alviere-field-error';\n element.parentElement?.appendChild(errorElement);\n }\n errorElement.textContent = error;\n errorElement.style.display = 'block';\n } else if (errorElement) {\n errorElement.style.display = 'none';\n }\n }\n\n /**\n * Get default configuration for this plugin\n */\n getDefaultConfig(): FieldPluginConfig {\n return {\n validateOnBlur: true,\n formatOnType: true,\n showErrorsInline: true,\n errorClassName: 'alviere-field-error',\n successClassName: 'alviere-field-success'\n };\n }\n\n // Lifecycle hooks for subclasses to override\n protected onMount?(element: HTMLElement, config: FieldPluginConfig): void;\n protected onUnmount?(element: HTMLElement): void;\n}\n","/**\n * CardNumberPlugin - CURRENTLY NOT ACTIVE\n *\n * Status: Implemented and tested, but disabled - not used by any consumers\n *\n * This plugin provides card number validation, formatting, and type detection.\n * It's been kept in the codebase as a future enhancement possibility.\n *\n * Note: ui-svelte implements its own card handling directly in CardPanInput.svelte\n * with its own cardTypes array and detectCardType function. The validation comes\n * from the core Validator service (credit_card_number method), not from this plugin.\n *\n * To activate:\n * 1. Tests already exist (card-number.test.ts)\n * 2. Uncomment the import in field-plugin-registry.ts\n * 3. Add to registerBuiltinPlugins() array\n * 4. Remove from coverage exclusions in vitest.config.ts\n * 5. Update consuming code to use this plugin instead of custom implementations\n */\nimport { BaseFieldPlugin, FieldPluginConfig, FieldValidationResult, FieldFormatResult } from '../field-plugin.interface';\n\nexport interface CardType {\n name: string;\n pattern: RegExp;\n gaps: number[];\n lengths: number[];\n code: { name: string; size: number };\n}\n\n// Card type definitions\nexport const CARD_TYPES: { [key: string]: CardType } = {\n visa: {\n name: 'Visa',\n pattern: /^4/,\n gaps: [4, 8, 12],\n lengths: [13, 16, 19],\n code: { name: 'CVV', size: 3 }\n },\n mastercard: {\n name: 'Mastercard',\n pattern: /^(5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)/,\n gaps: [4, 8, 12],\n lengths: [16],\n code: { name: 'CVC', size: 3 }\n },\n amex: {\n name: 'American Express',\n pattern: /^3[47]/,\n gaps: [4, 10],\n lengths: [15],\n code: { name: 'CID', size: 4 }\n },\n diners: {\n name: 'Diners Club',\n pattern: /^3[0689]/,\n gaps: [4, 10],\n lengths: [14],\n code: { name: 'CVV', size: 3 }\n },\n discover: {\n name: 'Discover',\n pattern: /^6([045]|22)/,\n gaps: [4, 8, 12],\n lengths: [16, 19],\n code: { name: 'CID', size: 3 }\n },\n jcb: {\n name: 'JCB',\n pattern: /^35/,\n gaps: [4, 8, 12],\n lengths: [16],\n code: { name: 'CVV', size: 3 }\n }\n};\n\nexport class CardNumberPlugin extends BaseFieldPlugin {\n readonly name = 'card-number';\n readonly version = '1.0.0';\n readonly description = 'Credit card number formatting and validation';\n\n private currentCardType: CardType | null = null;\n\n /**\n * Validate card number using Luhn algorithm and card type patterns\n */\n validate(value: string, config?: FieldPluginConfig): FieldValidationResult {\n const sanitized = this.sanitize(value);\n\n if (!sanitized) {\n return { isValid: false, error: 'Card number is required' };\n }\n\n // Check if all characters are digits\n if (!/^\\d+$/.test(sanitized)) {\n return { isValid: false, error: 'Card number must contain only digits' };\n }\n\n // Detect card type\n const cardType = this.detectCardType(sanitized);\n this.currentCardType = cardType;\n\n if (!cardType) {\n return { isValid: false, error: 'Invalid card number format' };\n }\n\n // Check length\n if (!cardType.lengths.includes(sanitized.length)) {\n const expectedLengths = cardType.lengths.join(' or ');\n return {\n isValid: false,\n error: `${cardType.name} card numbers must be ${expectedLengths} digits long`\n };\n }\n\n // Validate using Luhn algorithm\n if (!this.luhnCheck(sanitized)) {\n return { isValid: false, error: 'Invalid card number' };\n }\n\n // Custom validation if provided\n if (config?.customValidation) {\n const customError = config.customValidation(value);\n if (customError) {\n return { isValid: false, error: customError };\n }\n }\n\n return {\n isValid: true,\n suggestions: [`${cardType.name} ending in ${sanitized.slice(-4)}`]\n };\n }\n\n /**\n * Format card number with appropriate spacing based on card type\n */\n format(value: string, config?: FieldPluginConfig): FieldFormatResult {\n const sanitized = this.sanitize(value);\n const cardType = this.detectCardType(sanitized) || CARD_TYPES.visa; // Default to Visa formatting\n\n let formatted = '';\n let spacesAdded = 0;\n\n for (let i = 0; i < sanitized.length; i++) {\n // Check if we need to add a space before this digit\n if (cardType.gaps.includes(i)) {\n formatted += ' ';\n spacesAdded++;\n }\n formatted += sanitized[i];\n }\n\n // Calculate cursor position: original sanitized length + spaces added\n const cursorPosition = sanitized.length + spacesAdded;\n\n return {\n formattedValue: formatted,\n cursorPosition: cursorPosition\n };\n }\n\n /**\n * Remove all non-digit characters\n */\n sanitize(value: string, config?: FieldPluginConfig): string {\n return value.replace(/\\D/g, '');\n }\n\n /**\n * Get raw value without formatting spaces\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string {\n return this.sanitize(formattedValue);\n }\n\n /**\n * Check if this plugin can handle the field type\n */\n canHandle(fieldType: string): boolean {\n return ['card-number', 'cardNumber', 'pan', 'credit-card'].includes(fieldType);\n }\n\n /**\n * Get plugin-specific default configuration\n */\n getDefaultConfig(): FieldPluginConfig {\n return {\n ...super.getDefaultConfig(),\n validateOnType: true,\n formatOnType: true,\n placeholder: '1234 5678 9012 3456',\n maxLength: 23, // Max formatted length for 19-digit cards with spaces\n ariaLabel: 'Credit card number'\n };\n }\n\n /**\n * Detect card type based on number pattern\n */\n detectCardType(cardNumber: string): CardType | null {\n for (const [key, cardType] of Object.entries(CARD_TYPES)) {\n if (cardType.pattern.test(cardNumber)) {\n return cardType;\n }\n }\n return null;\n }\n\n /**\n * Get the detected card type\n */\n getCardType(): CardType | null {\n return this.currentCardType;\n }\n\n /**\n * Validate card number using Luhn algorithm\n */\n private luhnCheck(cardNumber: string): boolean {\n let sum = 0;\n let isEven = false;\n\n // Loop through digits from right to left\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n return sum % 10 === 0;\n }\n\n /**\n * Enhanced mount with card type detection\n */\n protected onMount(element: HTMLElement, config: FieldPluginConfig): void {\n if (element instanceof HTMLInputElement) {\n // Add card type detection on input\n const cardTypeListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const sanitized = this.sanitize(target.value);\n const cardType = this.detectCardType(sanitized);\n\n // Emit card type change event\n if (cardType !== this.currentCardType) {\n this.currentCardType = cardType;\n element.dispatchEvent(new CustomEvent('cardTypeChange', {\n detail: { cardType, element },\n bubbles: true // Allow event to bubble up to document\n }));\n }\n\n // Update maxLength based on card type\n if (cardType) {\n const maxFormattedLength = Math.max(...cardType.lengths) + cardType.gaps.length;\n target.maxLength = maxFormattedLength;\n }\n };\n\n element.addEventListener('input', cardTypeListener);\n\n // Store reference for cleanup\n const listeners = this.eventListeners.get(element);\n if (listeners) {\n listeners.set('cardTypeDetection', cardTypeListener);\n }\n }\n }\n}\n","import { FieldPlugin, FieldPluginConfig } from './field-plugin.interface';\n// Future plugin enhancements - currently not in use\n// All plugins are disabled as they have no active consumers\n// ui-svelte implements its own card handling in CardPanInput.svelte\n// import { CardNumberPlugin } from './fields/card-number.plugin';\n// import { ExpiryDatePlugin } from './fields/expiry-date.plugin';\n// import { CVVPlugin } from './fields/cvv.plugin';\n// import { TextPlugin, ZipCodePlugin } from './fields/text.plugin';\nimport { LoggerInterface } from '../entities/interfaces/logger.interface';\n\nexport interface PluginRegistryConfig {\n autoRegisterBuiltins?: boolean;\n enablePluginValidation?: boolean;\n logger?: LoggerInterface;\n}\n\n/**\n * FieldPluginRegistry manages all field plugins and provides\n * plugin discovery, registration, and management capabilities\n */\nexport class FieldPluginRegistry {\n private plugins: Map<string, FieldPlugin> = new Map();\n private fieldTypeCache: Map<string, FieldPlugin> = new Map();\n private config: PluginRegistryConfig;\n private logger?: LoggerInterface;\n\n constructor(config: PluginRegistryConfig = {}) {\n this.config = {\n autoRegisterBuiltins: true,\n enablePluginValidation: true,\n ...config\n };\n this.logger = config.logger;\n\n // Auto-register built-in plugins\n if (this.config.autoRegisterBuiltins) {\n this.registerBuiltinPlugins();\n }\n\n this.logger?.debug('🔐 FieldPluginRegistry initialized');\n }\n\n /**\n * Register a field plugin\n */\n register(plugin: FieldPlugin): void {\n if (this.config.enablePluginValidation) {\n this.validatePlugin(plugin);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Clear field type cache since we have a new plugin\n this.fieldTypeCache.clear();\n\n this.logger?.debug(`FieldPluginRegistry: Registered plugin '${plugin.name}' v${plugin.version}`);\n }\n\n /**\n * Unregister a field plugin\n */\n unregister(pluginName: string): boolean {\n const removed = this.plugins.delete(pluginName);\n\n if (removed) {\n // Clear field type cache\n this.fieldTypeCache.clear();\n this.logger?.debug(`FieldPluginRegistry: Unregistered plugin '${pluginName}'`);\n }\n\n return removed;\n }\n\n /**\n * Get a plugin by name\n */\n getPlugin(pluginName: string): FieldPlugin | undefined {\n return this.plugins.get(pluginName);\n }\n\n /**\n * Get plugin for a specific field type (with caching)\n */\n getPluginForFieldType(fieldType: string): FieldPlugin | undefined {\n // Check cache first\n if (this.fieldTypeCache.has(fieldType)) {\n return this.fieldTypeCache.get(fieldType);\n }\n\n // Find plugin that can handle this field type\n for (const plugin of this.plugins.values()) {\n if (plugin.canHandle(fieldType)) {\n this.fieldTypeCache.set(fieldType, plugin);\n return plugin;\n }\n }\n\n // Fallback to text plugin if available\n const textPlugin = this.plugins.get('text');\n if (textPlugin) {\n this.fieldTypeCache.set(fieldType, textPlugin);\n return textPlugin;\n }\n\n return undefined;\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): FieldPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get plugin names\n */\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(pluginName: string): boolean {\n return this.plugins.has(pluginName);\n }\n\n /**\n * Get supported field types across all plugins\n */\n getSupportedFieldTypes(): string[] {\n const fieldTypes = new Set<string>();\n\n // Common field types that plugins can handle\n const commonFieldTypes = [\n 'card-number', 'cardNumber', 'pan',\n 'expiry', 'expiry-date', 'expiryDate',\n 'cvv', 'cvc', 'code',\n 'zip', 'zip-code', 'postal-code',\n 'text', 'name', 'cardholder-name'\n ];\n\n for (const fieldType of commonFieldTypes) {\n if (this.getPluginForFieldType(fieldType)) {\n fieldTypes.add(fieldType);\n }\n }\n\n return Array.from(fieldTypes);\n }\n\n /**\n * Create and mount a plugin for an element\n */\n mountPlugin(element: HTMLElement, fieldType: string, config?: FieldPluginConfig): FieldPlugin | null {\n const plugin = this.getPluginForFieldType(fieldType);\n\n if (!plugin) {\n this.logger?.warn(`FieldPluginRegistry: No plugin found for field type '${fieldType}'`);\n return null;\n }\n\n try {\n plugin.mount(element, config);\n this.logger?.debug(`FieldPluginRegistry: Mounted '${plugin.name}' plugin on element for field type '${fieldType}'`);\n return plugin;\n } catch (error) {\n this.logger?.error(`FieldPluginRegistry: Failed to mount plugin '${plugin.name}': ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Unmount plugin from an element\n */\n unmountPlugin(element: HTMLElement, fieldType: string): boolean {\n const plugin = this.getPluginForFieldType(fieldType);\n\n if (!plugin) {\n return false;\n }\n\n try {\n plugin.unmount(element);\n this.logger?.debug(`FieldPluginRegistry: Unmounted '${plugin.name}' plugin from element`);\n return true;\n } catch (error) {\n this.logger?.error(`FieldPluginRegistry: Failed to unmount plugin '${plugin.name}': ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n /**\n * Get plugin registry statistics\n */\n getStats(): {\n totalPlugins: number;\n pluginNames: string[];\n supportedFieldTypes: string[];\n cacheSize: number;\n } {\n return {\n totalPlugins: this.plugins.size,\n pluginNames: this.getPluginNames(),\n supportedFieldTypes: this.getSupportedFieldTypes(),\n cacheSize: this.fieldTypeCache.size\n };\n }\n\n /**\n * Clear all caches\n */\n clearCaches(): void {\n this.fieldTypeCache.clear();\n }\n\n /**\n * Register all built-in plugins\n *\n * Note: ALL plugins are currently disabled as they have no active consumers.\n * - ui-svelte implements its own card handling in CardPanInput.svelte\n * - CardNumberPlugin was only used in its own tests\n * - Other plugins (ExpiryDatePlugin, CVVPlugin, TextPlugin, ZipCodePlugin) were never activated\n *\n * The plugin system remains as a future architecture option if needed.\n *\n * To re-enable plugins in the future:\n * 1. Uncomment the imports at the top of this file\n * 2. Add plugin instances to the builtinPlugins array below\n * 3. Ensure tests exist for the plugins\n * 4. Update vitest.config.ts to remove them from coverage exclusions\n * 5. Update consuming code to actually use the plugins\n */\n private registerBuiltinPlugins(): void {\n const builtinPlugins: FieldPlugin[] = [\n // All plugins disabled - no active consumers\n // new CardNumberPlugin(),\n // new ExpiryDatePlugin(),\n // new CVVPlugin(),\n // new TextPlugin(),\n // new ZipCodePlugin()\n ];\n\n for (const plugin of builtinPlugins) {\n this.register(plugin);\n }\n }\n\n /**\n * Validate plugin before registration\n */\n private validatePlugin(plugin: FieldPlugin): void {\n if (!plugin.name || typeof plugin.name !== 'string') {\n throw new Error('Plugin must have a valid name');\n }\n\n if (!plugin.version || typeof plugin.version !== 'string') {\n throw new Error('Plugin must have a valid version');\n }\n\n if (typeof plugin.validate !== 'function') {\n throw new Error('Plugin must implement validate method');\n }\n\n if (typeof plugin.format !== 'function') {\n throw new Error('Plugin must implement format method');\n }\n\n if (typeof plugin.sanitize !== 'function') {\n throw new Error('Plugin must implement sanitize method');\n }\n\n if (typeof plugin.canHandle !== 'function') {\n throw new Error('Plugin must implement canHandle method');\n }\n\n if (typeof plugin.mount !== 'function') {\n throw new Error('Plugin must implement mount method');\n }\n\n if (typeof plugin.unmount !== 'function') {\n throw new Error('Plugin must implement unmount method');\n }\n\n // Check for name conflicts\n if (this.plugins.has(plugin.name)) {\n this.logger?.warn(`FieldPluginRegistry: Plugin '${plugin.name}' is already registered and will be replaced`);\n }\n }\n}\n\n// Global registry instance\nlet globalRegistry: FieldPluginRegistry | null = null;\n\n/**\n * Get the global field plugin registry (singleton)\n */\nexport function getGlobalPluginRegistry(): FieldPluginRegistry {\n if (!globalRegistry) {\n globalRegistry = new FieldPluginRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Create a new plugin registry instance\n */\nexport function createPluginRegistry(config?: PluginRegistryConfig): FieldPluginRegistry {\n return new FieldPluginRegistry(config);\n}\n","// Core SDK Entry Point - Framework Agnostic\nimport { Logger } from './infrastructure/logging/logger.service';\nimport { Cryptor } from './infrastructure/security/cryptor.service';\nimport { Validator } from './infrastructure/security/validator.service';\nimport { PaymentsGateway } from './infrastructure/gateways/payments.gateway';\nimport { WalletsGateway } from './infrastructure/gateways/wallets.gateway';\nimport { PaymentInstrumentsGateway } from './infrastructure/gateways/payment-instruments.gateway';\nimport { AccountsGateway } from './infrastructure/gateways/accounts.gateway';\nimport { AuthGateway } from './infrastructure/gateways/auth.gateway';\nimport { WalletsApiService } from './services/wallets-api.service';\nimport { PaymentInstrumentsApiService } from './services/payment-instruments-api.service';\nimport { AccountsApiService } from './services/accounts-api.service';\nimport { PaymentProcessor } from './services/payment-processor.service';\nimport { BankInfoApiService } from './services/bank-info-api.service';\nimport { LegalTextsApiService } from './services/legal-texts-api.service';\nimport { setRuntimeConfig, AlviereConfig, getRSA_PUB_KEY } from './entities/constants/environment';\nimport {\n extractAlviereConfigFromJWT,\n extractAccountUuidFromJWT,\n} from './entities/requests/utility';\nimport { BankInfoGateway } from './infrastructure/gateways/bank-info.gateway';\nimport { LegalTextsGateway } from './infrastructure/gateways/legal-texts.gateway';\n\n// Export infrastructure services\nexport { Logger } from './infrastructure/logging/logger.service';\nexport { Cryptor } from './infrastructure/security/cryptor.service';\nexport { Validator } from './infrastructure/security/validator.service';\n\n// Export essential interfaces\nexport * from './entities/interfaces/cryptor.interface';\nexport * from './entities/interfaces/logger.interface';\nexport * from './entities/interfaces/validator.interface';\nexport * from './entities/interfaces/gateways/payments.interface';\nexport * from './entities/interfaces/gateways/wallets.interface';\nexport * from './entities/interfaces/gateways/payment-instruments.interface';\nexport * from './entities/interfaces/gateways/accounts.interface';\nexport * from './entities/interfaces/gateways/legal-texts.interface';\n\n// Export configuration and utility types\nexport * from './entities/constants/environment';\nexport * from './entities/requests/utility';\nexport { extractAccountUuidFromJWT } from './entities/requests/utility';\n\n// Export request types\nexport * from './entities/requests/payments/payments';\nexport * from './entities/requests/payments/payment-instruments';\nexport * from './entities/requests/payments/bank-accounts';\nexport * from './entities/requests/wallets/wallets';\nexport * from './entities/requests/accounts/accounts';\nexport * from './entities/requests/accounts/addresses';\nexport * from './entities/requests/auth/auth';\nexport type {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from './entities/requests/accounts/dossiers';\nexport { NewDossierRequest, NewDossierReplaceRequest } from './entities/requests/accounts/dossiers';\n\n// Export account information types\nexport type {\n ConsumerAccountInformation,\n BusinessAccountInformation,\n StakeholderAccountInformation,\n CardholderAccountInformation,\n EmploymentStatus,\n BusinessType,\n AccountPurpose,\n SourceOfFunds,\n Profession,\n} from './entities/requests/accounts/accounts';\n\n// Export response types\nexport * from './entities/responses/payments/add_card';\nexport * from './entities/responses/payments/bank_accounts';\nexport * from './entities/responses/wallets/wallets';\nexport * from './entities/responses/accounts/accounts';\nexport * from './entities/responses/dossiers/dossiers';\nexport * from './entities/responses/auth/auth';\nexport * from './entities/responses/bank-info/bank-info';\nexport * from './entities/interfaces/BankInfo.interface';\nexport * from './entities/responses/legal-texts/legal-texts';\n\n// Export payment instruments responses (explicitly handle the Transaction conflict)\nexport type {\n PaymentInstrument,\n PaymentInstrumentResponse,\n CardInstrumentResponse,\n DebitFundsResponse,\n CardPaymentMethod,\n CardListResponse,\n} from './entities/responses/payments/payment-instruments';\n\n// Export error types\nexport { AlcoreApiError } from './entities/errors/alcore-api.error';\n\n// Export error codes and utilities\nexport * from './entities/constants/error-codes';\n\n// Export gateways\nexport { PaymentsGateway } from './infrastructure/gateways/payments.gateway';\nexport { WalletsGateway } from './infrastructure/gateways/wallets.gateway';\nexport { PaymentInstrumentsGateway } from './infrastructure/gateways/payment-instruments.gateway';\nexport { AccountsGateway } from './infrastructure/gateways/accounts.gateway';\nexport { AuthGateway } from './infrastructure/gateways/auth.gateway';\nexport { BankInfoGateway } from './infrastructure/gateways/bank-info.gateway';\n\n// Export working services\nexport { WalletsApiService } from './services/wallets-api.service';\nexport { PaymentInstrumentsApiService } from './services/payment-instruments-api.service';\nexport { AccountsApiService } from './services/accounts-api.service';\nexport { PaymentProcessor } from './services/payment-processor.service';\n\n// Export field plugins\nexport { CardNumberPlugin } from './plugins/fields/card-number.plugin';\nexport { FieldPluginRegistry } from './plugins/field-plugin-registry';\nexport * from './plugins/field-plugin.interface';\n\n// Core SDK Configuration\nexport interface AlviereCoreConfig {\n jwt?: string;\n publicCertificate?: string;\n publicCertificateId?: string;\n domain?: string;\n debug?: boolean;\n business_uuid?: string; // Business UUID for user state comparison\n // Add Alviere-specific configuration\n alviere?: Partial<AlviereConfig>;\n}\n\n// Core SDK Factory\nexport class AlviereCore {\n private jwt: string; // JWT token from Sierra API v3\n private authToken: string = ''; // Auth token for API calls (same as JWT)\n private debug: boolean;\n private publicCertificate: string;\n private publicCertificateId: string;\n private business_uuid: string = ''; // Business UUID from configuration\n private account_uuid: string = ''; // Account UUID extracted from JWT's sub field\n\n // Shared instances (created once, reused across all services)\n private logger: Logger;\n private cryptor: Cryptor | null = null; // Lazy initialized\n\n // Gateway cache (created on-demand, reused)\n private gateways: Map<string, any> = new Map();\n\n constructor(config: AlviereCoreConfig = {}) {\n this.jwt = config.jwt || '';\n this.debug = config.debug || false;\n this.publicCertificate = config.publicCertificate || '';\n this.publicCertificateId = config.publicCertificateId || '';\n this.business_uuid = config.business_uuid || '';\n\n // Create shared instances once\n this.logger = new Logger(this.debug);\n // Note: Cryptor is created lazily when first needed (see getCryptor())\n\n this.logger.debug(`🔐 AlviereCore constructor called with config: ${JSON.stringify(config)}`);\n\n // Set runtime configuration from JWT if available\n if (this.jwt) {\n const jwtConfig = extractAlviereConfigFromJWT(this.jwt);\n\n // Extract Alviere configuration (api_domain)\n if (config.jwt) {\n setRuntimeConfig({\n ...jwtConfig,\n certificate: { id: this.publicCertificateId, public_key: this.publicCertificate },\n });\n }\n\n // Extract account_uuid from JWT's sub field\n const extractedAccountUuid = extractAccountUuidFromJWT(this.jwt);\n if (extractedAccountUuid) {\n this.account_uuid = extractedAccountUuid;\n this.logger.debug(`🔐 Extracted account_uuid from JWT sub field: ${this.account_uuid}`);\n } else {\n this.logger.debug('⚠️ No account_uuid found in JWT sub field');\n }\n\n // Use the JWT itself as the auth token for API calls\n this.authToken = this.jwt;\n this.logger.debug('🔐 Using JWT as auth token for API authentication');\n }\n\n // Override with explicit configuration if provided\n if (config.alviere) {\n setRuntimeConfig(config.alviere);\n }\n }\n\n // Update configuration\n configure(config: Partial<AlviereCoreConfig>) {\n const jwtChanged = config.jwt && config.jwt !== this.jwt;\n\n if (config.jwt) {\n this.jwt = config.jwt;\n\n // Extract new configuration from JWT\n const jwtConfig = extractAlviereConfigFromJWT(config.jwt);\n\n // Extract Alviere configuration (api_domain)\n if (jwtConfig.domain) {\n setRuntimeConfig(jwtConfig);\n }\n\n // Re-extract account_uuid from new JWT\n const extractedAccountUuid = extractAccountUuidFromJWT(config.jwt);\n this.logger.debug(`🔐 Extracted account_uuid from JWT sub field: ${extractedAccountUuid}`);\n if (extractedAccountUuid) {\n this.account_uuid = extractedAccountUuid;\n this.logger.debug(`🔐 Updated account_uuid from JWT sub field: ${this.account_uuid}`);\n } else {\n this.logger.debug('⚠️ No account_uuid found in new JWT sub field');\n }\n\n // Use the JWT itself as the auth token for API calls\n this.authToken = this.jwt;\n this.logger.debug('🔐 Updated JWT as auth token for API authentication');\n }\n\n // Update business_uuid if provided\n if (config.business_uuid !== undefined) {\n this.business_uuid = config.business_uuid;\n this.logger.debug(`🔐 Updated business_uuid: ${this.business_uuid}`);\n }\n\n // Update debug flag\n if (typeof config.debug === 'boolean' && config.debug !== this.debug) {\n this.debug = config.debug;\n // Recreate logger with new debug setting\n this.logger = new Logger(this.debug);\n this.logger.debug('🔐 Debug mode changed to: ' + this.debug);\n }\n\n // Clear gateway cache if JWT changed (they need new auth token)\n if (jwtChanged) {\n this.logger.debug('🔐 JWT changed - clearing gateway cache and cryptor');\n this.gateways.clear();\n // Clear cryptor so it will be recreated with new RSA key on next use\n this.cryptor = null;\n }\n\n // Update Alviere runtime configuration (overrides JWT config)\n if (config.alviere) {\n setRuntimeConfig(config.alviere);\n }\n\n return this;\n }\n\n /**\n * Get or create Cryptor instance (lazy initialization with validation)\n * This ensures we only create Cryptor when it's actually needed and we have a valid RSA key\n * @throws Error if RSA public key is not available\n */\n private getOrCreateCryptor(): Cryptor {\n if (!this.cryptor) {\n const rsaKey = getRSA_PUB_KEY();\n\n if (!rsaKey || rsaKey.trim() === '') {\n throw new Error(\n '🔐 Cryptor initialization failed: RSA public key not available. ' +\n 'Please ensure JWT is configured with a valid RSA key before attempting encryption operations. ' +\n 'Call alviereCore.configure({ jwt: \"your-jwt-with-rsa-key\" }) first.'\n );\n }\n\n this.logger.debug('🔐 Creating Cryptor instance with RSA key');\n this.cryptor = new Cryptor(this.logger);\n }\n return this.cryptor;\n }\n\n // Create payment gateway (cached and reused)\n createPaymentsGateway() {\n if (!this.gateways.has('payments')) {\n this.gateways.set(\n 'payments',\n new PaymentsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return this.gateways.get('payments');\n }\n\n // Create payments service (reuses cached gateway and shared logger)\n createPaymentsService() {\n const gateway = this.createPaymentsGateway();\n return new PaymentProcessor(gateway, this.logger);\n }\n\n // Create wallet services (reuses cached gateway)\n createWalletsService() {\n if (!this.gateways.has('wallets')) {\n this.gateways.set(\n 'wallets',\n new WalletsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new WalletsApiService(this.gateways.get('wallets'));\n }\n\n // Create payment instruments service (reuses cached gateway)\n createPaymentInstrumentsService() {\n if (!this.gateways.has('paymentInstruments')) {\n this.gateways.set(\n 'paymentInstruments',\n new PaymentInstrumentsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new PaymentInstrumentsApiService(this.gateways.get('paymentInstruments'));\n }\n\n // Create accounts service (reuses cached gateway)\n createAccountsService() {\n if (!this.gateways.has('accounts')) {\n this.gateways.set(\n 'accounts',\n new AccountsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new AccountsApiService(this.gateways.get('accounts'));\n }\n\n // Create auth gateway (reuses cached gateway)\n createAuthGateway() {\n if (!this.gateways.has('auth')) {\n if (!this.cryptor) {\n throw new Error('Cryptor not initialized. Cannot create AuthGateway.');\n }\n this.gateways.set('auth', new AuthGateway(this.authToken, this.cryptor, this.logger));\n }\n return this.gateways.get('auth') as AuthGateway;\n }\n\n // Create bank info service\n createBankInfoService() {\n if (!this.gateways.has('bankInfo')) {\n this.gateways.set(\n 'bankInfo',\n new BankInfoGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new BankInfoApiService(this.gateways.get('bankInfo'));\n }\n\n // Create legal texts service\n createLegalTextsService() {\n if (!this.gateways.has('legalTexts')) {\n this.gateways.set(\n 'legalTexts',\n new LegalTextsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new LegalTextsApiService(this.gateways.get('legalTexts'));\n }\n\n /**\n * Generate scoped JWT for specific account (JWT downgrade)\n * Exchanges the current business-level JWT for a consumer-level JWT\n *\n * @param accountUuid - The account UUID to scope the JWT to\n * @param autoUpdate - If true, automatically updates the SDK with the new JWT (default: true)\n * @returns The new scoped JWT token\n */\n async generateScopedToken(accountUuid: string, autoUpdate: boolean = true): Promise<string> {\n this.logger.debug(`🔐 Generating scoped token for account: ${accountUuid}`);\n this.logger.debug(`🔐 Auto-update: ${autoUpdate}`);\n\n const authGateway = this.createAuthGateway();\n const response = await authGateway.generateScopedToken({ account_uuid: accountUuid });\n\n this.logger.debug('✅ Scoped token generated successfully');\n\n if (autoUpdate && response.access_token) {\n this.logger.debug('🔄 Auto-updating SDK with new scoped token');\n this.configure({ jwt: response.access_token });\n }\n\n return response.access_token;\n }\n\n // Get shared instances (for advanced usage)\n getLogger() {\n return this.logger;\n }\n\n /**\n * Get Cryptor instance (lazy initialized with validation)\n * @throws Error if RSA public key is not available\n */\n getCryptor() {\n return this.getOrCreateCryptor(); // Delegate to private method with validation\n }\n\n // Clear gateway cache (useful for testing or manual cache invalidation)\n clearCache() {\n this.gateways.clear();\n }\n\n /**\n * Get the account UUID extracted from JWT's sub field\n * @returns The account UUID, or empty string if not available\n */\n getAccountUuid(): string {\n return this.account_uuid;\n }\n\n /**\n * Get the business UUID from configuration\n * @returns The business UUID, or empty string if not configured\n */\n getBusinessUuid(): string {\n return this.business_uuid;\n }\n\n /**\n * Determine if the user is accessing the SDK for the first time\n * Returns true if account_uuid matches business_uuid (user authenticated as business)\n * Returns false if they differ (JWT already scoped to a specific payee/consumer)\n *\n * @returns true if first-time user, false otherwise\n */\n isFirstTimeUser(): boolean {\n if (!this.account_uuid || !this.business_uuid) {\n this.logger.debug(\n '🔐 Cannot determine first-time user status: missing account_uuid or business_uuid'\n );\n return false; // Default to false if either is missing\n }\n\n const isFirstTime = this.account_uuid === this.business_uuid;\n this.logger.debug(\n `🔐 First-time user check: ${isFirstTime} (account: ${this.account_uuid}, business: ${this.business_uuid})`\n );\n return isFirstTime;\n }\n\n /**\n * Determine if the JWT is scoped to a specific payee/consumer\n * Returns true if account_uuid differs from business_uuid\n * Returns false if they match or if either is missing\n *\n * @returns true if scoped to payee, false otherwise\n */\n isScopedToPayee(): boolean {\n if (!this.account_uuid || !this.business_uuid) {\n return false;\n }\n return this.account_uuid !== this.business_uuid;\n }\n\n // Static utility methods\n static createValidator(debug: boolean = false) {\n const logger = new Logger(debug);\n return new Validator(logger);\n }\n\n static createLogger(debug: boolean = false) {\n return new Logger(debug);\n }\n\n static createCryptor(logger?: Logger) {\n return new Cryptor(logger);\n }\n}\n\n// Default export\nexport default AlviereCore;\n"],"names":["DossierType","DossierStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/infrastructure/logging/logger.service.ts","../src/entities/constants/environment.ts","../src/infrastructure/security/cryptor.service.ts","../src/infrastructure/security/validator.service.ts","../src/entities/errors/alcore-api.error.ts","../src/entities/constants/error-codes.ts","../src/infrastructure/gateways/alcore-base.gateway.ts","../src/entities/requests/utility.ts","../src/infrastructure/gateways/payments.gateway.ts","../src/infrastructure/gateways/wallets.gateway.ts","../src/infrastructure/gateways/payment-instruments.gateway.ts","../src/infrastructure/gateways/accounts.gateway.ts","../src/infrastructure/gateways/auth.gateway.ts","../src/services/wallets-api.service.ts","../src/services/payment-instruments-api.service.ts","../src/services/accounts-api.service.ts","../src/services/payment-processor.service.ts","../src/services/bank-info-api.service.ts","../src/services/legal-texts-api.service.ts","../src/infrastructure/gateways/bank-info.gateway.ts","../src/infrastructure/gateways/legal-texts.gateway.ts","../src/entities/requests/payments/payments.ts","../src/entities/requests/payments/payment-instruments.ts","../src/entities/requests/payments/bank-accounts.ts","../src/entities/requests/wallets/wallets.ts","../src/entities/requests/accounts/accounts.ts","../src/entities/requests/auth/auth.ts","../src/entities/requests/accounts/dossiers.ts","../src/entities/responses/dossiers/dossiers.ts","../src/plugins/field-plugin.interface.ts","../src/plugins/fields/card-number.plugin.ts","../src/plugins/field-plugin-registry.ts","../src/index.ts"],"sourcesContent":["import { LoggerInterface } from \"../../entities/interfaces/logger.interface\";\n\n/**\n * This is our Logger concrete class that implements\n * our LoggerInterface contract. This Logger is used\n * throughout our application to log information to\n * console, as long as `debug` is true\n */\nexport class Logger implements LoggerInterface {\n private isDebug: boolean;\n logger: string = 'CORE_LOGGER';\n /**\n * Logger constructor.\n *\n * @param isDebug This is what enables/disables our output messages\n */\n constructor(isDebug: boolean) {\n this.isDebug = isDebug;\n\n }\n\n /**\n * This is the method to output a debug message to console.\n *\n * @param msg The message to output to console\n */\n debug(msg: string) {\n if (this.isDebug) {\n if (typeof console.debug !== \"undefined\") {\n console.debug(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * This is the method to output a warning message to console.\n *\n * @param msg The message to output to console\n */\n warning(msg: string) {\n if (this.isDebug) {\n if (typeof console.warn !== \"undefined\") {\n console.warn(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * Alias for warning() for consistency with console API\n *\n * @param msg The message to output to console\n */\n warn(msg: string) {\n this.warning(msg);\n }\n\n /**\n * This is the method to output an info message to console.\n *\n * @param msg The message to output to console\n */\n info(msg: string) {\n if (this.isDebug) {\n if (typeof console.info !== \"undefined\") {\n console.info(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * This is the method to output an error message to console.\n *\n * @param msg The message to output to console\n */\n error(msg: string) {\n if (this.isDebug) {\n if (typeof console.error !== \"undefined\") {\n console.error(msg);\n } else {\n console.log(msg);\n }\n }\n }\n\n /**\n * Check if debug mode is enabled\n */\n isDebugEnabled(): boolean {\n return this.isDebug;\n }\n}\n","// Runtime configuration interface - these values should be set when instantiating the core package\nexport interface AlviereConfig {\n domain: string;\n access_token: string;\n certificate: {\n id: string;\n public_key: string;\n };\n}\n\n// Default values (can be overridden)\nexport const DEFAULT_CONFIG: AlviereConfig = {\n domain: 'https://api.dev.alviere.com',\n access_token: '',\n certificate: {\n id: '',\n public_key: '',\n },\n};\n\n// Runtime configuration storage\nlet runtimeConfig: AlviereConfig = { ...DEFAULT_CONFIG };\n\n/**\n * Set runtime configuration for the Alviere core package\n * This should be called before using any core services\n */\nexport function setRuntimeConfig(config: Partial<AlviereConfig>): void {\n runtimeConfig = { ...runtimeConfig, ...config };\n}\n\n/**\n * Get current runtime configuration\n */\nexport function getRuntimeConfig(): AlviereConfig {\n return runtimeConfig;\n}\n\n/**\n * Get environment variable value (for development environments)\n */\nfunction getEnvVar(key: string): string | undefined {\n if (typeof window !== 'undefined' && (window as any).VITE_DEBUG) {\n // In browser environment, try to get from VITE_ prefixed variables\n const viteKey = `VITE_${key}`;\n return (window as any)[viteKey];\n }\n return undefined;\n}\n\n/**\n * Initialize configuration from environment variables (development only)\n */\nexport function initializeFromEnvironment(): void {\n // Only initialize if we haven't set runtime config yet\n if (runtimeConfig.domain && runtimeConfig.certificate) {\n return; // Already configured\n }\n\n const envConfig: Partial<AlviereConfig> = {};\n\n // Try to get values from environment variables\n const envDomain = getEnvVar('ALVIERE_DOMAIN');\n const envCertificate = getEnvVar('CERTIFICATE');\n\n if (envDomain) envConfig.domain = envDomain;\n if (envCertificate) {\n try {\n const cert = JSON.parse(envCertificate);\n if (cert && typeof cert.id === 'string' && typeof cert.public_key === 'string') {\n envConfig.certificate = { id: cert.id, public_key: cert.public_key };\n }\n } catch {\n // If parsing fails, ignore and do not set certificate\n }\n }\n\n // Only set if we have meaningful values\n if (envConfig.domain || envConfig.certificate) {\n setRuntimeConfig(envConfig);\n }\n}\n\n// Export individual config getters for backward compatibility\nexport const getALVIERE_DOMAIN = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.domain) {\n initializeFromEnvironment();\n }\n return runtimeConfig.domain;\n};\n\nexport const getRSA_PUB_KEY = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.certificate) {\n initializeFromEnvironment();\n }\n // Clean the RSA key: remove both literal '\\n' strings and actual newline characters\n // The key might come from JSON/env vars as literal '\\n' (backslash + n), not actual newlines\n return runtimeConfig.certificate.public_key\n .replace(/\\\\n/g, '') // Replace literal '\\n' strings (escaped backslash + n in regex)\n .replace(/\\r\\n/g, '') // Replace Windows line endings\n .replace(/\\n/g, '') // Replace actual newline characters\n .replace(/\\r/g, '') // Replace carriage returns\n .trim();\n};\n\nexport const getCERTIFICATE_ID = () => {\n // Auto-initialize from environment if not configured\n if (!runtimeConfig.certificate) {\n initializeFromEnvironment();\n }\n return runtimeConfig.certificate.id;\n};\n\n// export const getFRAUD_PROVIDER_KEY = () => {\n// // Auto-initialize from environment if not configured\n// if (!runtimeConfig.fraudProviderKey) {\n// initializeFromEnvironment();\n// }\n// return runtimeConfig.fraudProviderKey;\n// };\n\n// Legacy exports for backward compatibility (deprecated)\nexport const ALVIERE_DOMAIN = getALVIERE_DOMAIN();\nexport const RSA_PUB_KEY = getRSA_PUB_KEY();\nexport const CERTIFICATE_ID = getCERTIFICATE_ID();\n// export const FRAUD_PROVIDER_KEY = getFRAUD_PROVIDER_KEY();\n\n// Note: AUTH_TOKEN, ACCOUNT_UUID, and SESSION_ID are now extracted from JWT\n// and should not be stored as global constants\n","import { pki } from 'node-forge';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { getRSA_PUB_KEY, getCERTIFICATE_ID } from '../../entities/constants/environment';\nimport { EncryptedRequest } from '../../entities/requests/_alcore';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\n\n/**\n *\n */\nexport class Cryptor implements CryptorInterface {\n /**\n *\n */\n private rsa_key: string;\n\n /**\n *\n */\n private key: Uint8Array;\n\n /**\n *\n */\n private nonce: Uint8Array;\n\n /**\n *\n */\n private logger?: LoggerInterface;\n\n /**\n *\n */\n constructor(logger?: LoggerInterface) {\n this.logger = logger;\n this.rsa_key = getRSA_PUB_KEY();\n this.key = this.generate_key();\n this.nonce = this.generate_nonce();\n this.logger?.debug('🔐 Cryptor initialized');\n }\n\n /**\n *\n * @param data\n * @returns\n */\n async encrypt(data: object): Promise<EncryptedRequest> {\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const alg = { name: 'AES-GCM', iv: this.nonce };\n const crypto_key = await this.import_key();\n const cipher = await crypto.subtle.encrypt(alg, crypto_key, encoded);\n const cipherStr = this.bufferToStr(cipher);\n const cipherB64 = btoa(cipherStr);\n\n const keyStr = this.bufferToStr(this.key);\n const keyB64 = btoa(keyStr);\n const nonceStr = this.bufferToStr(this.nonce);\n const nonceB64 = btoa(nonceStr);\n this.logger?.debug(`🔐 RSA_KEY: ${this.rsa_key.substring(0, 50)}...`);\n const publicKey = pki.publicKeyFromPem(this.rsa_key);\n const keyNonceCipher = publicKey.encrypt(keyB64 + '::' + nonceB64);\n const keyNonceB64 = btoa(keyNonceCipher);\n\n const encrypted_request = {\n p: cipherB64, // base64(AES-GCM(<sdk_envelope>))\n k: keyNonceB64, // base64(RSA(base64(SDK_KEY)::base64(<sdk_nonce>)))\n i: getCERTIFICATE_ID(), // certificate id - configurable via environment variable\n };\n this.logger?.debug(\n `🔐 ENCRYPTED_REQUEST: p=${encrypted_request.p.substring(0, 20)}..., i=${encrypted_request.i}`\n );\n return encrypted_request;\n }\n\n /**\n *\n * @param data\n * @returns\n */\n async decrypt(data: EncryptedResponse): Promise<object> {\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: this.nonce },\n await this.import_key(),\n Uint8Array.from(atob(data.p), c => c.charCodeAt(0))\n );\n const decryptedText = new TextDecoder().decode(decrypted);\n this.logger?.debug(`🔐 DECRYPTED: ${decryptedText}`);\n return JSON.parse(decryptedText);\n }\n\n /**\n *\n * @returns\n */\n private generate_key(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(32));\n }\n\n /**\n *\n * @returns\n */\n private generate_nonce(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(12));\n }\n\n /**\n *\n * @returns\n */\n private async import_key(): Promise<CryptoKey> {\n return await crypto.subtle.importKey('raw', this.key, { name: 'AES-GCM' }, true, [\n 'encrypt',\n 'decrypt',\n ]);\n }\n\n /**\n *\n * @param data\n * @returns\n */\n private async rsa_encrypt(data: string): Promise<string> {\n this.logger?.debug(`🔐 RSA_ENCRYPT: Data to encrypt: ${data.substring(0, 50)}...`);\n this.logger?.debug(`🔐 RSA_KEY: ${this.rsa_key.substring(0, 50)}...`);\n const publicKey = pki.publicKeyFromPem(this.rsa_key);\n return btoa(publicKey.encrypt(data));\n }\n /**\n *\n * @param buf\n */\n private bufferToStr(buf: ArrayBuffer): string {\n const cb = Array.from(new Uint8Array(buf));\n const cs = cb.map(byte => String.fromCharCode(byte)).join('');\n\n return cs;\n }\n}\n","import { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { ValidatorInterface } from '../../entities/interfaces/validator.interface';\n\n/**\n *\n */\nexport class Validator implements ValidatorInterface {\n private logger: LoggerInterface;\n\n /**\n *\n * @param logger\n */\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n /**\n *\n * @param name\n */\n credit_card_name(name: string): string | null {\n this.logger.debug(`🔐 CREDIT_CARD_NAME: ${name}`);\n\n // Add null/undefined check\n if (!name || typeof name !== 'string') {\n return 'Card holder name cannot be empty.';\n }\n\n if (name.trim().length === 0) {\n return 'Card holder name cannot be empty.';\n }\n\n return null;\n }\n\n /**\n *\n * @param number\n */\n credit_card_number(number: string): string | null {\n // Add null/undefined check\n\n if (!number || typeof number !== 'string') {\n return 'Please enter a valid card number.';\n }\n\n // Credit Card Number RegEx\n const visaRegEx = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/;\n const mastercardRegEx = /^(?:5[1-5][0-9]{14})$/;\n const amexpRegEx = /^(?:3[47][0-9]{13})$/;\n const discovRegEx = /^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/;\n\n if (visaRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (mastercardRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (amexpRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n } else if (discovRegEx.test(number.replace(/\\s/g, ''))) {\n return null;\n }\n this.logger.debug('🔐 card number is not a recognized brand');\n return 'Please enter a valid card number.';\n }\n\n /**\n *\n * @param expiry\n */\n credit_card_expiry_date(expiry: string): string | null {\n // Add null/undefined check\n if (!expiry || typeof expiry !== 'string') {\n return 'Expiry date cannot be empty.';\n }\n\n if (expiry.trim().length === 0) {\n return 'Expiry date cannot be empty.';\n }\n\n const expiryRegEx = /^(0[1-9]|1[0-2])\\/?([0-9]{4}|[0-9]{2})$/;\n if (!expiryRegEx.test(expiry)) {\n return 'Please enter a valid expiry date.';\n }\n\n return null;\n }\n\n /**\n *\n * @param code\n */\n credit_card_sec_code(code: string): string | null {\n // Add null/undefined check\n if (!code || typeof code !== 'string') {\n return 'Security code cannot be empty.';\n }\n\n if (code.trim().length === 0) {\n return 'Security code cannot be empty.';\n }\n\n const secCodeRegEx = /^[0-9]{3,4}$/;\n if (!secCodeRegEx.test(code)) {\n return 'Please enter a valid security code.';\n }\n\n return null;\n }\n\n /**\n *\n * @param zip\n */\n credit_card_zip_code(zip: string): string | null {\n // Add null/undefined check\n if (!zip || typeof zip !== 'string') {\n return 'Zip code cannot be empty.';\n }\n\n if (zip.trim().length === 0) {\n return 'Zip code cannot be empty.';\n }\n\n return null;\n }\n\n /**\n *\n * @param pin\n */\n credit_card_pin(pin: string): string | null {\n // Add null/undefined check\n if (!pin || typeof pin !== 'string') {\n return 'PIN cannot be empty.';\n }\n\n if (pin.trim().length === 0) {\n return 'PIN cannot be empty.';\n }\n\n const pinRegEx = /^[0-9]{4}$/;\n if (!pinRegEx.test(pin)) {\n return 'Please enter a valid PIN.';\n }\n\n return null;\n }\n\n /**\n *\n * @param uuid\n */\n is_valid_uuid(uuid: string): string | null {\n // Add null/undefined check\n if (!uuid || typeof uuid !== 'string') {\n return 'UUID cannot be empty.';\n }\n\n if (uuid.trim().length === 0) {\n return 'UUID cannot be empty.';\n }\n\n const uuidRegEx = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n if (!uuidRegEx.test(uuid)) {\n return 'Please enter a valid UUID.';\n }\n\n return null;\n }\n\n /**\n * Validates that a field is not empty or null\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n required(value: string | null | undefined, fieldName?: string): string | null {\n if (\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim().length === 0)\n ) {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n return null;\n }\n\n /**\n * Validates email address format\n * @param email - The email to validate\n */\n email(email: string): string | null {\n if (!email || typeof email !== 'string') {\n return 'Please enter a valid email address.';\n }\n\n const trimmed = email.trim();\n\n // Check for consecutive dots\n if (trimmed.includes('..')) {\n return 'Please enter a valid email address.';\n }\n\n // RFC 5322 compliant email regex (simplified) - requires TLD\n const emailRegEx =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n\n if (!emailRegEx.test(trimmed)) {\n return 'Please enter a valid email address.';\n }\n\n return null;\n }\n\n /**\n * Validates phone number format\n * @param phone - The phone number to validate\n */\n phone(phone: string): string | null {\n if (!phone || typeof phone !== 'string') {\n return 'Please enter a valid phone number.';\n }\n\n // E.164 format: \"+\" followed by 2-15 digits, first digit cannot be 0\n const e164Regex = /^\\+[1-9]\\d{1,14}$/;\n return e164Regex.test(phone.trim()) ? null : 'Please enter a valid phone number.';\n }\n\n /**\n * Validates date format and calendar validity\n * @param date - The date string to validate\n * @param format - The expected date format (default: 'YYYY-MM-DD')\n */\n date(date: string, format: 'YYYY-MM-DD' = 'YYYY-MM-DD'): string | null {\n if (!date || typeof date !== 'string') {\n return 'Please enter a valid date.';\n }\n\n // Validate YYYY-MM-DD format\n const dateRegex = /^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/;\n if (!dateRegex.test(date)) {\n return 'Please enter a valid date in YYYY-MM-DD format';\n }\n\n // Extract year, month, and day for detailed validation\n const [, yearStr, monthStr, dayStr] = date.match(dateRegex) || [];\n const year = parseInt(yearStr);\n const month = parseInt(monthStr);\n const day = parseInt(dayStr);\n\n // Validate actual calendar date\n if (!this.isValidCalendarDate(year, month, day)) {\n return 'Invalid date - this date does not exist';\n }\n\n // Additional validation: check if date is reasonable (not in future, not too far in past)\n const dateObj = new Date(date);\n const now = new Date();\n const minDate = new Date('1900-01-01');\n\n if (dateObj > now) {\n return 'Date cannot be in the future';\n }\n\n if (dateObj < minDate) {\n return 'Date cannot be before 1900';\n }\n\n return null;\n }\n\n /**\n * Helper function to validate calendar dates\n * @param year - The year\n * @param month - The month (1-12)\n * @param day - The day (1-31)\n */\n private isValidCalendarDate(year: number, month: number, day: number): boolean {\n // Create a Date object and check if it's valid\n const date = new Date(year, month - 1, day); // month is 0-indexed in Date constructor\n\n // Check if the date is valid and matches the input values\n // This handles leap years, different month lengths, etc.\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n }\n\n /**\n * Validates minimum length\n * @param value - The value to validate\n * @param minLength - Minimum required length\n * @param fieldName - Optional field name for error message\n */\n min_length(value: string, minLength: number, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (value.length < minLength) {\n return fieldName\n ? `${fieldName} must be at least ${minLength} characters long.`\n : `Must be at least ${minLength} characters long.`;\n }\n\n return null;\n }\n\n /**\n * Validates maximum length\n * @param value - The value to validate\n * @param maxLength - Maximum allowed length\n * @param fieldName - Optional field name for error message\n */\n max_length(value: string, maxLength: number, fieldName?: string): string | null {\n if (value && typeof value === 'string' && value.length > maxLength) {\n return fieldName\n ? `${fieldName} must be no more than ${maxLength} characters long.`\n : `Must be no more than ${maxLength} characters long.`;\n }\n\n return null;\n }\n\n /**\n * Validates against a custom pattern\n * @param value - The value to validate\n * @param pattern - RegExp pattern to match\n * @param errorMessage - Custom error message\n */\n pattern(value: string, pattern: RegExp, errorMessage?: string): string | null {\n if (!value || typeof value !== 'string') {\n return errorMessage || 'Please enter a valid value.';\n }\n\n if (!pattern.test(value)) {\n return errorMessage || 'Please enter a valid value.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only numbers\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n numeric(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^\\d+$/.test(value.trim())) {\n return fieldName ? `${fieldName} must contain only numbers.` : 'Must contain only numbers.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only letters\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n alphabetic(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^[a-zA-Z\\s]+$/.test(value.trim())) {\n return fieldName\n ? `${fieldName} must contain only letters and spaces.`\n : 'Must contain only letters and spaces.';\n }\n\n return null;\n }\n\n /**\n * Validates that a value contains only letters and numbers\n * @param value - The value to validate\n * @param fieldName - Optional field name for error message\n */\n alphanumeric(value: string, fieldName?: string): string | null {\n if (!value || typeof value !== 'string') {\n return fieldName ? `${fieldName} is required.` : 'This field is required.';\n }\n\n if (!/^[a-zA-Z0-9\\s]+$/.test(value.trim())) {\n return fieldName\n ? `${fieldName} must contain only letters, numbers, and spaces.`\n : 'Must contain only letters, numbers, and spaces.';\n }\n\n return null;\n }\n\n /**\n * Validates URL format\n * @param url - The URL to validate\n */\n url(url: string): string | null {\n if (!url || typeof url !== 'string') {\n return 'Please enter a valid URL.';\n }\n\n const trimmed = url.trim();\n\n try {\n const urlObj = new URL(trimmed);\n\n // Additional validation for malformed URLs that URL constructor allows\n if (\n urlObj.hostname === '' ||\n urlObj.hostname.startsWith('.') ||\n urlObj.hostname.endsWith('.')\n ) {\n return 'Please enter a valid URL.';\n }\n\n return null;\n } catch {\n return 'Please enter a valid URL.';\n }\n }\n\n /**\n * Validates postal code based on country\n * @param code - The postal code to validate\n * @param country - Country code (default: US)\n */\n postal_code(code: string, country: string = 'US'): string | null {\n if (!code || typeof code !== 'string') {\n return 'Please enter a valid postal code.';\n }\n\n const cleanCode = code.trim();\n\n switch (country.toUpperCase()) {\n case 'US':\n // US ZIP code: 12345 or 12345-6789\n if (!/^\\d{5}(-\\d{4})?$/.test(cleanCode)) {\n return 'Please enter a valid US ZIP code (e.g., 12345 or 12345-6789).';\n }\n break;\n case 'CA':\n // Canadian postal code: A1A 1A1\n if (!/^[A-Za-z]\\d[A-Za-z] \\d[A-Za-z]\\d$/.test(cleanCode)) {\n return 'Please enter a valid Canadian postal code (e.g., A1A 1A1).';\n }\n break;\n case 'UK':\n case 'GB':\n // UK postal code: SW1A 1AA\n if (!/^[A-Za-z]{1,2}\\d[A-Za-z\\d]?\\s\\d[A-Za-z]{2}$/.test(cleanCode)) {\n return 'Please enter a valid UK postal code (e.g., SW1A 1AA).';\n }\n break;\n default:\n // Generic validation for other countries (3-10 alphanumeric characters)\n if (!/^[A-Za-z0-9\\s-]{3,10}$/.test(cleanCode)) {\n return 'Please enter a valid postal code.';\n }\n }\n\n return null;\n }\n}\n","/**\n * AlcoreApiError - Custom error class for Alcore API errors\n * Preserves error_code and error_description as separate properties\n */\nexport class AlcoreApiError extends Error {\n public readonly errorCode: string;\n public readonly errorDescription: string;\n public readonly statusCode?: number;\n\n constructor(errorCode: string, errorDescription: string, statusCode?: number) {\n super(`Alcore API Error ${errorCode}: ${errorDescription}`);\n this.name = 'AlcoreApiError';\n this.errorCode = errorCode;\n this.errorDescription = errorDescription;\n this.statusCode = statusCode;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AlcoreApiError);\n }\n }\n\n /**\n * Check if error matches a specific error code\n */\n isErrorCode(code: string): boolean {\n return this.errorCode === code;\n }\n\n /**\n * Check if error matches any of the provided error codes\n */\n isAnyErrorCode(codes: string[]): boolean {\n return codes.includes(this.errorCode);\n }\n}\n\n","/**\n * Alcore API Error Codes\n * Centralized mapping of all known error codes from the backend API\n */\nexport const AlcoreErrorCodes = {\n ALVIERE_CORE_NOT_INITIALIZED: '000000',\n // Authentication errors (100xxx)\n UNPROCESSABLE_ENCRYPTED_DATA: '100011',\n WRONG_ENCRYPTED_ENDPOINT: '100012',\n UNDECRYPTABLE_DATA_AT_ENDPOINT: '100013',\n DECRYPTED_DATA_UNUSABLE_AT_ENDPOINT: '100014',\n WRONG_DECRYPTED_ENDPOINT: '100015',\n WRONG_VERSION_OR_ENDPOINT: '100016',\n OPERATION_HALTED: '100017',\n INVALID_REQUEST_PAYLOAD: '100300',\n INVALID_REQUEST_PAYLOAD_FIELD: '100301',\n INVALID_PATH_PARAMETER: '100302',\n INVALID_HEADER: '100303',\n INVALID_QUERY_PARAMETER: '100304',\n INVALID_JWT: '100305',\n AUTH_FAILED: '100306',\n SESSION_NOT_FOUND: '110000',\n PARENT_ACCOUNT_NOT_FOUND: '110001',\n NOT_FOUND: '110002',\n ACCOUNT_TYPE_NOT_SUPPORTED: '110004',\n UNDERLYING_API_ERROR: '115000',\n ACCOUNT_STATUS_NOT_ACTIVE: '115001',\n ACCOUNT_CHILD_FORBIDDEN: '320129',\n PARENT_ACCOUNT_NOT_ALLOWED: '320104',\n BANK_ACCOUNT_PRIMARY_REQUIRES_ACTIVE_STATUS: '340028',\n BANK_ACCOUNT_ALREADY_EXISTS: '340029',\n\n // Add more error codes as you discover them from the API\n} as const;\n\n/**\n * Error code type for type safety\n */\nexport type AlcoreErrorCode = (typeof AlcoreErrorCodes)[keyof typeof AlcoreErrorCodes];\n\n/**\n * Error code descriptions for user-friendly messages\n */\nexport const AlcoreErrorMessages: Record<string, string> = {\n [AlcoreErrorCodes.INVALID_JWT]: 'Invalid authentication token. Please log in again.',\n [AlcoreErrorCodes.AUTH_FAILED]:\n 'Authentication failed. Please check your credentials and try again.',\n [AlcoreErrorCodes.SESSION_NOT_FOUND]: 'Session not found. Please log in again.',\n [AlcoreErrorCodes.PARENT_ACCOUNT_NOT_FOUND]: 'Parent account not found.',\n [AlcoreErrorCodes.NOT_FOUND]: 'Resource not found.',\n [AlcoreErrorCodes.ACCOUNT_TYPE_NOT_SUPPORTED]: 'Account type not supported.',\n [AlcoreErrorCodes.INVALID_REQUEST_PAYLOAD]:\n 'Invalid request payload. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_REQUEST_PAYLOAD_FIELD]:\n 'Invalid request payload field. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_PATH_PARAMETER]:\n 'Invalid path parameter. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_HEADER]: 'Invalid header. Please check your request and try again.',\n [AlcoreErrorCodes.INVALID_QUERY_PARAMETER]:\n 'Invalid query parameter. Please check your request and try again.',\n [AlcoreErrorCodes.UNPROCESSABLE_ENCRYPTED_DATA]:\n 'Unprocessable encrypted data. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_ENCRYPTED_ENDPOINT]:\n 'Wrong encrypted endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.UNDECRYPTABLE_DATA_AT_ENDPOINT]:\n 'Undecryptable data at endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.DECRYPTED_DATA_UNUSABLE_AT_ENDPOINT]:\n 'Decrypted data unusable at endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_DECRYPTED_ENDPOINT]:\n 'Wrong decrypted endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.WRONG_VERSION_OR_ENDPOINT]:\n 'Wrong version or endpoint. Please check your request and try again.',\n [AlcoreErrorCodes.OPERATION_HALTED]: 'Operation halted. Please check your request and try again.',\n [AlcoreErrorCodes.UNDERLYING_API_ERROR]: 'Underlying API Error. ',\n [AlcoreErrorCodes.ACCOUNT_STATUS_NOT_ACTIVE]:\n 'Account status not active. Please check your request and try again.',\n [AlcoreErrorCodes.ACCOUNT_CHILD_FORBIDDEN]:\n \"Used Account can't be used to create a child account.\",\n [AlcoreErrorCodes.PARENT_ACCOUNT_NOT_ALLOWED]:\n 'Parent account not allowed. Please check your request and try again.',\n [AlcoreErrorCodes.BANK_ACCOUNT_PRIMARY_REQUIRES_ACTIVE_STATUS]:\n 'Only ACTIVE bank accounts can be set as primary.',\n [AlcoreErrorCodes.BANK_ACCOUNT_ALREADY_EXISTS]:\n 'This bank account has already been added to your account.',\n};\n\n/**\n * Get user-friendly error message for an error code\n */\nexport function getErrorMessage(errorCode: string): string {\n return AlcoreErrorMessages[errorCode] || 'An unexpected error occurred. Please try again.';\n}\n\n/**\n * Critical error codes that should halt the entire flow/process\n * These errors cannot be recovered from and require user intervention\n */\nexport const CriticalErrorCodes = [\n AlcoreErrorCodes.INVALID_JWT,\n AlcoreErrorCodes.AUTH_FAILED,\n AlcoreErrorCodes.SESSION_NOT_FOUND,\n AlcoreErrorCodes.UNPROCESSABLE_ENCRYPTED_DATA,\n AlcoreErrorCodes.WRONG_ENCRYPTED_ENDPOINT,\n AlcoreErrorCodes.UNDECRYPTABLE_DATA_AT_ENDPOINT,\n AlcoreErrorCodes.OPERATION_HALTED,\n AlcoreErrorCodes.ALVIERE_CORE_NOT_INITIALIZED,\n AlcoreErrorCodes.UNDERLYING_API_ERROR,\n AlcoreErrorCodes.ACCOUNT_STATUS_NOT_ACTIVE,\n AlcoreErrorCodes.ACCOUNT_CHILD_FORBIDDEN,\n AlcoreErrorCodes.PARENT_ACCOUNT_NOT_ALLOWED,\n] as const;\n\n/**\n * Check if an error code is critical (requires flow halt)\n */\nexport function isCriticalError(errorCode: string): boolean {\n return CriticalErrorCodes.includes(errorCode as any);\n}\n","import { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { getALVIERE_DOMAIN } from '../../entities/constants/environment';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { AlcoreApiError } from '../../entities/errors/alcore-api.error';\nimport { AlcoreErrorCodes, getErrorMessage } from '@/entities/constants/error-codes';\n\ntype AlcoreRequest = {\n method: string;\n endpoint: string;\n payload: string;\n};\n\n/**\n *\n */\nexport abstract class AlcoreBase {\n /**\n *\n */\n private readonly jwt: string;\n\n /**\n *\n */\n private cryptor: CryptorInterface;\n\n /**\n *\n */\n private domain: string;\n\n /**\n *\n */\n private endpoint = '/alcore';\n\n /**\n *\n */\n protected logger: LoggerInterface;\n\n /**\n *\n * @param jwt\n * @param cryptor\n * @param logger\n */\n protected constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n this.jwt = jwt;\n this.cryptor = cryptor;\n this.domain = getALVIERE_DOMAIN();\n this.logger = logger;\n this.logger.debug(`🔐 AlcoreBase initialized with domain: ${this.domain}`);\n }\n\n /**\n * send\n */\n protected async send(method: string, endpoint: string, payload: object): Promise<Response> {\n const request: AlcoreRequest = {\n method: method,\n endpoint: endpoint,\n payload: JSON.stringify(payload),\n };\n this.logger.debug('🌐 AlcoreBase: Preparing to send request');\n this.logger.debug('🌐 Method: ' + method);\n this.logger.debug('🌐 Endpoint: ' + endpoint);\n this.logger.debug('🌐 Domain: ' + (this.domain || 'undefined'));\n this.logger.debug('🌐 JWT Token: ' + (this.jwt ? '✅ Present' : '❌ Missing'));\n this.logger.debug('🌐 Payload size: ' + JSON.stringify(payload).length + ' chars');\n this.logger.debug(this.jwt);\n\n this.logger.debug('DATA TO SEND before encrypt');\n this.logger.debug(payload as any);\n\n let encryptedData;\n try {\n encryptedData = await this.cryptor.encrypt(request);\n this.logger.debug('🔐 Encryption successful');\n } catch (encryptError) {\n this.logger.debug(\n '❌ Encryption failed: ' +\n (encryptError instanceof Error ? encryptError.message : 'Unknown error')\n );\n throw encryptError;\n }\n\n this.logger.debug('BASE GATEWAY: posting to ' + this.endpoint);\n this.logger.debug(encryptedData as any);\n\n const url = this.domain + this.endpoint;\n this.logger.debug('🌐 Full URL: ' + url);\n\n try {\n const response = await fetch(url, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + this.jwt,\n Version: '2021-11-18',\n },\n body: JSON.stringify(encryptedData),\n });\n\n this.logger.debug(\n '🌐 Response received - Status: ' + response.status + ' ' + response.statusText\n );\n this.logger.debug('🌐 Response OK: ' + response.ok);\n if (!response.ok) {\n let error = await response.json();\n if (error.p) {\n error = await this.decrypt(error);\n }\n const errorCode =\n response.status === 500 ? AlcoreErrorCodes.UNDERLYING_API_ERROR : error.error_code;\n const errorDescription = error.error_description || getErrorMessage(errorCode);\n\n this.logger.debug(`❌ API Error - Code: ${errorCode}, Description: ${errorDescription}`);\n\n throw new AlcoreApiError(errorCode, errorDescription, response.status);\n }\n return response;\n } catch (fetchError) {\n this.logger.debug(\n '❌ Fetch failed: ' + (fetchError instanceof Error ? fetchError.message : 'Unknown error')\n );\n throw fetchError;\n }\n }\n\n /**\n *\n * @param data\n */\n protected async decrypt(data: EncryptedResponse): Promise<object> {\n return this.cryptor.decrypt(data);\n }\n}\n","/**\n * Removes key/value pairs that are empty string, null or undefined.\n *\n * Note: It's not recursive! It only works on the 1st level of depth.\n *\n * @param data\n * @returns object without null/undefined/empty string values\n */\nexport function getSanitizedBody<T>(data: T) {\n const body = {} as T;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key] as any;\n\n if (!['', null, undefined].includes(value)) {\n body[key] = value;\n }\n }\n }\n\n return body;\n}\n\n/**\n * Throws an Error if the decrypted API response contains error_code or error_description.\n * Returns the response unchanged if no error is present.\n */\nexport function throwIfApiError<T extends object>(decrypted: T): T {\n if (\n decrypted &&\n typeof decrypted === 'object' &&\n ('error_code' in decrypted || 'error_description' in decrypted)\n ) {\n const errorMessage = (decrypted as any).error_description || 'Unknown API error';\n const errorCode = (decrypted as any).error_code || 'UNKNOWN';\n throw new Error(`${errorCode}: ${errorMessage}`);\n }\n return decrypted;\n}\n\n/**\n * JWT utility functions for extracting configuration from JWT tokens\n */\n\nexport interface JWTPayload {\n // Standard JWT claims\n iss?: string; // issuer\n sub?: string; // subject - Account UUID from Sierra API v3\n aud?: string | string[]; // audience - can be string or array\n exp?: number; // expiration time\n iat?: number; // issued at\n\n // Sierra API v3 custom claims\n api_domain?: string; // Alviere API domain\n scope?: string; // token scope\n roles?: {\n account?: string[];\n application?: string[];\n realm?: string[];\n };\n\n // Any other custom claims\n [key: string]: any;\n}\n\n/**\n * Decode JWT payload without verification (for configuration extraction)\n * Note: This is safe for configuration extraction, not for authentication\n */\nexport function decodeJWTPayload(jwt: string): JWTPayload | null {\n try {\n // Split JWT into parts\n const parts = jwt.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode payload (second part)\n const payload = parts[1];\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n\n return JSON.parse(decoded);\n } catch (error) {\n console.warn('Failed to decode JWT payload:', error);\n return null;\n }\n}\n\n/**\n * Extract Alviere configuration from JWT token (Sierra API v3)\n * Extracts api_domain from JWT payload\n */\nexport function extractAlviereConfigFromJWT(jwt: string): Partial<{\n domain: string;\n}> {\n const payload = decodeJWTPayload(jwt);\n if (!payload) {\n return {};\n }\n\n return {\n domain: payload.api_domain || 'https://api.dev.alviere.com',\n };\n}\n\n/**\n * Extract account_uuid from JWT's sub field (Sierra API v3)\n * The 'sub' field contains the authenticated account UUID\n *\n * @param jwt - The JWT token string\n * @returns The account UUID from the sub field, or null if not available\n */\nexport function extractAccountUuidFromJWT(jwt: string): string | null {\n const payload = decodeJWTPayload(jwt);\n if (!payload) {\n return null;\n }\n\n return payload.sub || null;\n}\n\n/**\n * Check if JWT is expired\n */\nexport function isJWTExpired(jwt: string): boolean {\n const payload = decodeJWTPayload(jwt);\n if (!payload || !payload.exp) {\n return true; // Consider expired if no expiration time\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n}\n\n/**\n * Get JWT expiration time as Date object\n */\nexport function getJWTExpiration(jwt: string): Date | null {\n const payload = decodeJWTPayload(jwt);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n","import { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { AddCardRequest } from '../../entities/requests/payments/payments';\nimport { AddCardResponse } from '../../entities/responses/payments/add_card';\nimport {\n AddBankAccountRequest,\n UpdateBankAccountRequest,\n} from '../../entities/requests/payments/bank-accounts';\nimport {\n AddBankAccountResponse,\n GetBankAccountsResponse,\n} from '../../entities/responses/payments/bank_accounts';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { PaymentsGatewayInterface } from '../../entities/interfaces/gateways/payments.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\n/**\n *\n */\nexport class PaymentsGateway extends AlcoreBase implements PaymentsGatewayInterface {\n /**\n *\n * @param jwt\n * @param cryptor\n */\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async add_card(accountUuid: string, data: AddCardRequest): Promise<AddCardResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/cards`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddCardResponse;\n }\n\n async add_bank_account(\n accountUuid: string,\n data: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddBankAccountResponse;\n }\n\n async get_bank_accounts(accountUuid: string): Promise<GetBankAccountsResponse> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as GetBankAccountsResponse;\n }\n\n async delete_bank_account(accountUuid: string, uuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/payment-methods/bank-accounts/${uuid}`;\n const response = await this.send('DELETE', endpoint, {});\n return throwIfApiError(response) as unknown as void;\n }\n\n async update_bank_account(\n accountUuid: string,\n uuid: string,\n data: UpdateBankAccountRequest\n ): Promise<GetBankAccountsResponse> {\n const endpoint = `/payment-methods/bank-accounts/${uuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as GetBankAccountsResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport {\n WalletsGatewayInterface,\n WalletListParams,\n} from '../../entities/interfaces/gateways/wallets.interface';\nimport {\n WalletListResponse,\n WalletResponse,\n WalletTransactionResponse,\n WalletStatementResponse,\n} from '../../entities/responses/wallets/wallets';\nimport {\n LoadFundsRequest,\n WithdrawFundsRequest,\n SendFundsRequest,\n TransferFundsRequest,\n CreditFundsRequest,\n PromoFundsRequest,\n} from '../../entities/requests/wallets/wallets';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class WalletsGateway extends AlcoreBase implements WalletsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async listWallets(accountUuid: string, params?: WalletListParams): Promise<WalletListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/wallets${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as WalletListResponse;\n }\n\n // async getWallet(accountUuid: string, walletUuid: string): Promise<WalletResponse> {\n // throw new Error('getWallet not implemented');\n // }\n async loadFunds(walletUuid: string, data: LoadFundsRequest): Promise<WalletTransactionResponse> {\n const endpoint = `/wallets/${walletUuid}/load`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as WalletTransactionResponse;\n }\n // async withdrawFunds(walletUuid: string, data: WithdrawFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('withdrawFunds not implemented');\n // }\n // async sendFunds(walletUuid: string, data: SendFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('sendFunds not implemented');\n // }\n // async transferFunds(walletUuid: string, data: TransferFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('transferFunds not implemented');\n // }\n // async creditFunds(walletUuid: string, data: CreditFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('creditFunds not implemented');\n // }\n // async creditPromoFunds(walletUuid: string, data: PromoFundsRequest): Promise<WalletTransactionResponse> {\n // throw new Error('creditPromoFunds not implemented');\n // }\n // async getWalletStatement(walletUuid: string, monthYear: string, scope?: 'DEBITS' | 'CREDITS' | 'FEES' | 'ALL'): Promise<WalletStatementResponse> {\n // throw new Error('getWalletStatement not implemented');\n // }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport { PaymentInstrumentsGatewayInterface, CardListParams } from '../../entities/interfaces/gateways/payment-instruments.interface';\nimport { PaymentInstrumentRequest, DebitFundsRequest } from '../../entities/requests/payments/payment-instruments';\nimport { PaymentInstrumentResponse, DebitFundsResponse, CardListResponse } from '../../entities/responses/payments/payment-instruments';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class PaymentInstrumentsGateway extends AlcoreBase implements PaymentInstrumentsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n }\n\n async createPaymentInstrument(data: PaymentInstrumentRequest): Promise<PaymentInstrumentResponse> {\n const endpoint = '/payments/payment-instruments';\n const response = await this.send('POST', endpoint, data);\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as PaymentInstrumentResponse;\n }\n\n async getPaymentInstrument(paymentInstrumentUuid: string): Promise<PaymentInstrumentResponse> {\n const endpoint = `/payments/payment-instruments/${paymentInstrumentUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as PaymentInstrumentResponse;\n }\n\n async deletePaymentInstrument(paymentInstrumentUuid: string): Promise<void> {\n const endpoint = `/payments/payment-instruments/${paymentInstrumentUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async debitFunds(data: DebitFundsRequest): Promise<DebitFundsResponse> {\n const endpoint = '/payments/debit';\n const response = await this.send('POST', endpoint, data);\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DebitFundsResponse;\n }\n\n async listCards(accountUuid: string, params?: CardListParams): Promise<CardListResponse> {\n const query = params\n ? '?' + new URLSearchParams(Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][])\n : '';\n const endpoint = `/accounts/${accountUuid}/payment-methods/cards${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = await response.json() as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as CardListResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport {\n AccountsGatewayInterface,\n AccountListParams,\n AddressListParams,\n DossierListParams,\n OnboardingAction,\n} from '../../entities/interfaces/gateways/accounts.interface';\nimport {\n AccountRequest,\n AccountUpdateRequest,\n AddressRequest,\n AddressUpdateRequest,\n} from '../../entities/requests/accounts/accounts';\nimport {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from '../../entities/requests/accounts/dossiers';\nimport {\n AccountResponse,\n AccountListResponse,\n AddressResponse,\n AddressListResponse,\n} from '../../entities/responses/accounts/accounts';\nimport { DossierResponse, DossierListResponse } from '../../entities/responses/dossiers/dossiers';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { EncryptedResponse } from '../../entities/responses/alcore';\nimport { throwIfApiError } from '../../entities/requests/utility';\n\nexport class AccountsGateway extends AlcoreBase implements AccountsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 AccountsGateway initialized');\n }\n\n async createAccount(data: AccountRequest): Promise<AccountResponse> {\n const endpoint = '/accounts';\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async getAccount(accountUuid: string): Promise<AccountResponse> {\n const endpoint = `/accounts/${accountUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async updateAccount(accountUuid: string, data: AccountUpdateRequest): Promise<AccountResponse> {\n const endpoint = `/accounts/${accountUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountResponse;\n }\n\n async deleteAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async listAccounts(params?: AccountListParams): Promise<AccountListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AccountListResponse;\n }\n\n async activateAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/activate`;\n await this.send('POST', endpoint, {});\n }\n\n async deactivateAccount(accountUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/deactivate`;\n await this.send('POST', endpoint, {});\n }\n\n async manageOnboarding(accountUuid: string, action: OnboardingAction): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/onboarding`;\n await this.send('PUT', endpoint, { action });\n }\n\n async createAddress(accountUuid: string, data: AddressRequest): Promise<AddressResponse> {\n const endpoint = `/accounts/${accountUuid}/addresses`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressResponse;\n }\n\n async getAddresses(\n accountUuid: string,\n params?: AddressListParams\n ): Promise<AddressListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/addresses${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressListResponse;\n }\n\n async updateAddress(\n accountUuid: string,\n addressUuid: string,\n data: AddressUpdateRequest\n ): Promise<AddressResponse> {\n const endpoint = `/accounts/${accountUuid}/addresses/${addressUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as AddressResponse;\n }\n\n async deleteAddress(accountUuid: string, addressUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/addresses/${addressUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n\n async createDossier(accountUuid: string, data: DossierRequest): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers`;\n const response = await this.send('POST', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async getDossiers(accountUuid: string, params?: DossierListParams): Promise<DossierListResponse> {\n const query = params\n ? '?' +\n new URLSearchParams(\n Object.entries(params).filter(([_, v]) => v !== undefined) as [string, string][]\n )\n : '';\n const endpoint = `/accounts/${accountUuid}/dossiers${query}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierListResponse;\n }\n\n async getDossier(accountUuid: string, dossierUuid: string): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async updateDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierUpdateRequest\n ): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('PUT', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async replaceDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierReplaceRequest\n ): Promise<DossierResponse> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n const response = await this.send('PATCH', endpoint, data);\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as DossierResponse;\n }\n\n async deleteDossier(accountUuid: string, dossierUuid: string): Promise<void> {\n const endpoint = `/accounts/${accountUuid}/dossiers/${dossierUuid}`;\n await this.send('DELETE', endpoint, {});\n }\n}\n","import { LoggerInterface } from '../../entities/interfaces/logger.interface';\nimport { CryptorInterface } from '../../entities/interfaces/cryptor.interface';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { GenerateScopedTokenRequest } from '../../entities/requests/auth/auth';\nimport { ScopedTokenResponse } from '../../entities/responses/auth/auth';\n\n/**\n * Auth Gateway - Handles authentication operations\n * Extends AlcoreBase to follow the same pattern as other gateways\n */\nexport class AuthGateway extends AlcoreBase {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug(`🔐 AuthGateway initialized`);\n }\n\n /**\n * Generate scoped JWT for specific account (JWT downgrade)\n * Exchanges business-level JWT for consumer-level JWT\n * Uses AlcoreBase.send() to follow the same pattern as all other gateways:\n * - Endpoint passed in encrypted payload\n * - Request sent to /alcore (not /alcore/v3/auth)\n * - Middleware handles routing\n *\n * @param data - Request containing account_uuid to scope to\n * @returns New scoped JWT token\n */\n async generateScopedToken(data: GenerateScopedTokenRequest): Promise<ScopedTokenResponse> {\n this.logger.debug('🔐 AuthGateway: Generating scoped token');\n this.logger.debug('🌐 Endpoint: /v3/auth');\n this.logger.debug('🌐 Account UUID: ' + data.account_uuid);\n\n // Use inherited send() method from AlcoreBase\n // This encrypts the payload and sends to /alcore with endpoint in the payload\n const response = await this.send('POST', '/v3/auth', data);\n\n // Decrypt the response\n const decryptedResponse = await this.decrypt(await response.json());\n\n this.logger.debug('✅ Scoped token generated successfully');\n\n return decryptedResponse as ScopedTokenResponse;\n }\n}\n\n","import { LoadFundsRequest } from '@/entities/requests/wallets/wallets';\nimport { WalletsGatewayInterface, WalletListParams } from '../entities/interfaces/gateways/wallets.interface';\nimport { WalletListResponse, WalletTransactionResponse } from '../entities/responses/wallets/wallets';\n\nexport class WalletsApiService {\n constructor(private gateway: WalletsGatewayInterface) {}\n\n async listWallets(accountUuid: string, params?: WalletListParams): Promise<WalletListResponse> {\n return this.gateway.listWallets(accountUuid, params);\n }\n async loadFunds(walletUuid: string, params: LoadFundsRequest): Promise<WalletTransactionResponse> {\n return this.gateway.loadFunds(walletUuid, params)\n }\n}\n","import { PaymentInstrumentsGatewayInterface, CardListParams } from '../entities/interfaces/gateways/payment-instruments.interface';\nimport { PaymentInstrumentRequest, DebitFundsRequest } from '../entities/requests/payments/payment-instruments';\nimport { PaymentInstrumentResponse, DebitFundsResponse, CardListResponse } from '../entities/responses/payments/payment-instruments';\n\nexport class PaymentInstrumentsApiService {\n constructor(private gateway: PaymentInstrumentsGatewayInterface) {}\n\n async createPaymentInstrument(data: PaymentInstrumentRequest): Promise<PaymentInstrumentResponse> {\n return this.gateway.createPaymentInstrument(data);\n }\n\n async getPaymentInstrument(paymentInstrumentUuid: string): Promise<PaymentInstrumentResponse> {\n return this.gateway.getPaymentInstrument(paymentInstrumentUuid);\n }\n\n async deletePaymentInstrument(paymentInstrumentUuid: string): Promise<void> {\n return this.gateway.deletePaymentInstrument(paymentInstrumentUuid);\n }\n\n async debitFunds(data: DebitFundsRequest): Promise<DebitFundsResponse> {\n return this.gateway.debitFunds(data);\n }\n\n async listCards(accountUuid: string, params?: CardListParams): Promise<CardListResponse> {\n return this.gateway.listCards(accountUuid, params);\n }\n}\n","import {\n AccountsGatewayInterface,\n AccountListParams,\n AddressListParams,\n DossierListParams,\n OnboardingAction,\n} from '../entities/interfaces/gateways/accounts.interface';\nimport {\n AccountRequest,\n AccountUpdateRequest,\n AddressRequest,\n AddressUpdateRequest,\n} from '../entities/requests/accounts/accounts';\nimport {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from '../entities/requests/accounts/dossiers';\nimport {\n AccountResponse,\n AccountListResponse,\n AddressResponse,\n AddressListResponse,\n} from '../entities/responses/accounts/accounts';\nimport { DossierResponse, DossierListResponse } from '../entities/responses/dossiers/dossiers';\n\nexport class AccountsApiService {\n constructor(private gateway: AccountsGatewayInterface) {}\n\n async createAccount(data: AccountRequest): Promise<AccountResponse> {\n return this.gateway.createAccount(data);\n }\n\n async getAccount(accountUuid: string): Promise<AccountResponse> {\n return this.gateway.getAccount(accountUuid);\n }\n\n async updateAccount(accountUuid: string, data: AccountUpdateRequest): Promise<AccountResponse> {\n return this.gateway.updateAccount(accountUuid, data);\n }\n\n async deleteAccount(accountUuid: string): Promise<void> {\n return this.gateway.deleteAccount(accountUuid);\n }\n\n async listAccounts(params?: AccountListParams): Promise<AccountListResponse> {\n return this.gateway.listAccounts(params);\n }\n\n async activateAccount(accountUuid: string): Promise<void> {\n return this.gateway.activateAccount(accountUuid);\n }\n\n async deactivateAccount(accountUuid: string): Promise<void> {\n return this.gateway.deactivateAccount(accountUuid);\n }\n\n async manageOnboarding(accountUuid: string, action: OnboardingAction): Promise<void> {\n return this.gateway.manageOnboarding(accountUuid, action);\n }\n\n async createAddress(accountUuid: string, data: AddressRequest): Promise<AddressResponse> {\n return this.gateway.createAddress(accountUuid, data);\n }\n\n async getAddresses(\n accountUuid: string,\n params?: AddressListParams\n ): Promise<AddressListResponse> {\n return this.gateway.getAddresses(accountUuid, params);\n }\n\n async updateAddress(\n accountUuid: string,\n addressUuid: string,\n data: AddressUpdateRequest\n ): Promise<AddressResponse> {\n return this.gateway.updateAddress(accountUuid, addressUuid, data);\n }\n\n async deleteAddress(accountUuid: string, addressUuid: string): Promise<void> {\n return this.gateway.deleteAddress(accountUuid, addressUuid);\n }\n\n async createDossier(accountUuid: string, data: DossierRequest): Promise<DossierResponse> {\n return this.gateway.createDossier(accountUuid, data);\n }\n\n async getDossiers(accountUuid: string, params?: DossierListParams): Promise<DossierListResponse> {\n return this.gateway.getDossiers(accountUuid, params);\n }\n\n async getDossier(accountUuid: string, dossierUuid: string): Promise<DossierResponse> {\n return this.gateway.getDossier(accountUuid, dossierUuid);\n }\n\n async updateDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierUpdateRequest\n ): Promise<DossierResponse> {\n return this.gateway.updateDossier(accountUuid, dossierUuid, data);\n }\n\n async replaceDossier(\n accountUuid: string,\n dossierUuid: string,\n data: DossierReplaceRequest\n ): Promise<DossierResponse> {\n return this.gateway.replaceDossier(accountUuid, dossierUuid, data);\n }\n\n async deleteDossier(accountUuid: string, dossierUuid: string): Promise<void> {\n return this.gateway.deleteDossier(accountUuid, dossierUuid);\n }\n}\n","import type { PaymentsGatewayInterface } from '../entities/interfaces/gateways/payments.interface';\nimport type { LoggerInterface } from '../entities/interfaces/logger.interface';\nimport { AddCardRequest } from '../entities/requests/payments/payments';\nimport { AddCardResponse } from '../entities/responses/payments/add_card';\nimport {\n AddBankAccountRequest,\n UpdateBankAccountRequest,\n} from '../entities/requests/payments/bank-accounts';\nimport {\n AddBankAccountResponse,\n GetBankAccountsResponse,\n} from '../entities/responses/payments/bank_accounts';\nimport { stringify } from 'querystring';\n\n/**\n * PaymentProcessor handles the core payment processing logic.\n * It extracts payment processing logic that was previously embedded in the binder service\n * and makes it reusable for both iframe and headless modes.\n */\nexport class PaymentProcessor {\n constructor(\n private gateway: PaymentsGatewayInterface,\n private logger: LoggerInterface\n ) {}\n\n /**\n * Process an add card request through the gateway\n */\n async processAddCard(accountUuid: string, request: AddCardRequest): Promise<AddCardResponse> {\n this.logger.debug('PaymentProcessor: Starting add card processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n\n try {\n // Call the gateway to process the payment\n const result = await this.gateway.add_card(accountUuid, request);\n\n this.logger.debug('PaymentProcessor: Add card processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Add card processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n /**\n * Validate that a request has all required fields before processing\n */\n validateRequest(request: AddCardRequest): void {\n const requiredFields: (keyof AddCardRequest)[] = [\n 'external_id',\n 'pan',\n 'exp_year',\n 'exp_month',\n 'postal_code',\n 'security_code',\n ];\n\n for (const field of requiredFields) {\n if (!request[field]) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n\n this.logger.debug('PaymentProcessor: Request validation passed');\n }\n\n /**\n * Process payment with pre-validation\n */\n async processAddCardWithValidation(\n accountUuid: string,\n request: AddCardRequest\n ): Promise<AddCardResponse> {\n this.logger.debug('PaymentProcessor: Starting add card processing with validation');\n\n // Validate request first\n this.validateRequest(request);\n\n // Process the payment\n return await this.processAddCard(accountUuid, request);\n }\n\n /**\n * Process an add bank account request through the gateway\n */\n async processAddBankAccount(\n accountUuid: string,\n request: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n this.logger.debug('PaymentProcessor: Starting add bank account processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n\n try {\n // Call the gateway to process the bank account addition\n const result = await this.gateway.add_bank_account(accountUuid, request);\n\n this.logger.debug('PaymentProcessor: Add bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Add bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n /**\n * Validate that a bank account request has all required fields before processing\n */\n validateBankAccountRequest(request: AddBankAccountRequest): void {\n const requiredFields: (keyof AddBankAccountRequest)[] = [\n 'external_id',\n 'country',\n 'currency',\n 'bank_account_details',\n ];\n\n for (const field of requiredFields) {\n if (!request[field]) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n\n this.logger.debug('PaymentProcessor: Bank account request validation passed');\n }\n\n /**\n * Process bank account addition with pre-validation\n */\n async processAddBankAccountWithValidation(\n accountUuid: string,\n request: AddBankAccountRequest\n ): Promise<AddBankAccountResponse> {\n this.logger.debug('PaymentProcessor: Starting add bank account processing with validation');\n\n // Validate request first\n this.validateBankAccountRequest(request);\n\n // Process the bank account addition\n return await this.processAddBankAccount(accountUuid, request);\n }\n\n async processGetBankAccounts(accountUuid: string): Promise<GetBankAccountsResponse> {\n this.logger.debug('PaymentProcessor: Starting get bank accounts processing');\n try {\n const result = await this.gateway.get_bank_accounts(accountUuid);\n this.logger.debug('PaymentProcessor: Get bank accounts processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Get bank accounts processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n async processDeleteBankAccount(accountUuid: string, uuid: string): Promise<void> {\n this.logger.debug('PaymentProcessor: Starting delete bank account processing');\n try {\n const result = await this.gateway.delete_bank_account(accountUuid, uuid);\n this.logger.debug('PaymentProcessor: Delete bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Delete bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n\n async processUpdateBankAccount(\n accountUuid: string,\n uuid: string,\n request: UpdateBankAccountRequest\n ): Promise<GetBankAccountsResponse> {\n this.logger.debug('PaymentProcessor: Starting update bank account processing');\n this.logger.debug('PaymentProcessor: Request data: ' + JSON.stringify(request, null, 2));\n try {\n const result = await this.gateway.update_bank_account(accountUuid, uuid, request);\n this.logger.debug('PaymentProcessor: Update bank account processing completed successfully');\n return result;\n } catch (error) {\n this.logger.debug('PaymentProcessor: Update bank account processing failed');\n this.logger.debug('PaymentProcessor: Error details: ' + JSON.stringify(error));\n throw error;\n }\n }\n}\n","import { BankInfoResponse } from '../entities/responses/bank-info/bank-info';\nimport { BankInfoGatewayInterface } from '@/entities/interfaces/gateways/bank-info.interface';\n\nexport class BankInfoApiService {\n constructor(private gateway: BankInfoGatewayInterface) {}\n\n async getBankInfo(routingNumber: string): Promise<BankInfoResponse> {\n return this.gateway.getBankInfo(routingNumber);\n }\n}\n","import { LegalTextsResponse } from '../entities/responses/legal-texts/legal-texts';\nimport { LegalTextsGatewayInterface } from '@/entities/interfaces/gateways/legal-texts.interface';\n\nexport class LegalTextsApiService {\n constructor(private gateway: LegalTextsGatewayInterface) {}\n\n async getLegalTexts(type: string, version?: string): Promise<LegalTextsResponse> {\n return this.gateway.getLegalTexts(type, version);\n }\n}\n","import { BankInfoGatewayInterface } from '@/entities/interfaces/gateways/bank-info.interface';\nimport { AlcoreBase } from './alcore-base.gateway';\nimport { BankInfoResponse } from '@/entities/responses/bank-info/bank-info';\nimport { EncryptedResponse } from '@/entities/responses/alcore';\nimport { throwIfApiError } from '@/entities/requests/utility';\nimport { LoggerInterface } from '@/entities/interfaces/logger.interface';\nimport { CryptorInterface } from '@/entities/interfaces/cryptor.interface';\n\nexport class BankInfoGateway extends AlcoreBase implements BankInfoGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 BankInfoGateway initialized');\n }\n\n async getBankInfo(routingNumber: string): Promise<BankInfoResponse> {\n const endpoint = `/v3/bank-info?routing_number=${routingNumber}`;\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as BankInfoResponse;\n }\n}\n","import { AlcoreBase } from './alcore-base.gateway';\nimport { LegalTextsGatewayInterface } from '@/entities/interfaces/gateways/legal-texts.interface';\nimport { LegalTextsResponse } from '@/entities/responses/legal-texts/legal-texts';\nimport { EncryptedResponse } from '@/entities/responses/alcore';\nimport { throwIfApiError } from '@/entities/requests/utility';\nimport { LoggerInterface } from '@/entities/interfaces/logger.interface';\nimport { CryptorInterface } from '@/entities/interfaces/cryptor.interface';\n\nexport class LegalTextsGateway extends AlcoreBase implements LegalTextsGatewayInterface {\n constructor(jwt: string, cryptor: CryptorInterface, logger: LoggerInterface) {\n super(jwt, cryptor, logger);\n this.logger.debug('🔐 LegalTextsGateway initialized');\n }\n\n async getLegalTexts(type: string, version?: string): Promise<LegalTextsResponse> {\n const queryParams = new URLSearchParams({ type });\n if (version) {\n queryParams.set('version', version);\n }\n const endpoint = `/v3/legal-texts?${queryParams.toString()}`;\n this.logger.debug(`endpoint -> ${endpoint}`);\n const response = await this.send('GET', endpoint, {});\n const encrypted = (await response.json()) as EncryptedResponse;\n const decrypted = await this.decrypt(encrypted);\n return throwIfApiError(decrypted) as LegalTextsResponse;\n }\n}\n","import { getSanitizedBody } from '../utility';\n\n/**\n *\n */\nexport type AddCardRequest = {\n external_id: string;\n pan: string;\n exp_year: string;\n exp_month: string;\n postal_code: string;\n security_code: string;\n name_on_card?: string;\n};\n\ninterface NewAddCardRequestParams {\n external_id: string;\n name?: string;\n pan: string;\n expiry: string;\n code: string;\n zip: string;\n}\nexport function NewAddCardRequest(\n params: NewAddCardRequestParams,\n): AddCardRequest {\n const { external_id, name, pan, expiry, code, zip } = params;\n\n const expiryParts = expiry.split('/');\n const month = expiryParts[0];\n const year = expiryParts[1];\n\n let data: AddCardRequest = {\n external_id: external_id,\n pan: pan,\n exp_year: year,\n exp_month: month,\n security_code: code,\n postal_code: zip,\n name_on_card: name,\n };\n\n data = getSanitizedBody(data);\n\n return data;\n}\n","// Card instrument request structure\nexport interface CardInstrumentRequest {\n pan: string;\n exp_month: string;\n exp_year: string;\n security_code: string;\n name_on_card: string;\n phone_number?: string;\n email_address?: string;\n billing_address: {\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n };\n}\n\n// Payment instrument details union type\nexport interface PaymentInstrumentDetails {\n card: CardInstrumentRequest;\n}\n\n// Main payment instrument request\nexport interface PaymentInstrumentRequest {\n account_uuid: string;\n external_id?: string;\n payment_instrument_type: 'CARD';\n payment_instrument_details: PaymentInstrumentDetails;\n metadata?: string;\n}\n\n// Payment instrument for adhoc debit requests\nexport interface PaymentInstrumentAdhoc {\n payment_instrument_type: 'CARD';\n payment_instrument_details: PaymentInstrumentDetails;\n}\n\n// Merchant details for debit requests\nexport interface MerchantDetails {\n name: string; // required\n merchant_id: string; // required\n address?: {\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n };\n email_address?: string;\n phone_number?: string;\n url?: string;\n}\n\n// 3DS options for debit requests\nexport interface ThreeDSOptions {\n '3ds_preference'?: 'DISABLED' | 'ENABLED' | 'DOWNGRADE_ALLOWED';\n}\n\n// Debit funds request\nexport interface DebitFundsRequest {\n wallet_uuid: string;\n external_id: string;\n amount: number;\n currency: string;\n auth_type: 'AUTHCAP';\n payment_instrument_uuid?: string;\n payment_instrument?: PaymentInstrumentAdhoc;\n description?: string;\n merchant_details: MerchantDetails; // now required\n '3ds_options'?: ThreeDSOptions;\n metadata?: object;\n}\n\n// Factory functions for creating new requests\nexport function NewPaymentInstrumentRequest(\n accountUuid: string,\n paymentInstrumentType: 'CARD',\n cardDetails: CardInstrumentRequest,\n externalId?: string,\n metadata?: string\n): PaymentInstrumentRequest {\n return {\n account_uuid: accountUuid,\n external_id: externalId,\n payment_instrument_type: paymentInstrumentType,\n payment_instrument_details: {\n card: cardDetails\n },\n metadata\n };\n}\n\n// Helper function to create card details from form data\nexport function NewCardInstrumentFromForm(\n pan: string,\n expiry: string, // MM/YY format\n securityCode: string,\n nameOnCard: string,\n addressLine1: string,\n city: string,\n state: string,\n postal_code: string,\n country: string,\n addressLine2?: string,\n phoneNumber?: string,\n emailAddress?: string\n): CardInstrumentRequest {\n // Parse expiry date\n const expiryParts = expiry.split('/');\n const exp_month = expiryParts[0];\n const exp_year = expiryParts[1];\n\n return {\n pan: pan.replace(/\\s/g, ''), // Remove spaces\n exp_month,\n exp_year,\n security_code: securityCode,\n name_on_card: nameOnCard,\n phone_number: phoneNumber,\n email_address: emailAddress,\n billing_address: {\n line_1: addressLine1,\n line_2: addressLine2,\n city,\n state,\n postal_code,\n country\n }\n };\n}\n\nexport function NewDebitFundsRequest(\n walletUuid: string,\n externalId: string,\n amount: number,\n currency: string,\n merchantDetails: MerchantDetails,\n authType: 'AUTHCAP' = 'AUTHCAP',\n paymentInstrumentUuid?: string,\n paymentInstrument?: PaymentInstrumentAdhoc,\n description?: string,\n threeDSOptions?: ThreeDSOptions,\n metadata?: object\n): DebitFundsRequest {\n return {\n wallet_uuid: walletUuid,\n external_id: externalId,\n amount,\n currency,\n auth_type: authType,\n payment_instrument_uuid: paymentInstrumentUuid,\n payment_instrument: paymentInstrument,\n description,\n merchant_details: merchantDetails,\n '3ds_options': threeDSOptions,\n metadata\n };\n}\n\n// Helper function to create default merchant details for demos\nexport function createDefaultMerchantDetails(): MerchantDetails {\n return {\n name: \"Demo Merchant Store\",\n merchant_id: \"DEMO_MERCHANT_001\"\n };\n}\n","import { getSanitizedBody } from '../utility';\n\n// Bank account details interfaces\nexport type AchDetailsRequest = {\n routing_number: string;\n account_number: string;\n type?: 'CHECKING' | 'SAVINGS' | 'GENERAL_LEDGER' | 'LOAN';\n};\n\nexport type EftDetailsRequest = {\n institution_number: string;\n transit_number: string;\n account_number: string;\n};\n\nexport type SwiftDetailsRequest = {\n swift_code: string;\n account_number: string;\n};\n\nexport type ClabeDetailsRequest = {\n swift_code: string;\n account_number: string;\n};\n\nexport type IbanDetailsRequest = {\n iban: string;\n};\n\nexport type BankAccountDetailsRequest = {\n ach_details?: AchDetailsRequest;\n eft_details?: EftDetailsRequest;\n swift_details?: SwiftDetailsRequest;\n clabe_details?: ClabeDetailsRequest;\n iban_details?: IbanDetailsRequest;\n};\n\n/**\n * Bank account request interface\n */\nexport type AddBankAccountRequest = {\n external_id: string;\n country: string;\n currency: string;\n bank_account_details: BankAccountDetailsRequest;\n primary?: boolean;\n metadata?: object;\n};\n\nexport type UpdateBankAccountRequest = {\n external_id?: string;\n metadata?: object;\n primary?: boolean;\n};\n\ninterface NewAddBankAccountRequestParams {\n external_id: string;\n country: string;\n currency: string;\n bank_account_details: BankAccountDetailsRequest;\n primary?: boolean;\n metadata?: object;\n}\n\nexport function NewAddBankAccountRequest(\n params: NewAddBankAccountRequestParams\n): AddBankAccountRequest {\n const { external_id, country, currency, bank_account_details, primary, metadata } = params;\n\n let data: AddBankAccountRequest = {\n external_id,\n country,\n currency,\n bank_account_details,\n primary,\n metadata,\n };\n\n data = getSanitizedBody(data);\n\n return data;\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface ServiceFeeTransaction {\n utx_uuid: string;\n amount: number;\n currency: string;\n description: string;\n}\n\nexport interface TransactionOptions {\n payment_options?: {\n ACH_type?: 'SAME_DAY' | 'NEXT_DAY';\n prefund?: boolean;\n };\n}\n\nexport interface LoadFundsRequest {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}\n\nexport interface WithdrawFundsRequest {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}\n\nexport interface SendFundsRequest {\n destination_wallet_uuid: string;\n external_id: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface TransferFundsRequest {\n beneficiary_uuid: string;\n payout_method_uuid?: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n external_id: string;\n metadata?: Record<string, any>;\n}\n\nexport interface CreditFundsRequest {\n amount: number;\n currency: string;\n external_id: string;\n vault_name?: 'OPERATIONS';\n metadata?: Record<string, any>;\n}\n\nexport interface PromoFundsRequest {\n amount: number;\n external_id: string;\n description?: string;\n metadata?: Record<string, any>;\n}\n\n// Factory functions\nexport function NewLoadFundsRequest(params: {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}): LoadFundsRequest {\n const data: LoadFundsRequest = {\n payment_method_uuid: params.payment_method_uuid,\n amount: params.amount,\n external_id: params.external_id,\n service_fees: params.service_fees,\n transaction_options: params.transaction_options,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewWithdrawFundsRequest(params: {\n payment_method_uuid: string;\n amount: number;\n external_id: string;\n service_fees?: ServiceFeeTransaction[];\n transaction_options?: TransactionOptions;\n metadata?: Record<string, any>;\n}): WithdrawFundsRequest {\n const data: WithdrawFundsRequest = {\n payment_method_uuid: params.payment_method_uuid,\n amount: params.amount,\n external_id: params.external_id,\n service_fees: params.service_fees,\n transaction_options: params.transaction_options,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewSendFundsRequest(params: {\n destination_wallet_uuid: string;\n external_id: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n metadata?: Record<string, any>;\n}): SendFundsRequest {\n const data: SendFundsRequest = {\n destination_wallet_uuid: params.destination_wallet_uuid,\n external_id: params.external_id,\n amount: params.amount,\n service_fees: params.service_fees,\n description: params.description,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewTransferFundsRequest(params: {\n beneficiary_uuid: string;\n payout_method_uuid?: string;\n amount: number;\n service_fees?: ServiceFeeTransaction[];\n description?: string;\n external_id: string;\n metadata?: Record<string, any>;\n}): TransferFundsRequest {\n const data: TransferFundsRequest = {\n beneficiary_uuid: params.beneficiary_uuid,\n payout_method_uuid: params.payout_method_uuid,\n amount: params.amount,\n service_fees: params.service_fees,\n description: params.description,\n external_id: params.external_id,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewCreditFundsRequest(params: {\n amount: number;\n currency: string;\n external_id: string;\n vault_name?: 'OPERATIONS';\n metadata?: Record<string, any>;\n}): CreditFundsRequest {\n const data: CreditFundsRequest = {\n amount: params.amount,\n currency: params.currency,\n external_id: params.external_id,\n vault_name: params.vault_name,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewPromoFundsRequest(params: {\n amount: number;\n external_id: string;\n description?: string;\n metadata?: Record<string, any>;\n}): PromoFundsRequest {\n const data: PromoFundsRequest = {\n amount: params.amount,\n external_id: params.external_id,\n description: params.description,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n","import { getSanitizedBody } from '../utility';\n\n// Employment status types\nexport type EmploymentStatus =\n | 'FULL_TIME'\n | 'PART_TIME'\n | 'SELF_EMPLOYED'\n | 'FREELANCER'\n | 'UNEMPLOYED'\n | 'STUDENT'\n | 'RETIRED';\n\n// Business types\nexport type BusinessType =\n | 'SOLE_PROPRIETORSHIP'\n | 'LLC'\n | 'LLP'\n | 'CORPORATION_C'\n | 'CORPORATION_S';\n\n// Account purpose types\nexport type AccountPurpose = 'GENERAL_USE' | 'PAYROLL' | 'TAXES' | 'MERCHANT_SERVICES' | 'OTHER';\n\n// Source of funds types\nexport type SourceOfFunds =\n | 'SERVICES_PRODUCTS'\n | 'ESTATE'\n | 'HOLDING_COMPANY'\n | 'INVESTMENTS'\n | 'LOANS'\n | 'PARNET_COMPANY'\n | 'SUBSIDIARY'\n | 'TRUST';\n\n// Profession types\nexport type Profession =\n | 'ACCOUNTANT'\n | 'ACTOR'\n | 'ADMINISTRATIVE_ASSISTANT'\n | 'ANALYST'\n | 'ARCHITECT'\n | 'ARTIST'\n | 'CARPENTER'\n | 'CASHIER'\n | 'CHILDCARE'\n | 'COOK'\n | 'CLEANER'\n | 'COACH'\n | 'CONSTRUCTION_WORKER'\n | 'CONSULTANT'\n | 'CONTENT_CREATOR'\n | 'COUNSELOR'\n | 'CUSTOMER_SERVICE'\n | 'DATA_ENTRY'\n | 'DESIGNER'\n | 'DENTIST'\n | 'DEVELOPER'\n | 'DIETITIAN'\n | 'DOCTOR'\n | 'DRIVER'\n | 'EDITOR'\n | 'ELECTRICIAN'\n | 'ENGINEER'\n | 'ESTHETICIAN'\n | 'EXECUTIVE'\n | 'EXECUTIVE_ASSISTANT'\n | 'FARMER'\n | 'FINANCIAL_ADVISOR'\n | 'FIREFIGHTER'\n | 'GRAPHIC_DESIGNER'\n | 'HAIRDRESSER'\n | 'HUMAN_RESOURCES'\n | 'IT_SUPPORT'\n | 'JANITOR'\n | 'JUDGE'\n | 'LAWYER'\n | 'LIBRARIAN'\n | 'MAINTENANCE_WORKER'\n | 'MANAGER'\n | 'MEDICAL_ASSISTANT'\n | 'MECHANIC'\n | 'MILITARY'\n | 'MUSICIAN'\n | 'NURSE'\n | 'PARALEGAL'\n | 'PARAMEDIC'\n | 'PHARMACIST'\n | 'PHOTOGRAPHER'\n | 'PHYSICAL_THERAPIST'\n | 'PILOT'\n | 'PLUMBER'\n | 'POLICE_OFFICER'\n | 'POLITICIAN'\n | 'PROJECT_MANAGER'\n | 'PSYCHOLOGIST'\n | 'RECEPTIONIST'\n | 'RESEARCHER'\n | 'RETAIL_ASSOCIATE'\n | 'SALES_REPRESENTATIVE'\n | 'SCIENTIST'\n | 'SECURITY_GUARD'\n | 'SOCIAL_WORKER'\n | 'TEACHER'\n | 'TECHNICIAN'\n | 'TRANSLATOR'\n | 'VETERINARIAN'\n | 'WAREHOUSE_WORKER'\n | 'WELDER'\n | 'WRITER';\n\n// Consumer Account Information\nexport interface ConsumerAccountInformation {\n first_name: string;\n middle_name?: string;\n last_name: string;\n date_of_birth?: string;\n ssn?: string;\n phone_number?: string;\n email_address: string;\n occupation?: {\n employment_status: EmploymentStatus;\n profession?: Profession;\n };\n}\n\n// Business Account Information\nexport interface BusinessAccountInformation {\n business_type: BusinessType;\n business_name: string;\n doing_business_as?: string;\n state_of_incorporation: string; // Min 2, Max 2\n country_of_incorporation: string; // Min 3, Max 3\n incorporation_date?: string;\n ein?: string;\n phone_number?: string;\n website?: string;\n email_address?: string;\n nature_of_business?: number;\n nature_of_business_details?: string;\n account_purpose?: AccountPurpose;\n account_purpose_details?: string;\n trading_volume?: string;\n transaction_volume?: string;\n source_of_funds?: SourceOfFunds;\n number_of_employees?: string;\n}\n\n// Stakeholder Account Information\nexport interface StakeholderAccountInformation {\n // Add stakeholder-specific fields as needed\n // This interface can be extended based on requirements\n}\n\n// Cardholder Account Information\nexport interface CardholderAccountInformation {\n // Add cardholder-specific fields as needed\n // This interface can be extended based on requirements\n}\n\n// Union type for account information based on account type\nexport type AccountInformation =\n | { consumer_information: ConsumerAccountInformation }\n | { business_information: BusinessAccountInformation }\n | { stakeholder_information: StakeholderAccountInformation }\n | { cardholder_information: CardholderAccountInformation };\n\nexport interface AddressRequest {\n label: string;\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n primary?: boolean;\n external_id?: string;\n}\n\nexport interface AccountRequest {\n external_id: string;\n account_type: 'CONSUMER' | 'BUSINESS' | 'STAKEHOLDER' | 'CARDHOLDER';\n profile?: string;\n information: AccountInformation;\n primary_address?: AddressRequest; // Required for CONSUMER accounts\n business_account_uuid?: string; // Required for STAKEHOLDER accounts\n parent_account_uuid?: string; // Parent (Merchant) Business UUID - Required for CONSUMER, BUSINESS, and CARDHOLDER accounts\n metadata?: Record<string, any>;\n}\n\nexport interface AccountUpdateRequest {\n profile?: string;\n information?: Partial<AccountInformation>;\n metadata?: Record<string, any>;\n external_id?: string;\n accepted_legal_texts?: string[];\n}\n\nexport interface AddressUpdateRequest {\n label?: string;\n line_1?: string;\n line_2?: string;\n city?: string;\n state?: string;\n postal_code?: string;\n country?: string;\n primary?: boolean;\n}\n\n// Factory functions\nexport function NewAccountRequest(params: {\n external_id: string;\n account_type: 'CONSUMER' | 'BUSINESS' | 'STAKEHOLDER' | 'CARDHOLDER';\n profile?: string;\n information: AccountInformation;\n primary_address?: AddressRequest;\n business_account_uuid?: string;\n parent_account_uuid?: string;\n metadata?: Record<string, any>;\n}): AccountRequest {\n const data: AccountRequest = {\n external_id: params.external_id,\n account_type: params.account_type,\n profile: params.profile,\n information: params.information,\n primary_address: params.primary_address,\n business_account_uuid: params.business_account_uuid,\n parent_account_uuid: params.parent_account_uuid,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewAddressRequest(params: {\n label: string;\n line_1: string;\n line_2?: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n primary?: boolean;\n external_id?: string;\n}): AddressRequest {\n const data: AddressRequest = {\n label: params.label,\n line_1: params.line_1,\n line_2: params.line_2,\n city: params.city,\n state: params.state,\n postal_code: params.postal_code,\n country: params.country,\n primary: params.primary,\n external_id: params.external_id,\n };\n\n return getSanitizedBody(data);\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface GenerateMobileTokenRequest {\n account_uuid: string;\n with_plaid_sdk_token?: 'ANDROID' | 'IOS';\n}\n\nexport interface GeneratePlaidTokenRequest {\n account_uuid: string;\n platform: 'IOS' | 'ANDROID' | 'WEB';\n payment_method_uuid?: string;\n}\n\nexport interface GenerateWebSessionRequest {\n account_uuid: string;\n}\n\nexport interface GeneratePdsTokenRequest {\n wallet_uuid: string;\n}\n\n/**\n * Request to generate scoped JWT for specific account (JWT downgrade)\n * Used to exchange business-level JWT for consumer-level JWT\n */\nexport interface GenerateScopedTokenRequest {\n account_uuid: string;\n}\n\n// Factory functions\nexport function NewGenerateMobileTokenRequest(params: {\n account_uuid: string;\n with_plaid_sdk_token?: 'ANDROID' | 'IOS';\n}): GenerateMobileTokenRequest {\n const data: GenerateMobileTokenRequest = {\n account_uuid: params.account_uuid,\n with_plaid_sdk_token: params.with_plaid_sdk_token,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGeneratePlaidTokenRequest(params: {\n account_uuid: string;\n platform: 'IOS' | 'ANDROID' | 'WEB';\n payment_method_uuid?: string;\n}): GeneratePlaidTokenRequest {\n const data: GeneratePlaidTokenRequest = {\n account_uuid: params.account_uuid,\n platform: params.platform,\n payment_method_uuid: params.payment_method_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGenerateWebSessionRequest(params: {\n account_uuid: string;\n}): GenerateWebSessionRequest {\n const data: GenerateWebSessionRequest = {\n account_uuid: params.account_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGeneratePdsTokenRequest(params: {\n wallet_uuid: string;\n}): GeneratePdsTokenRequest {\n const data: GeneratePdsTokenRequest = {\n wallet_uuid: params.wallet_uuid,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewGenerateScopedTokenRequest(params: {\n account_uuid: string;\n}): GenerateScopedTokenRequest {\n return {\n account_uuid: params.account_uuid\n };\n}\n","import { getSanitizedBody } from '../utility';\n\nexport interface DossierDocument {\n document_type: string;\n document_number?: string;\n issuing_country?: string;\n issuing_authority?: string;\n issue_date?: string;\n expiry_date?: string;\n file_content: string; // Base64 encoded file content\n file_name: string;\n mime_type: string;\n}\n\nexport interface DossierRequest {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\nexport interface DossierUpdateRequest {\n documents?: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\nexport interface DossierReplaceRequest {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}\n\n// Factory functions\nexport function NewDossierRequest(params: {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}): DossierRequest {\n const data: DossierRequest = {\n external_id: params.external_id,\n documents: params.documents,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n\nexport function NewDossierReplaceRequest(params: {\n external_id: string;\n documents: DossierDocument[];\n metadata?: Record<string, any>;\n}): DossierReplaceRequest {\n const data: DossierReplaceRequest = {\n external_id: params.external_id,\n documents: params.documents,\n metadata: params.metadata,\n };\n\n return getSanitizedBody(data);\n}\n","export enum DossierType {\n PASSPORT = 'PASSPORT',\n ID_DOCUMENT_FRONT = 'ID_DOCUMENT_FRONT',\n ID_DOCUMENT_BACK = 'ID_DOCUMENT_BACK',\n DRIVER_LICENSE_FRONT = 'DRIVER_LICENSE_FRONT',\n DRIVER_LICENSE_BACK = 'DRIVER_LICENSE_BACK',\n SELFIE = 'SELFIE',\n PROOF_OF_ADDRESS = 'PROOF_OF_ADDRESS',\n PROOF_OF_FUNDS = 'PROOF_OF_FUNDS',\n MC_DOCUMENT_FRONT = 'MC_DOCUMENT_FRONT',\n MC_DOCUMENT_BACK = 'MC_DOCUMENT_BACK',\n INE_FRONT = 'INE_FRONT',\n INE_BACK = 'INE_BACK',\n ARTICLES_OF_INCORPORATION = 'ARTICLES_OF_INCORPORATION',\n CERTIFICATE_OF_GOOD_STANDING = 'CERTIFICATE_OF_GOOD_STANDING',\n ORG_CHART = 'ORG_CHART',\n UBO_FORM = 'UBO_FORM',\n REG_GG_ATTESTATION = 'REG_GG_ATTESTATION',\n}\n\nexport enum DossierStatus {\n CREATED = 'CREATED',\n PENDING = 'PENDING',\n MANUAL_REVIEW = 'MANUAL_REVIEW',\n VERIFIED = 'VERIFIED',\n EXPIRED = 'EXPIRED',\n REJECTED = 'REJECTED',\n FAILED = 'FAILED',\n DELETED = 'DELETED',\n}\n\nexport interface DossierDocument {\n type: DossierType;\n file: Base64URLString;\n barcode_data?: string;\n fail_reasons?: string[];\n extracted_data: Record<string, any>;\n}\n\nexport interface DossierResponse {\n dossier_uuid: string;\n account_uuid: string;\n primary: boolean;\n status: DossierStatus;\n status_reason?: string;\n status_reason_description?: string;\n external_id: string;\n country_of_issuance: string;\n created_at: string;\n updated_at: string;\n documents: DossierDocument[];\n}\n\nexport interface DossierListResponse {\n dossiers: DossierResponse[];\n}\n","export interface FieldPluginConfig {\n // Validation options\n validateOnType?: boolean;\n validateOnBlur?: boolean;\n validateOnSubmit?: boolean;\n\n // Formatting options\n formatOnType?: boolean;\n formatOnBlur?: boolean;\n\n // Visual feedback options\n showErrorsInline?: boolean;\n errorClassName?: string;\n successClassName?: string;\n\n // Custom attributes\n placeholder?: string;\n maxLength?: number;\n\n // Custom validation rules (in addition to built-in)\n customValidation?: (value: string) => string | null;\n\n // Accessibility\n ariaLabel?: string;\n ariaDescribedBy?: string;\n}\n\nexport interface FieldValidationResult {\n isValid: boolean;\n error?: string;\n suggestions?: string[];\n}\n\nexport interface FieldFormatResult {\n formattedValue: string;\n cursorPosition?: number;\n}\n\nexport interface FieldPluginEvents {\n onMount?: (element: HTMLElement) => void;\n onUnmount?: (element: HTMLElement) => void;\n onChange?: (value: string, element: HTMLElement) => void;\n onFocus?: (element: HTMLElement) => void;\n onBlur?: (element: HTMLElement) => void;\n onKeyDown?: (event: KeyboardEvent, element: HTMLElement) => boolean; // return false to prevent default\n onKeyUp?: (event: KeyboardEvent, element: HTMLElement) => void;\n onPaste?: (event: ClipboardEvent, element: HTMLElement) => boolean; // return false to prevent default\n}\n\n/**\n * Base interface for all field plugins in the headless SDK.\n * Plugins handle validation, formatting, and user interaction for specific field types.\n */\nexport interface FieldPlugin {\n readonly name: string;\n readonly version: string;\n readonly description?: string;\n\n /**\n * Validate field value and return validation result\n */\n validate(value: string, config?: FieldPluginConfig): FieldValidationResult;\n\n /**\n * Format field value for display (e.g., add spaces to card numbers)\n */\n format(value: string, config?: FieldPluginConfig): FieldFormatResult;\n\n /**\n * Sanitize/clean input value (remove unwanted characters)\n */\n sanitize(value: string, config?: FieldPluginConfig): string;\n\n /**\n * Get the raw value for API submission (opposite of format)\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string;\n\n /**\n * Initialize plugin on a DOM element\n */\n mount(element: HTMLElement, config?: FieldPluginConfig): void;\n\n /**\n * Cleanup plugin from a DOM element\n */\n unmount(element: HTMLElement): void;\n\n /**\n * Check if this plugin can handle a specific field type\n */\n canHandle(fieldType: string): boolean;\n\n /**\n * Get plugin-specific configuration defaults\n */\n getDefaultConfig(): FieldPluginConfig;\n}\n\n/**\n * Abstract base class for field plugins providing common functionality\n */\nexport abstract class BaseFieldPlugin implements FieldPlugin {\n abstract readonly name: string;\n abstract readonly version: string;\n abstract readonly description?: string;\n\n protected eventListeners: Map<HTMLElement, Map<string, EventListener>> = new Map();\n protected configs: Map<HTMLElement, FieldPluginConfig> = new Map();\n\n abstract validate(value: string, config?: FieldPluginConfig): FieldValidationResult;\n abstract format(value: string, config?: FieldPluginConfig): FieldFormatResult;\n abstract canHandle(fieldType: string): boolean;\n\n /**\n * Default sanitization - remove leading/trailing whitespace\n */\n sanitize(value: string, config?: FieldPluginConfig): string {\n return value.trim();\n }\n\n /**\n * Default raw value - just remove formatting spaces\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string {\n return formattedValue.replace(/\\s/g, '');\n }\n\n /**\n * Mount plugin to DOM element with event listeners\n */\n mount(element: HTMLElement, config?: FieldPluginConfig): void {\n const finalConfig = { ...this.getDefaultConfig(), ...config };\n this.configs.set(element, finalConfig);\n\n const listeners = new Map<string, EventListener>();\n this.eventListeners.set(element, listeners);\n\n // Setup input validation and formatting\n if (element instanceof HTMLInputElement) {\n this.setupInputElement(element as HTMLInputElement, finalConfig);\n }\n\n // Call plugin-specific mount logic\n this.onMount?.(element, finalConfig);\n }\n\n /**\n * Unmount plugin from DOM element\n */\n unmount(element: HTMLElement): void {\n const listeners = this.eventListeners.get(element);\n if (listeners) {\n listeners.forEach((listener, event) => {\n element.removeEventListener(event, listener);\n });\n this.eventListeners.delete(element);\n }\n\n this.configs.delete(element);\n this.onUnmount?.(element);\n }\n\n /**\n * Setup event listeners for input elements\n */\n protected setupInputElement(input: HTMLInputElement, config: FieldPluginConfig): void {\n const listeners = this.eventListeners.get(input)!;\n\n // Format on type\n if (config.formatOnType) {\n const inputListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const result = this.format(target.value, config);\n if (result.formattedValue !== target.value) {\n target.value = result.formattedValue;\n\n // Restore cursor position if specified\n if (result.cursorPosition !== undefined) {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition);\n }\n }\n };\n input.addEventListener('input', inputListener);\n listeners.set('input', inputListener);\n }\n\n // Validate on blur\n if (config.validateOnBlur) {\n const blurListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const validation = this.validate(target.value, config);\n this.displayValidation(target, validation, config);\n };\n input.addEventListener('blur', blurListener);\n listeners.set('blur', blurListener);\n }\n\n // Validate on type (real-time)\n if (config.validateOnType) {\n const validateListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const validation = this.validate(target.value, config);\n this.displayValidation(target, validation, config);\n };\n input.addEventListener('input', validateListener);\n listeners.set('input-validate', validateListener);\n }\n\n // Apply initial configuration\n if (config.placeholder) input.placeholder = config.placeholder;\n if (config.maxLength) input.maxLength = config.maxLength;\n if (config.ariaLabel) input.setAttribute('aria-label', config.ariaLabel);\n if (config.ariaDescribedBy) input.setAttribute('aria-describedby', config.ariaDescribedBy);\n }\n\n /**\n * Display validation results on the element\n */\n protected displayValidation(element: HTMLElement, result: FieldValidationResult, config: FieldPluginConfig): void {\n if (!config.showErrorsInline) return;\n\n // Remove existing classes\n if (config.errorClassName) element.classList.remove(config.errorClassName);\n if (config.successClassName) element.classList.remove(config.successClassName);\n\n // Add appropriate class\n if (result.isValid && config.successClassName) {\n element.classList.add(config.successClassName);\n } else if (!result.isValid && config.errorClassName) {\n element.classList.add(config.errorClassName);\n }\n\n // Update error message\n this.updateErrorMessage(element, result.error);\n }\n\n /**\n * Update error message display\n */\n protected updateErrorMessage(element: HTMLElement, error?: string): void {\n let errorElement = element.parentElement?.querySelector('.alviere-field-error') as HTMLElement;\n\n if (error) {\n if (!errorElement) {\n errorElement = document.createElement('div');\n errorElement.className = 'alviere-field-error';\n element.parentElement?.appendChild(errorElement);\n }\n errorElement.textContent = error;\n errorElement.style.display = 'block';\n } else if (errorElement) {\n errorElement.style.display = 'none';\n }\n }\n\n /**\n * Get default configuration for this plugin\n */\n getDefaultConfig(): FieldPluginConfig {\n return {\n validateOnBlur: true,\n formatOnType: true,\n showErrorsInline: true,\n errorClassName: 'alviere-field-error',\n successClassName: 'alviere-field-success'\n };\n }\n\n // Lifecycle hooks for subclasses to override\n protected onMount?(element: HTMLElement, config: FieldPluginConfig): void;\n protected onUnmount?(element: HTMLElement): void;\n}\n","/**\n * CardNumberPlugin - CURRENTLY NOT ACTIVE\n *\n * Status: Implemented and tested, but disabled - not used by any consumers\n *\n * This plugin provides card number validation, formatting, and type detection.\n * It's been kept in the codebase as a future enhancement possibility.\n *\n * Note: ui-svelte implements its own card handling directly in CardPanInput.svelte\n * with its own cardTypes array and detectCardType function. The validation comes\n * from the core Validator service (credit_card_number method), not from this plugin.\n *\n * To activate:\n * 1. Tests already exist (card-number.test.ts)\n * 2. Uncomment the import in field-plugin-registry.ts\n * 3. Add to registerBuiltinPlugins() array\n * 4. Remove from coverage exclusions in vitest.config.ts\n * 5. Update consuming code to use this plugin instead of custom implementations\n */\nimport { BaseFieldPlugin, FieldPluginConfig, FieldValidationResult, FieldFormatResult } from '../field-plugin.interface';\n\nexport interface CardType {\n name: string;\n pattern: RegExp;\n gaps: number[];\n lengths: number[];\n code: { name: string; size: number };\n}\n\n// Card type definitions\nexport const CARD_TYPES: { [key: string]: CardType } = {\n visa: {\n name: 'Visa',\n pattern: /^4/,\n gaps: [4, 8, 12],\n lengths: [13, 16, 19],\n code: { name: 'CVV', size: 3 }\n },\n mastercard: {\n name: 'Mastercard',\n pattern: /^(5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)/,\n gaps: [4, 8, 12],\n lengths: [16],\n code: { name: 'CVC', size: 3 }\n },\n amex: {\n name: 'American Express',\n pattern: /^3[47]/,\n gaps: [4, 10],\n lengths: [15],\n code: { name: 'CID', size: 4 }\n },\n diners: {\n name: 'Diners Club',\n pattern: /^3[0689]/,\n gaps: [4, 10],\n lengths: [14],\n code: { name: 'CVV', size: 3 }\n },\n discover: {\n name: 'Discover',\n pattern: /^6([045]|22)/,\n gaps: [4, 8, 12],\n lengths: [16, 19],\n code: { name: 'CID', size: 3 }\n },\n jcb: {\n name: 'JCB',\n pattern: /^35/,\n gaps: [4, 8, 12],\n lengths: [16],\n code: { name: 'CVV', size: 3 }\n }\n};\n\nexport class CardNumberPlugin extends BaseFieldPlugin {\n readonly name = 'card-number';\n readonly version = '1.0.0';\n readonly description = 'Credit card number formatting and validation';\n\n private currentCardType: CardType | null = null;\n\n /**\n * Validate card number using Luhn algorithm and card type patterns\n */\n validate(value: string, config?: FieldPluginConfig): FieldValidationResult {\n const sanitized = this.sanitize(value);\n\n if (!sanitized) {\n return { isValid: false, error: 'Card number is required' };\n }\n\n // Check if all characters are digits\n if (!/^\\d+$/.test(sanitized)) {\n return { isValid: false, error: 'Card number must contain only digits' };\n }\n\n // Detect card type\n const cardType = this.detectCardType(sanitized);\n this.currentCardType = cardType;\n\n if (!cardType) {\n return { isValid: false, error: 'Invalid card number format' };\n }\n\n // Check length\n if (!cardType.lengths.includes(sanitized.length)) {\n const expectedLengths = cardType.lengths.join(' or ');\n return {\n isValid: false,\n error: `${cardType.name} card numbers must be ${expectedLengths} digits long`\n };\n }\n\n // Validate using Luhn algorithm\n if (!this.luhnCheck(sanitized)) {\n return { isValid: false, error: 'Invalid card number' };\n }\n\n // Custom validation if provided\n if (config?.customValidation) {\n const customError = config.customValidation(value);\n if (customError) {\n return { isValid: false, error: customError };\n }\n }\n\n return {\n isValid: true,\n suggestions: [`${cardType.name} ending in ${sanitized.slice(-4)}`]\n };\n }\n\n /**\n * Format card number with appropriate spacing based on card type\n */\n format(value: string, config?: FieldPluginConfig): FieldFormatResult {\n const sanitized = this.sanitize(value);\n const cardType = this.detectCardType(sanitized) || CARD_TYPES.visa; // Default to Visa formatting\n\n let formatted = '';\n let spacesAdded = 0;\n\n for (let i = 0; i < sanitized.length; i++) {\n // Check if we need to add a space before this digit\n if (cardType.gaps.includes(i)) {\n formatted += ' ';\n spacesAdded++;\n }\n formatted += sanitized[i];\n }\n\n // Calculate cursor position: original sanitized length + spaces added\n const cursorPosition = sanitized.length + spacesAdded;\n\n return {\n formattedValue: formatted,\n cursorPosition: cursorPosition\n };\n }\n\n /**\n * Remove all non-digit characters\n */\n sanitize(value: string, config?: FieldPluginConfig): string {\n return value.replace(/\\D/g, '');\n }\n\n /**\n * Get raw value without formatting spaces\n */\n getRawValue(formattedValue: string, config?: FieldPluginConfig): string {\n return this.sanitize(formattedValue);\n }\n\n /**\n * Check if this plugin can handle the field type\n */\n canHandle(fieldType: string): boolean {\n return ['card-number', 'cardNumber', 'pan', 'credit-card'].includes(fieldType);\n }\n\n /**\n * Get plugin-specific default configuration\n */\n getDefaultConfig(): FieldPluginConfig {\n return {\n ...super.getDefaultConfig(),\n validateOnType: true,\n formatOnType: true,\n placeholder: '1234 5678 9012 3456',\n maxLength: 23, // Max formatted length for 19-digit cards with spaces\n ariaLabel: 'Credit card number'\n };\n }\n\n /**\n * Detect card type based on number pattern\n */\n detectCardType(cardNumber: string): CardType | null {\n for (const [key, cardType] of Object.entries(CARD_TYPES)) {\n if (cardType.pattern.test(cardNumber)) {\n return cardType;\n }\n }\n return null;\n }\n\n /**\n * Get the detected card type\n */\n getCardType(): CardType | null {\n return this.currentCardType;\n }\n\n /**\n * Validate card number using Luhn algorithm\n */\n private luhnCheck(cardNumber: string): boolean {\n let sum = 0;\n let isEven = false;\n\n // Loop through digits from right to left\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n return sum % 10 === 0;\n }\n\n /**\n * Enhanced mount with card type detection\n */\n protected onMount(element: HTMLElement, config: FieldPluginConfig): void {\n if (element instanceof HTMLInputElement) {\n // Add card type detection on input\n const cardTypeListener = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const sanitized = this.sanitize(target.value);\n const cardType = this.detectCardType(sanitized);\n\n // Emit card type change event\n if (cardType !== this.currentCardType) {\n this.currentCardType = cardType;\n element.dispatchEvent(new CustomEvent('cardTypeChange', {\n detail: { cardType, element },\n bubbles: true // Allow event to bubble up to document\n }));\n }\n\n // Update maxLength based on card type\n if (cardType) {\n const maxFormattedLength = Math.max(...cardType.lengths) + cardType.gaps.length;\n target.maxLength = maxFormattedLength;\n }\n };\n\n element.addEventListener('input', cardTypeListener);\n\n // Store reference for cleanup\n const listeners = this.eventListeners.get(element);\n if (listeners) {\n listeners.set('cardTypeDetection', cardTypeListener);\n }\n }\n }\n}\n","import { FieldPlugin, FieldPluginConfig } from './field-plugin.interface';\n// Future plugin enhancements - currently not in use\n// All plugins are disabled as they have no active consumers\n// ui-svelte implements its own card handling in CardPanInput.svelte\n// import { CardNumberPlugin } from './fields/card-number.plugin';\n// import { ExpiryDatePlugin } from './fields/expiry-date.plugin';\n// import { CVVPlugin } from './fields/cvv.plugin';\n// import { TextPlugin, ZipCodePlugin } from './fields/text.plugin';\nimport { LoggerInterface } from '../entities/interfaces/logger.interface';\n\nexport interface PluginRegistryConfig {\n autoRegisterBuiltins?: boolean;\n enablePluginValidation?: boolean;\n logger?: LoggerInterface;\n}\n\n/**\n * FieldPluginRegistry manages all field plugins and provides\n * plugin discovery, registration, and management capabilities\n */\nexport class FieldPluginRegistry {\n private plugins: Map<string, FieldPlugin> = new Map();\n private fieldTypeCache: Map<string, FieldPlugin> = new Map();\n private config: PluginRegistryConfig;\n private logger?: LoggerInterface;\n\n constructor(config: PluginRegistryConfig = {}) {\n this.config = {\n autoRegisterBuiltins: true,\n enablePluginValidation: true,\n ...config\n };\n this.logger = config.logger;\n\n // Auto-register built-in plugins\n if (this.config.autoRegisterBuiltins) {\n this.registerBuiltinPlugins();\n }\n\n this.logger?.debug('🔐 FieldPluginRegistry initialized');\n }\n\n /**\n * Register a field plugin\n */\n register(plugin: FieldPlugin): void {\n if (this.config.enablePluginValidation) {\n this.validatePlugin(plugin);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Clear field type cache since we have a new plugin\n this.fieldTypeCache.clear();\n\n this.logger?.debug(`FieldPluginRegistry: Registered plugin '${plugin.name}' v${plugin.version}`);\n }\n\n /**\n * Unregister a field plugin\n */\n unregister(pluginName: string): boolean {\n const removed = this.plugins.delete(pluginName);\n\n if (removed) {\n // Clear field type cache\n this.fieldTypeCache.clear();\n this.logger?.debug(`FieldPluginRegistry: Unregistered plugin '${pluginName}'`);\n }\n\n return removed;\n }\n\n /**\n * Get a plugin by name\n */\n getPlugin(pluginName: string): FieldPlugin | undefined {\n return this.plugins.get(pluginName);\n }\n\n /**\n * Get plugin for a specific field type (with caching)\n */\n getPluginForFieldType(fieldType: string): FieldPlugin | undefined {\n // Check cache first\n if (this.fieldTypeCache.has(fieldType)) {\n return this.fieldTypeCache.get(fieldType);\n }\n\n // Find plugin that can handle this field type\n for (const plugin of this.plugins.values()) {\n if (plugin.canHandle(fieldType)) {\n this.fieldTypeCache.set(fieldType, plugin);\n return plugin;\n }\n }\n\n // Fallback to text plugin if available\n const textPlugin = this.plugins.get('text');\n if (textPlugin) {\n this.fieldTypeCache.set(fieldType, textPlugin);\n return textPlugin;\n }\n\n return undefined;\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): FieldPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get plugin names\n */\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(pluginName: string): boolean {\n return this.plugins.has(pluginName);\n }\n\n /**\n * Get supported field types across all plugins\n */\n getSupportedFieldTypes(): string[] {\n const fieldTypes = new Set<string>();\n\n // Common field types that plugins can handle\n const commonFieldTypes = [\n 'card-number', 'cardNumber', 'pan',\n 'expiry', 'expiry-date', 'expiryDate',\n 'cvv', 'cvc', 'code',\n 'zip', 'zip-code', 'postal-code',\n 'text', 'name', 'cardholder-name'\n ];\n\n for (const fieldType of commonFieldTypes) {\n if (this.getPluginForFieldType(fieldType)) {\n fieldTypes.add(fieldType);\n }\n }\n\n return Array.from(fieldTypes);\n }\n\n /**\n * Create and mount a plugin for an element\n */\n mountPlugin(element: HTMLElement, fieldType: string, config?: FieldPluginConfig): FieldPlugin | null {\n const plugin = this.getPluginForFieldType(fieldType);\n\n if (!plugin) {\n this.logger?.warn(`FieldPluginRegistry: No plugin found for field type '${fieldType}'`);\n return null;\n }\n\n try {\n plugin.mount(element, config);\n this.logger?.debug(`FieldPluginRegistry: Mounted '${plugin.name}' plugin on element for field type '${fieldType}'`);\n return plugin;\n } catch (error) {\n this.logger?.error(`FieldPluginRegistry: Failed to mount plugin '${plugin.name}': ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Unmount plugin from an element\n */\n unmountPlugin(element: HTMLElement, fieldType: string): boolean {\n const plugin = this.getPluginForFieldType(fieldType);\n\n if (!plugin) {\n return false;\n }\n\n try {\n plugin.unmount(element);\n this.logger?.debug(`FieldPluginRegistry: Unmounted '${plugin.name}' plugin from element`);\n return true;\n } catch (error) {\n this.logger?.error(`FieldPluginRegistry: Failed to unmount plugin '${plugin.name}': ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n /**\n * Get plugin registry statistics\n */\n getStats(): {\n totalPlugins: number;\n pluginNames: string[];\n supportedFieldTypes: string[];\n cacheSize: number;\n } {\n return {\n totalPlugins: this.plugins.size,\n pluginNames: this.getPluginNames(),\n supportedFieldTypes: this.getSupportedFieldTypes(),\n cacheSize: this.fieldTypeCache.size\n };\n }\n\n /**\n * Clear all caches\n */\n clearCaches(): void {\n this.fieldTypeCache.clear();\n }\n\n /**\n * Register all built-in plugins\n *\n * Note: ALL plugins are currently disabled as they have no active consumers.\n * - ui-svelte implements its own card handling in CardPanInput.svelte\n * - CardNumberPlugin was only used in its own tests\n * - Other plugins (ExpiryDatePlugin, CVVPlugin, TextPlugin, ZipCodePlugin) were never activated\n *\n * The plugin system remains as a future architecture option if needed.\n *\n * To re-enable plugins in the future:\n * 1. Uncomment the imports at the top of this file\n * 2. Add plugin instances to the builtinPlugins array below\n * 3. Ensure tests exist for the plugins\n * 4. Update vitest.config.ts to remove them from coverage exclusions\n * 5. Update consuming code to actually use the plugins\n */\n private registerBuiltinPlugins(): void {\n const builtinPlugins: FieldPlugin[] = [\n // All plugins disabled - no active consumers\n // new CardNumberPlugin(),\n // new ExpiryDatePlugin(),\n // new CVVPlugin(),\n // new TextPlugin(),\n // new ZipCodePlugin()\n ];\n\n for (const plugin of builtinPlugins) {\n this.register(plugin);\n }\n }\n\n /**\n * Validate plugin before registration\n */\n private validatePlugin(plugin: FieldPlugin): void {\n if (!plugin.name || typeof plugin.name !== 'string') {\n throw new Error('Plugin must have a valid name');\n }\n\n if (!plugin.version || typeof plugin.version !== 'string') {\n throw new Error('Plugin must have a valid version');\n }\n\n if (typeof plugin.validate !== 'function') {\n throw new Error('Plugin must implement validate method');\n }\n\n if (typeof plugin.format !== 'function') {\n throw new Error('Plugin must implement format method');\n }\n\n if (typeof plugin.sanitize !== 'function') {\n throw new Error('Plugin must implement sanitize method');\n }\n\n if (typeof plugin.canHandle !== 'function') {\n throw new Error('Plugin must implement canHandle method');\n }\n\n if (typeof plugin.mount !== 'function') {\n throw new Error('Plugin must implement mount method');\n }\n\n if (typeof plugin.unmount !== 'function') {\n throw new Error('Plugin must implement unmount method');\n }\n\n // Check for name conflicts\n if (this.plugins.has(plugin.name)) {\n this.logger?.warn(`FieldPluginRegistry: Plugin '${plugin.name}' is already registered and will be replaced`);\n }\n }\n}\n\n// Global registry instance\nlet globalRegistry: FieldPluginRegistry | null = null;\n\n/**\n * Get the global field plugin registry (singleton)\n */\nexport function getGlobalPluginRegistry(): FieldPluginRegistry {\n if (!globalRegistry) {\n globalRegistry = new FieldPluginRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Create a new plugin registry instance\n */\nexport function createPluginRegistry(config?: PluginRegistryConfig): FieldPluginRegistry {\n return new FieldPluginRegistry(config);\n}\n","// Core SDK Entry Point - Framework Agnostic\nimport { Logger } from './infrastructure/logging/logger.service';\nimport { Cryptor } from './infrastructure/security/cryptor.service';\nimport { Validator } from './infrastructure/security/validator.service';\nimport { PaymentsGateway } from './infrastructure/gateways/payments.gateway';\nimport { WalletsGateway } from './infrastructure/gateways/wallets.gateway';\nimport { PaymentInstrumentsGateway } from './infrastructure/gateways/payment-instruments.gateway';\nimport { AccountsGateway } from './infrastructure/gateways/accounts.gateway';\nimport { AuthGateway } from './infrastructure/gateways/auth.gateway';\nimport { WalletsApiService } from './services/wallets-api.service';\nimport { PaymentInstrumentsApiService } from './services/payment-instruments-api.service';\nimport { AccountsApiService } from './services/accounts-api.service';\nimport { PaymentProcessor } from './services/payment-processor.service';\nimport { BankInfoApiService } from './services/bank-info-api.service';\nimport { LegalTextsApiService } from './services/legal-texts-api.service';\nimport { setRuntimeConfig, AlviereConfig, getRSA_PUB_KEY } from './entities/constants/environment';\nimport {\n extractAlviereConfigFromJWT,\n extractAccountUuidFromJWT,\n} from './entities/requests/utility';\nimport { BankInfoGateway } from './infrastructure/gateways/bank-info.gateway';\nimport { LegalTextsGateway } from './infrastructure/gateways/legal-texts.gateway';\n\n// Export infrastructure services\nexport { Logger } from './infrastructure/logging/logger.service';\nexport { Cryptor } from './infrastructure/security/cryptor.service';\nexport { Validator } from './infrastructure/security/validator.service';\n\n// Export essential interfaces\nexport * from './entities/interfaces/cryptor.interface';\nexport * from './entities/interfaces/logger.interface';\nexport * from './entities/interfaces/validator.interface';\nexport * from './entities/interfaces/gateways/payments.interface';\nexport * from './entities/interfaces/gateways/wallets.interface';\nexport * from './entities/interfaces/gateways/payment-instruments.interface';\nexport * from './entities/interfaces/gateways/accounts.interface';\nexport * from './entities/interfaces/gateways/legal-texts.interface';\n\n// Export configuration and utility types\nexport * from './entities/constants/environment';\nexport * from './entities/requests/utility';\nexport { extractAccountUuidFromJWT } from './entities/requests/utility';\n\n// Export request types\nexport * from './entities/requests/payments/payments';\nexport * from './entities/requests/payments/payment-instruments';\nexport * from './entities/requests/payments/bank-accounts';\nexport * from './entities/requests/wallets/wallets';\nexport * from './entities/requests/accounts/accounts';\nexport * from './entities/requests/accounts/addresses';\nexport * from './entities/requests/auth/auth';\nexport type {\n DossierRequest,\n DossierUpdateRequest,\n DossierReplaceRequest,\n} from './entities/requests/accounts/dossiers';\nexport { NewDossierRequest, NewDossierReplaceRequest } from './entities/requests/accounts/dossiers';\n\n// Export account information types\nexport type {\n ConsumerAccountInformation,\n BusinessAccountInformation,\n StakeholderAccountInformation,\n CardholderAccountInformation,\n EmploymentStatus,\n BusinessType,\n AccountPurpose,\n SourceOfFunds,\n Profession,\n} from './entities/requests/accounts/accounts';\n\n// Export response types\nexport * from './entities/responses/payments/add_card';\nexport * from './entities/responses/payments/bank_accounts';\nexport * from './entities/responses/wallets/wallets';\nexport * from './entities/responses/accounts/accounts';\nexport * from './entities/responses/dossiers/dossiers';\nexport * from './entities/responses/auth/auth';\nexport * from './entities/responses/bank-info/bank-info';\nexport * from './entities/interfaces/BankInfo.interface';\nexport * from './entities/responses/legal-texts/legal-texts';\n\n// Export payment instruments responses (explicitly handle the Transaction conflict)\nexport type {\n PaymentInstrument,\n PaymentInstrumentResponse,\n CardInstrumentResponse,\n DebitFundsResponse,\n CardPaymentMethod,\n CardListResponse,\n} from './entities/responses/payments/payment-instruments';\n\n// Export error types\nexport { AlcoreApiError } from './entities/errors/alcore-api.error';\n\n// Export error codes and utilities\nexport * from './entities/constants/error-codes';\n\n// Export gateways\nexport { PaymentsGateway } from './infrastructure/gateways/payments.gateway';\nexport { WalletsGateway } from './infrastructure/gateways/wallets.gateway';\nexport { PaymentInstrumentsGateway } from './infrastructure/gateways/payment-instruments.gateway';\nexport { AccountsGateway } from './infrastructure/gateways/accounts.gateway';\nexport { AuthGateway } from './infrastructure/gateways/auth.gateway';\nexport { BankInfoGateway } from './infrastructure/gateways/bank-info.gateway';\n\n// Export working services\nexport { WalletsApiService } from './services/wallets-api.service';\nexport { PaymentInstrumentsApiService } from './services/payment-instruments-api.service';\nexport { AccountsApiService } from './services/accounts-api.service';\nexport { PaymentProcessor } from './services/payment-processor.service';\n\n// Export field plugins\nexport { CardNumberPlugin } from './plugins/fields/card-number.plugin';\nexport { FieldPluginRegistry } from './plugins/field-plugin-registry';\nexport * from './plugins/field-plugin.interface';\n\n// Core SDK Configuration\nexport interface AlviereCoreConfig {\n jwt?: string;\n publicCertificate?: string;\n publicCertificateId?: string;\n domain?: string;\n debug?: boolean;\n business_uuid?: string; // Business UUID for user state comparison\n // Add Alviere-specific configuration\n alviere?: Partial<AlviereConfig>;\n}\n\n// Core SDK Factory\nexport class AlviereCore {\n private jwt: string; // JWT token from Sierra API v3\n private authToken: string = ''; // Auth token for API calls (same as JWT)\n private debug: boolean;\n private publicCertificate: string;\n private publicCertificateId: string;\n private business_uuid: string = ''; // Business UUID from configuration\n private account_uuid: string = ''; // Account UUID extracted from JWT's sub field\n\n // Shared instances (created once, reused across all services)\n private logger: Logger;\n private cryptor: Cryptor | null = null; // Lazy initialized\n\n // Gateway cache (created on-demand, reused)\n private gateways: Map<string, any> = new Map();\n\n constructor(config: AlviereCoreConfig = {}) {\n this.jwt = config.jwt || '';\n this.debug = config.debug || false;\n this.publicCertificate = config.publicCertificate || '';\n this.publicCertificateId = config.publicCertificateId || '';\n this.business_uuid = config.business_uuid || '';\n\n // Create shared instances once\n this.logger = new Logger(this.debug);\n // Note: Cryptor is created lazily when first needed (see getCryptor())\n\n this.logger.debug(`🔐 AlviereCore constructor called with config: ${JSON.stringify(config)}`);\n\n // Set runtime configuration from JWT if available\n if (this.jwt) {\n const jwtConfig = extractAlviereConfigFromJWT(this.jwt);\n\n // Extract Alviere configuration (api_domain)\n if (config.jwt) {\n setRuntimeConfig({\n ...jwtConfig,\n certificate: { id: this.publicCertificateId, public_key: this.publicCertificate },\n });\n }\n\n // Extract account_uuid from JWT's sub field\n const extractedAccountUuid = extractAccountUuidFromJWT(this.jwt);\n if (extractedAccountUuid) {\n this.account_uuid = extractedAccountUuid;\n this.logger.debug(`🔐 Extracted account_uuid from JWT sub field: ${this.account_uuid}`);\n } else {\n this.logger.debug('⚠️ No account_uuid found in JWT sub field');\n }\n\n // Use the JWT itself as the auth token for API calls\n this.authToken = this.jwt;\n this.logger.debug('🔐 Using JWT as auth token for API authentication');\n }\n\n // Override with explicit configuration if provided\n if (config.alviere) {\n setRuntimeConfig(config.alviere);\n }\n }\n\n // Update configuration\n configure(config: Partial<AlviereCoreConfig>) {\n const jwtChanged = config.jwt && config.jwt !== this.jwt;\n\n if (config.jwt) {\n this.jwt = config.jwt;\n\n // Extract new configuration from JWT\n const jwtConfig = extractAlviereConfigFromJWT(config.jwt);\n\n // Extract Alviere configuration (api_domain)\n if (jwtConfig.domain) {\n setRuntimeConfig(jwtConfig);\n }\n\n // Re-extract account_uuid from new JWT\n const extractedAccountUuid = extractAccountUuidFromJWT(config.jwt);\n this.logger.debug(`🔐 Extracted account_uuid from JWT sub field: ${extractedAccountUuid}`);\n if (extractedAccountUuid) {\n this.account_uuid = extractedAccountUuid;\n this.logger.debug(`🔐 Updated account_uuid from JWT sub field: ${this.account_uuid}`);\n } else {\n this.logger.debug('⚠️ No account_uuid found in new JWT sub field');\n }\n\n // Use the JWT itself as the auth token for API calls\n this.authToken = this.jwt;\n this.logger.debug('🔐 Updated JWT as auth token for API authentication');\n }\n\n // Update business_uuid if provided\n if (config.business_uuid !== undefined) {\n this.business_uuid = config.business_uuid;\n this.logger.debug(`🔐 Updated business_uuid: ${this.business_uuid}`);\n }\n\n // Update debug flag\n if (typeof config.debug === 'boolean' && config.debug !== this.debug) {\n this.debug = config.debug;\n // Recreate logger with new debug setting\n this.logger = new Logger(this.debug);\n this.logger.debug('🔐 Debug mode changed to: ' + this.debug);\n }\n\n // Clear gateway cache if JWT changed (they need new auth token)\n if (jwtChanged) {\n this.logger.debug('🔐 JWT changed - clearing gateway cache and cryptor');\n this.gateways.clear();\n // Clear cryptor so it will be recreated with new RSA key on next use\n this.cryptor = null;\n }\n\n // Update Alviere runtime configuration (overrides JWT config)\n if (config.alviere) {\n setRuntimeConfig(config.alviere);\n }\n\n return this;\n }\n\n /**\n * Get or create Cryptor instance (lazy initialization with validation)\n * This ensures we only create Cryptor when it's actually needed and we have a valid RSA key\n * @throws Error if RSA public key is not available\n */\n private getOrCreateCryptor(): Cryptor {\n if (!this.cryptor) {\n const rsaKey = getRSA_PUB_KEY();\n\n if (!rsaKey || rsaKey.trim() === '') {\n throw new Error(\n '🔐 Cryptor initialization failed: RSA public key not available. ' +\n 'Please ensure JWT is configured with a valid RSA key before attempting encryption operations. ' +\n 'Call alviereCore.configure({ jwt: \"your-jwt-with-rsa-key\" }) first.'\n );\n }\n\n this.logger.debug('🔐 Creating Cryptor instance with RSA key');\n this.cryptor = new Cryptor(this.logger);\n }\n return this.cryptor;\n }\n\n // Create payment gateway (cached and reused)\n createPaymentsGateway() {\n if (!this.gateways.has('payments')) {\n this.gateways.set(\n 'payments',\n new PaymentsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return this.gateways.get('payments');\n }\n\n // Create payments service (reuses cached gateway and shared logger)\n createPaymentsService() {\n const gateway = this.createPaymentsGateway();\n return new PaymentProcessor(gateway, this.logger);\n }\n\n // Create wallet services (reuses cached gateway)\n createWalletsService() {\n if (!this.gateways.has('wallets')) {\n this.gateways.set(\n 'wallets',\n new WalletsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new WalletsApiService(this.gateways.get('wallets'));\n }\n\n // Create payment instruments service (reuses cached gateway)\n createPaymentInstrumentsService() {\n if (!this.gateways.has('paymentInstruments')) {\n this.gateways.set(\n 'paymentInstruments',\n new PaymentInstrumentsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new PaymentInstrumentsApiService(this.gateways.get('paymentInstruments'));\n }\n\n // Create accounts service (reuses cached gateway)\n createAccountsService() {\n if (!this.gateways.has('accounts')) {\n this.gateways.set(\n 'accounts',\n new AccountsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new AccountsApiService(this.gateways.get('accounts'));\n }\n\n // Create auth gateway (reuses cached gateway)\n createAuthGateway() {\n if (!this.gateways.has('auth')) {\n if (!this.cryptor) {\n throw new Error('Cryptor not initialized. Cannot create AuthGateway.');\n }\n this.gateways.set('auth', new AuthGateway(this.authToken, this.cryptor, this.logger));\n }\n return this.gateways.get('auth') as AuthGateway;\n }\n\n // Create bank info service\n createBankInfoService() {\n if (!this.gateways.has('bankInfo')) {\n this.gateways.set(\n 'bankInfo',\n new BankInfoGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new BankInfoApiService(this.gateways.get('bankInfo'));\n }\n\n // Create legal texts service\n createLegalTextsService() {\n if (!this.gateways.has('legalTexts')) {\n this.gateways.set(\n 'legalTexts',\n new LegalTextsGateway(this.authToken, this.getOrCreateCryptor(), this.logger)\n );\n }\n return new LegalTextsApiService(this.gateways.get('legalTexts'));\n }\n\n /**\n * Generate scoped JWT for specific account (JWT downgrade)\n * Exchanges the current business-level JWT for a consumer-level JWT\n *\n * @param accountUuid - The account UUID to scope the JWT to\n * @param autoUpdate - If true, automatically updates the SDK with the new JWT (default: true)\n * @returns The new scoped JWT token\n */\n async generateScopedToken(accountUuid: string, autoUpdate: boolean = true): Promise<string> {\n this.logger.debug(`🔐 Generating scoped token for account: ${accountUuid}`);\n this.logger.debug(`🔐 Auto-update: ${autoUpdate}`);\n\n const authGateway = this.createAuthGateway();\n const response = await authGateway.generateScopedToken({ account_uuid: accountUuid });\n\n this.logger.debug('✅ Scoped token generated successfully');\n\n if (autoUpdate && response.access_token) {\n this.logger.debug('🔄 Auto-updating SDK with new scoped token');\n this.configure({ jwt: response.access_token });\n }\n\n return response.access_token;\n }\n\n // Get shared instances (for advanced usage)\n getLogger() {\n return this.logger;\n }\n\n /**\n * Get Cryptor instance (lazy initialized with validation)\n * @throws Error if RSA public key is not available\n */\n getCryptor() {\n return this.getOrCreateCryptor(); // Delegate to private method with validation\n }\n\n // Clear gateway cache (useful for testing or manual cache invalidation)\n clearCache() {\n this.gateways.clear();\n }\n\n /**\n * Get the account UUID extracted from JWT's sub field\n * @returns The account UUID, or empty string if not available\n */\n getAccountUuid(): string {\n return this.account_uuid;\n }\n\n /**\n * Get the business UUID from configuration\n * @returns The business UUID, or empty string if not configured\n */\n getBusinessUuid(): string {\n return this.business_uuid;\n }\n\n /**\n * Determine if the user is accessing the SDK for the first time\n * Returns true if account_uuid matches business_uuid (user authenticated as business)\n * Returns false if they differ (JWT already scoped to a specific payee/consumer)\n *\n * @returns true if first-time user, false otherwise\n */\n isFirstTimeUser(): boolean {\n if (!this.account_uuid || !this.business_uuid) {\n this.logger.debug(\n '🔐 Cannot determine first-time user status: missing account_uuid or business_uuid'\n );\n return false; // Default to false if either is missing\n }\n\n const isFirstTime = this.account_uuid === this.business_uuid;\n this.logger.debug(\n `🔐 First-time user check: ${isFirstTime} (account: ${this.account_uuid}, business: ${this.business_uuid})`\n );\n return isFirstTime;\n }\n\n /**\n * Determine if the JWT is scoped to a specific payee/consumer\n * Returns true if account_uuid differs from business_uuid\n * Returns false if they match or if either is missing\n *\n * @returns true if scoped to payee, false otherwise\n */\n isScopedToPayee(): boolean {\n if (!this.account_uuid || !this.business_uuid) {\n return false;\n }\n return this.account_uuid !== this.business_uuid;\n }\n\n // Static utility methods\n static createValidator(debug: boolean = false) {\n const logger = new Logger(debug);\n return new Validator(logger);\n }\n\n static createLogger(debug: boolean = false) {\n return new Logger(debug);\n }\n\n static createCryptor(logger?: Logger) {\n return new Cryptor(logger);\n }\n}\n\n// Default export\nexport default AlviereCore;\n"],"names":["DossierType","DossierStatus"],"mappings":"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"}
|