@acontplus/ng-infrastructure 2.0.8 → 2.0.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"acontplus-ng-infrastructure.mjs","sources":["../../../../packages/ng-infrastructure/src/lib/interceptors/api-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/services/logging-service.ts","../../../../packages/ng-infrastructure/src/lib/services/tenant-info.ts","../../../../packages/ng-infrastructure/src/lib/services/correlation-info.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/http-context-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/spinner-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/repositories/base-http-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/generic-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/repository-factory.ts","../../../../packages/ng-infrastructure/src/lib/adapters/angular-http-adapter.ts","../../../../packages/ng-infrastructure/src/lib/services/core-config-service.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/base-use-case.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/commands.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/queries.ts","../../../../packages/ng-infrastructure/src/acontplus-ng-infrastructure.ts"],"sourcesContent":["import {\n HttpInterceptorFn,\n HttpEvent,\n HttpResponse,\n HttpErrorResponse,\n HttpRequest,\n HttpContextToken,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, map, retry } from 'rxjs/operators';\nimport { throwError } from 'rxjs';\nimport { ApiResponse } from '@acontplus/core';\nimport { NotificationService } from '@acontplus/ng-notifications';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\n// A token to use with HttpContext for skipping notifications on specific requests.\nexport const SKIP_NOTIFICATION = new HttpContextToken<boolean>(() => false);\n\n// A token to use with HttpContext for forcing notifications on specific requests (overrides exclusion patterns).\nexport const SHOW_NOTIFICATIONS = new HttpContextToken<boolean | undefined>(() => undefined);\n\nexport const apiInterceptor: HttpInterceptorFn = (req, next) => {\n const toastr = inject(NotificationService);\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n\n // Add authorization header if token is available\n let modifiedReq = req;\n const token = tokenProvider?.getToken();\n if (token) {\n modifiedReq = req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n });\n }\n\n return next(modifiedReq).pipe(\n // Retries the request up to 2 times on failure with a 1-second delay.\n retry({ count: 2, delay: 1000 }),\n // Use the `map` operator to handle successful responses.\n map((event: HttpEvent<unknown>) => {\n if (event instanceof HttpResponse) {\n return handleSuccessResponse(event, toastr, req);\n }\n return event;\n }),\n // Use the `catchError` operator to handle any errors that occur.\n catchError((error: HttpErrorResponse) => handleErrorResponse(error, toastr)),\n );\n};\n\n// --- Helper Functions ---\n\n/**\n * Handles successful HTTP responses, standardizes them, shows notifications, and transforms for consumers.\n */\nfunction handleSuccessResponse(\n event: HttpResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): HttpResponse<unknown> {\n const body = event.body;\n\n // Standardize the response to always have ApiResponse structure\n const standardizedResponse = standardizeApiResponse(body);\n\n // Handle toast notifications based on standardized response\n handleToastNotifications(standardizedResponse, notificationService, req);\n\n // Return the appropriate data based on response type\n return transformResponseForConsumers(standardizedResponse, event);\n}\n\n/**\n * Handles HTTP errors (from the interceptor chain, not backend ApiResponse).\n */\nfunction handleErrorResponse(error: HttpErrorResponse, notificationService: NotificationService) {\n const status = error.status;\n\n // Only show notifications for critical HTTP-level errors.\n // We avoid showing toasts for 4xx errors, which are handled by the component.\n if (status !== null && shouldShowCriticalErrorNotification(status)) {\n const message = getCriticalErrorMessage(error);\n const title = getErrorTitle(status);\n\n notificationService.error({\n message: message,\n title: title,\n config: { duration: 5000 },\n });\n }\n\n // Always re-throw the error so components/services can handle it.\n return throwError(() => error);\n}\n\n/**\n * Standardizes any response to follow the ApiResponse structure\n */\nfunction standardizeApiResponse(body: unknown): ApiResponse<unknown> {\n // If it's already a proper ApiResponse, return as is\n if (isValidApiResponse(body)) {\n return body;\n }\n\n // If it's a raw data response (no wrapper), wrap it\n if (body && typeof body === 'object' && !('status' in body)) {\n return {\n status: 'success',\n code: '200',\n message: 'Operation completed successfully',\n data: body,\n timestamp: new Date().toISOString(),\n };\n }\n\n // If it's a primitive value, wrap it\n if (body !== null && body !== undefined && typeof body !== 'object') {\n return {\n status: 'success',\n code: '200',\n message: 'Operation completed successfully',\n data: body,\n timestamp: new Date().toISOString(),\n };\n }\n\n // If it's null/undefined, create a success response without data\n return {\n status: 'success',\n code: '200',\n message: 'Operation completed successfully',\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Handles toast notifications based on standardized response\n */\nfunction handleToastNotifications(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): void {\n const shouldShowToast = shouldShowSuccessToast(req);\n const forceShow = req.context.get(SHOW_NOTIFICATIONS);\n const skipNotification = req.context.get(SKIP_NOTIFICATION);\n\n // Determine if we should show notifications, considering overrides\n const showNotifications = forceShow !== undefined ? forceShow : shouldShowToast;\n\n if (skipNotification) return;\n\n // Dynamic handling: Use show() for runtime type selection\n if (\n response.message &&\n showNotifications &&\n ['success', 'warning', 'error'].includes(response.status)\n ) {\n notificationService.show({\n type: response.status as 'success' | 'warning' | 'error',\n message: response.message,\n });\n }\n\n // Handle warnings separately if needed\n if (response.status === 'warning' && response.warnings && response.warnings.length > 0) {\n response.warnings.forEach((warning) => {\n notificationService.show({\n type: 'warning',\n message: warning.message,\n });\n });\n }\n\n // Handle errors separately if needed\n if (response.status === 'error' && response.errors && response.errors.length > 0) {\n response.errors.forEach((error) => {\n notificationService.show({\n type: 'error',\n message: error.message,\n });\n });\n }\n}\n\n/**\n * Transforms the standardized response for consumers\n */\nfunction transformResponseForConsumers(\n response: ApiResponse<unknown>,\n originalEvent: HttpResponse<unknown>,\n): HttpResponse<unknown> {\n switch (response.status) {\n case 'success':\n // For success responses, return the data if it exists, otherwise the full response\n if (response.data !== undefined && response.data !== null) {\n return originalEvent.clone({ body: response.data });\n }\n // For message-only success responses, return the full response\n return originalEvent.clone({ body: response });\n\n case 'warning':\n // For warnings, return data if it exists, otherwise the full response\n if (response.data !== undefined && response.data !== null) {\n return originalEvent.clone({ body: response.data });\n }\n return originalEvent.clone({ body: response });\n\n case 'error':\n // Errors should be thrown, not returned\n throw response;\n\n default:\n return originalEvent.clone({ body: response });\n }\n}\n\n/**\n * Checks if a response is a valid ApiResponse\n */\nfunction isValidApiResponse(response: unknown): response is ApiResponse<unknown> {\n if (response === null || typeof response !== 'object') return false;\n const r = response as Record<string, unknown>;\n return (\n 'status' in r &&\n 'code' in r &&\n typeof r['status'] === 'string' &&\n ['success', 'error', 'warning'].includes(r['status'])\n );\n}\n\n/**\n * Determines whether to show success toast notifications based on the request type.\n */\nfunction shouldShowSuccessToast(req: HttpRequest<unknown>): boolean {\n const url = req.url?.toLowerCase() || '';\n const method = req.method?.toLowerCase() || '';\n\n // Never show for these cases\n const excludedPatterns = [\n 'get',\n '/list',\n '/search',\n '/query',\n '/page',\n '/paginated',\n '/health',\n '/status',\n '/ping',\n ];\n\n if (excludedPatterns.some((pattern) => method === pattern || url.includes(pattern))) {\n return false;\n }\n\n // Always show for these methods\n if (['post', 'put', 'patch', 'delete'].includes(method)) {\n return true;\n }\n\n // Default behavior\n return method !== 'get';\n}\n\n/**\n * Determines if we should show a notification for this HTTP error.\n */\nfunction shouldShowCriticalErrorNotification(status: number): boolean {\n // Show notifications for:\n // - Network errors (status 0)\n // - Server errors (5xx)\n return status === 0 || (status >= 500 && status < 600);\n}\n\n/**\n * Gets the appropriate title for error notifications.\n */\nfunction getErrorTitle(status: number): string {\n if (status === 0) return 'Connection Error';\n if (status >= 500) return 'Server Error';\n return 'Error';\n}\n\n/**\n * Gets the appropriate message for critical errors.\n */\nfunction getCriticalErrorMessage(error: HttpErrorResponse): string {\n if (error.status === 0) {\n return 'Unable to connect to the server. Please check your network connection.';\n }\n\n if (error.status >= 500) {\n return (\n error.error?.message || error.message || 'A server error occurred. Please try again later.'\n );\n }\n\n return error.error?.message || error.message || 'An unexpected error occurred';\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport { HttpRequestLog, HttpErrorLog } from '../interceptors';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoggingService {\n private environment = inject(ENVIRONMENT);\n\n log(level: 'info' | 'warn' | 'error', message: string, context?: unknown): void {\n if (this.environment.isProduction) {\n // Production logging (e.g., to external service)\n this.logToExternalService(level, message, context);\n } else {\n // Development logging - only log in development mode\n if (!this.environment.isProduction) {\n console[level](`[${level.toUpperCase()}] ${message}`, context);\n }\n }\n }\n\n info(message: string, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: string, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: string, context?: unknown): void {\n this.log('error', message, context);\n }\n\n // HTTP Request Logging\n logHttpRequest(log: HttpRequestLog): void {\n this.info(`HTTP Request - ${log.method} ${log.url}`, {\n requestId: log.requestId,\n correlationId: log.correlationId,\n tenantId: log.tenantId,\n headers: log.headers,\n isCustomUrl: log.isCustomUrl,\n timestamp: log.timestamp,\n });\n }\n\n // HTTP Error Logging\n logHttpError(error: HttpErrorLog): void {\n this.error(`HTTP Error - ${error.method} ${error.url}`, {\n status: error.status,\n statusText: error.statusText,\n requestId: error.requestId,\n correlationId: error.correlationId,\n tenantId: error.tenantId,\n errorDetails: error.errorDetails,\n environment: error.environment,\n timestamp: error.timestamp,\n });\n }\n\n // Network Error Logging\n logNetworkError(correlationId: string): void {\n this.error('Network connection failed', {\n type: 'network-error',\n correlationId,\n userAgent: navigator.userAgent,\n online: navigator.onLine,\n });\n }\n\n // Rate Limit Error Logging\n logRateLimitError(correlationId: string, url: string): void {\n this.warn('Rate limit exceeded', {\n type: 'rate-limit-error',\n correlationId,\n url,\n });\n }\n\n private logToExternalService(_level: string, _message: string, _context?: unknown): void {\n // Implement external logging service integration\n // e.g., Sentry, LogRocket, etc.\n // This is a placeholder for production logging implementation\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { LoggingService } from './logging-service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TenantInfo {\n private tenantId: string | null = null;\n private logger = inject(LoggingService);\n\n getTenantId(): string {\n if (!this.tenantId) {\n // Get from localStorage, sessionStorage, or JWT token\n this.tenantId =\n localStorage.getItem('tenantId') ||\n sessionStorage.getItem('tenantId') ||\n this.extractTenantFromToken() ||\n 'default-tenant';\n }\n return this.tenantId;\n }\n\n getCurrentTenant(): string | null {\n return this.tenantId;\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n localStorage.setItem('tenantId', tenantId);\n }\n\n setTenant(tenantId: string): void {\n this.setTenantId(tenantId);\n }\n\n handleForbidden(): void {\n this.logger.error('Access forbidden for tenant:', this.tenantId);\n // Redirect to tenant selection or show error message\n // this.router.navigate(['/tenant-access-denied']);\n }\n\n private extractTenantFromToken(): string | null {\n // Implementation depends on your JWT token structure\n // This is a placeholder\n return null;\n }\n\n clearTenant(): void {\n this.tenantId = null;\n localStorage.removeItem('tenantId');\n sessionStorage.removeItem('tenantId');\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CorrelationInfo {\n private correlationId = signal<string | null>(null);\n private readonly CORRELATION_KEY = 'correlation-id';\n\n // Signal-based getter for reactive updates\n readonly currentCorrelationId = computed(() => this.correlationId());\n\n getOrCreateCorrelationId(): string {\n if (!this.correlationId()) {\n // Try to get from sessionStorage first (for page refreshes)\n const id = sessionStorage.getItem(this.CORRELATION_KEY) || crypto.randomUUID();\n this.correlationId.set(id);\n sessionStorage.setItem(this.CORRELATION_KEY, id);\n }\n return this.correlationId()!;\n }\n\n setCorrelationId(correlationId: string): void {\n this.correlationId.set(correlationId);\n sessionStorage.setItem(this.CORRELATION_KEY, correlationId);\n }\n\n resetCorrelationId(): void {\n this.correlationId.set(null);\n sessionStorage.removeItem(this.CORRELATION_KEY);\n }\n\n getId(): string {\n return this.getOrCreateCorrelationId();\n }\n}\n","import { inject, InjectionToken } from '@angular/core'; // Import InjectionToken\nimport { Router } from '@angular/router';\nimport {\n HttpContextToken,\n HttpContext,\n HttpInterceptorFn,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { catchError, throwError, switchMap, Observable } from 'rxjs';\n\n// Environment and configuration\nimport { AUTH_TOKEN, ENVIRONMENT } from '@acontplus/ng-config';\n\n// Services\nimport { TenantInfo } from '../services/tenant-info';\nimport { CorrelationInfo } from '../services/correlation-info';\nimport { LoggingService } from '../services/logging-service';\n\n// HTTP Context tokens\nconst CUSTOM_URL = new HttpContextToken<boolean>(() => false);\nconst SKIP_CONTEXT_HEADERS = new HttpContextToken<boolean>(() => false);\nconst CUSTOM_HEADERS = new HttpContextToken<Record<string, string>>(() => ({}));\n\n// Helper functions for HTTP context\nexport function customUrl() {\n return new HttpContext().set(CUSTOM_URL, true);\n}\n\nexport function skipContextHeaders() {\n return new HttpContext().set(SKIP_CONTEXT_HEADERS, true);\n}\n\nexport function withCustomHeaders(headers: Record<string, string>) {\n return new HttpContext().set(CUSTOM_HEADERS, headers);\n}\n\n// Configuration interface for library consumers\nexport interface HttpContextConfig {\n enableCorrelationTracking?: boolean;\n enableRequestLogging?: boolean;\n enableErrorLogging?: boolean;\n customHeaders?: Record<string, string | (() => string)>;\n clientVersion?: string;\n tenantIdHeader?: string;\n correlationIdHeader?: string;\n requestIdHeader?: string;\n timestampHeader?: string;\n excludeUrls?: string[];\n includeAuthToken?: boolean;\n baseUrlInjection?: boolean;\n refreshTokenCallback?: () => Observable<{ token: string; refreshToken?: string }>;\n logoutCallback?: () => void;\n}\n\n// Default configuration\nconst DEFAULT_CONFIG: Required<HttpContextConfig> = {\n enableCorrelationTracking: true,\n enableRequestLogging: false, // This will be overridden by environment.isProduction\n enableErrorLogging: true,\n customHeaders: {},\n clientVersion: '1.0.0',\n tenantIdHeader: 'Tenant-Id',\n correlationIdHeader: 'Correlation-Id',\n requestIdHeader: 'Request-Id',\n timestampHeader: 'Timestamp',\n excludeUrls: [],\n includeAuthToken: true,\n baseUrlInjection: true,\n refreshTokenCallback: undefined as any,\n logoutCallback: undefined as any,\n};\n\n// Injection token for configuration - FIXED\nexport const HTTP_CONTEXT_CONFIG = new InjectionToken<HttpContextConfig>('HTTP_CONTEXT_CONFIG', {\n factory: () => DEFAULT_CONFIG, // Provide a default factory in case it's not provided\n});\n\nexport const httpContextInterceptor: HttpInterceptorFn = (req, next) => {\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n console.log(tokenProvider);\n const router = inject(Router);\n const tenantService = inject(TenantInfo);\n const correlationService = inject(CorrelationInfo);\n const loggingService = inject(LoggingService);\n const environment = inject(ENVIRONMENT);\n\n // Get configuration (with fallback to default) - FIXED\n const config: Required<HttpContextConfig> = {\n ...DEFAULT_CONFIG,\n // The default enableRequestLogging needs to be set based on environment here,\n // as it's dynamic, and DEFAULT_CONFIG is static.\n enableRequestLogging: !environment.isProduction,\n ...inject(HTTP_CONTEXT_CONFIG, { optional: true }),\n };\n\n // Check HTTP context tokens\n const isCustomUrl = req.context.get(CUSTOM_URL);\n const skipHeaders = req.context.get(SKIP_CONTEXT_HEADERS);\n const contextHeaders = req.context.get(CUSTOM_HEADERS);\n\n // Skip processing if headers are disabled for this request\n if (skipHeaders) {\n return next(req);\n }\n\n // Check if URL should be excluded\n const shouldExclude = config.excludeUrls.some(\n (url) => req.url.includes(url) || new RegExp(url).test(req.url),\n );\n\n if (shouldExclude) {\n return next(req);\n }\n\n // Skip auth for login, register, and refresh endpoints\n const skipAuth =\n req.url.includes('/login') || req.url.includes('/register') || req.url.includes('/refresh');\n\n // Handle URL transformation\n const baseUrl = environment.apiBaseUrl;\n const finalUrl = isCustomUrl || !config.baseUrlInjection ? req.url : `${baseUrl}${req.url}`;\n\n // Generate or get correlation context\n const correlationId = config.enableCorrelationTracking\n ? correlationService.getOrCreateCorrelationId()\n : crypto.randomUUID();\n const tenantId = tenantService.getTenantId();\n const requestId = crypto.randomUUID();\n\n // Build dynamic headers\n const headers: Record<string, string> = {};\n\n // Core context headers\n headers[config.requestIdHeader] = requestId;\n\n if (config.enableCorrelationTracking) {\n headers[config.correlationIdHeader] = correlationId;\n }\n\n if (tenantId) {\n headers[config.tenantIdHeader] = tenantId;\n }\n\n headers[config.timestampHeader] = new Date().toISOString();\n\n // Client information\n if (config.clientVersion) {\n headers['Client-Version'] = config.clientVersion;\n }\n\n // Environment client ID\n if (environment.clientId) {\n headers['Client-Id'] = environment.clientId;\n }\n\n // Add authorization header if configured and available\n if (config.includeAuthToken && !skipAuth) {\n const authToken = tokenProvider?.getToken();\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n }\n\n // Process custom headers from configuration (can be static values or dynamic functions)\n Object.entries(config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n // Add headers from HTTP context\n Object.entries(contextHeaders).forEach(([key, value]) => {\n headers[key] = value;\n });\n\n // Add content-type for data requests if not already set\n if (\n ['POST', 'PUT', 'PATCH'].includes(req.method.toUpperCase()) &&\n !req.headers.has('Content-Type')\n ) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Clone request with enhanced headers and URL\n const enhancedReq = req.clone({\n url: finalUrl,\n setHeaders: headers,\n });\n\n // Log outgoing request if enabled\n if (config.enableRequestLogging) {\n loggingService.logHttpRequest({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n timestamp: new Date().toISOString(),\n headers: Object.keys(headers),\n isCustomUrl,\n });\n }\n\n // If request has auth header, handle with refresh logic\n if (headers['Authorization'] && config.refreshTokenCallback) {\n return next(enhancedReq).pipe(\n catchError((error) => {\n // If 401 Unauthorized, try to refresh token\n if (error.status === 401) {\n const refreshToken = tokenProvider?.getRefreshToken?.();\n if (refreshToken && refreshToken.trim().length > 0) {\n return config.refreshTokenCallback()!.pipe(\n switchMap((newTokens) => {\n // Retry the original request with new token\n const retryReq = req.clone({\n url: finalUrl,\n setHeaders: { ...headers, Authorization: `Bearer ${newTokens.token}` },\n });\n return next(retryReq);\n }),\n catchError((refreshError) => {\n // Refresh failed, logout user\n config.logoutCallback?.();\n return throwError(() => refreshError);\n }),\n );\n }\n }\n\n // Enhanced error logging with context\n if (config.enableErrorLogging) {\n loggingService.logHttpError({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n status: error.status,\n statusText: error.statusText,\n message: error.message,\n timestamp: new Date().toISOString(),\n errorDetails: error.error,\n environment: environment.clientId,\n isCustomUrl,\n headers: [], // Headers are not included in HttpErrorResponse by default, adjust if needed\n });\n }\n\n // Handle other error scenarios\n switch (error.status) {\n case 403:\n tenantService.handleForbidden();\n break;\n case 0:\n loggingService.logNetworkError(correlationId);\n break;\n case 429:\n loggingService.logRateLimitError(correlationId, finalUrl);\n break;\n }\n\n return throwError(() => error);\n }),\n );\n } else {\n // No auth header, use standard error handling\n return next(enhancedReq).pipe(\n catchError((error: HttpErrorResponse) => {\n // Enhanced error logging with context\n if (config.enableErrorLogging) {\n loggingService.logHttpError({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n status: error.status,\n statusText: error.statusText,\n message: error.message,\n timestamp: new Date().toISOString(),\n errorDetails: error.error,\n environment: environment.clientId,\n isCustomUrl,\n headers: [], // Headers are not included in HttpErrorResponse by default, adjust if needed\n });\n }\n\n // Handle specific error scenarios\n switch (error.status) {\n case 401: {\n loggingService.error('Unauthorized access - token expired or invalid');\n // Note: Token clearing should be handled by the auth service, not infrastructure\n router.navigate([`/${environment.loginRoute}`]);\n break;\n }\n case 403:\n tenantService.handleForbidden();\n break;\n case 0:\n loggingService.logNetworkError(correlationId);\n break;\n case 429:\n loggingService.logRateLimitError(correlationId, finalUrl);\n break;\n }\n\n return throwError(() => error);\n }),\n );\n }\n};\n\n// Supporting repositories for type safety\nexport interface HttpRequestLog {\n method: string;\n url: string;\n originalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n timestamp: string;\n headers: string[];\n isCustomUrl: boolean;\n}\n\nexport interface HttpErrorLog extends HttpRequestLog {\n status: number;\n statusText: string;\n message: string;\n errorDetails: unknown;\n environment: string;\n}\n\n// Helper function to create configuration\nexport function createHttpContextConfig(\n overrides: Partial<HttpContextConfig> = {},\n): HttpContextConfig {\n return {\n ...DEFAULT_CONFIG,\n ...overrides,\n };\n}\n\n// Provider function for easy setup\nexport function provideHttpContext(config: Partial<HttpContextConfig> = {}) {\n return [\n {\n provide: HTTP_CONTEXT_CONFIG,\n useValue: createHttpContextConfig(config),\n },\n ];\n}\n","import {\n HttpContext,\n HttpContextToken,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\n\nimport { finalize } from 'rxjs/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { OverlayService } from '@acontplus/ng-components';\n/**\n * Token to determine if a request should show spinner\n * Default is true (show spinner for all requests)\n */\nconst SHOW_SPINNER = new HttpContextToken<boolean>(() => true);\n\nconst requests: HttpRequest<unknown>[] = [];\n\n/**\n * Helper function to disable spinner for specific requests\n * @returns HttpContext with spinner disabled\n */\nexport function withoutSpinner() {\n return new HttpContext().set(SHOW_SPINNER, false);\n}\n\n/**\n * Service to track active HTTP requests\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ActiveRequestsTracker {\n get count(): number {\n return requests.length;\n }\n\n add(request: HttpRequest<unknown>): void {\n requests.push(request);\n }\n\n remove(request: HttpRequest<unknown>): void {\n const index = requests.indexOf(request);\n if (index >= 0) {\n requests.splice(index, 1);\n }\n }\n}\n\n/**\n * Interceptor that shows/hides a loading spinner based on active HTTP requests\n */\nexport const spinnerInterceptor: HttpInterceptorFn = (req, next) => {\n // Track active requests requiring spinner\n const activeRequests = inject(ActiveRequestsTracker);\n const overlayService = inject(OverlayService);\n\n // Skip spinner if disabled for this request\n if (!req.context.get(SHOW_SPINNER)) {\n return next(req);\n }\n\n // Add request to tracking\n activeRequests.add(req);\n\n // Show spinner if this is the first active request\n if (activeRequests.count === 1) {\n overlayService.showSpinner();\n }\n\n return next(req).pipe(\n finalize(() => {\n // Remove request and hide spinner if no more active requests\n activeRequests.remove(req);\n if (activeRequests.count === 0) {\n overlayService.hideSpinner();\n }\n }),\n );\n};\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { RepositoryConfig } from '@acontplus/core';\n\n@Injectable()\nexport abstract class BaseHttpRepository {\n protected http = inject(HttpClient);\n protected abstract config: RepositoryConfig; // Abstract property\n\n protected buildUrl(path = ''): string {\n const baseUrl = this.config.baseUrl || '/api';\n const version = this.config.version ? `/v${this.config.version}` : '';\n const endpoint = path ? `${this.config.endpoint}/${path}` : this.config.endpoint;\n\n return `${baseUrl}${version}/${endpoint}`.replace(/\\/+/g, '/');\n }\n\n protected get<T>(path = '', params?: Record<string, string | number | boolean>): Observable<T> {\n return this.http.get<T>(this.buildUrl(path), { params });\n }\n\n protected post<T>(path = '', body: unknown): Observable<T> {\n return this.http.post<T>(this.buildUrl(path), body);\n }\n\n protected put<T>(path = '', body: unknown): Observable<T> {\n return this.http.put<T>(this.buildUrl(path), body);\n }\n\n protected patch<T>(path = '', body?: unknown): Observable<T> {\n return this.http.patch<T>(this.buildUrl(path), body);\n }\n\n protected delete<T>(path = ''): Observable<T> {\n return this.http.delete<T>(this.buildUrl(path));\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseHttpRepository } from './base-http-repository';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository, SearchableRepository } from '@acontplus/ng-config';\n\n// Create an injection token for RepositoryConfig\nexport const REPOSITORY_CONFIG = new InjectionToken<RepositoryConfig>('REPOSITORY_CONFIG');\n\n@Injectable()\nexport class GenericRepository<TEntity = any, TId extends string | number = number>\n extends BaseHttpRepository\n implements BaseRepository<TEntity, TId>\n{\n protected override config: RepositoryConfig;\n\n constructor() {\n const config = inject<RepositoryConfig>(REPOSITORY_CONFIG);\n super();\n this.config = config;\n }\n\n getById(id: TId): Observable<TEntity> {\n return this.get<TEntity>(id.toString());\n }\n\n getAll(pagination?: PaginationParams): Observable<PagedResult<TEntity>> {\n const params = this.buildParams(pagination);\n return this.get<PagedResult<TEntity>>('', params);\n }\n\n create(entity: Partial<TEntity>): Observable<TEntity> {\n return this.post<TEntity>('', entity);\n }\n\n update(id: TId, entity: Partial<TEntity>): Observable<TEntity> {\n return this.put<TEntity>(id.toString(), entity);\n }\n\n remove(id: TId): Observable<void> {\n return super.delete<void>(id.toString());\n }\n\n protected buildParams(pagination?: PaginationParams, filters?: Record<string, any>): any {\n const params: any = {};\n\n if (pagination) {\n params.pageIndex = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n\n if (filters) {\n Object.assign(params, filters);\n }\n\n return params;\n }\n}\n\n@Injectable()\nexport class SearchableGenericRepository<TEntity = any, TId extends string | number = number>\n extends GenericRepository<TEntity, TId>\n implements SearchableRepository<TEntity, TId>\n{\n search(query: string, pagination: PaginationParams): Observable<PagedResult<TEntity>> {\n const searchFilters = { q: query };\n const params = this.buildParams(pagination, searchFilters);\n return this.get<PagedResult<TEntity>>('search', params);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository } from '@acontplus/ng-config';\n\n@Injectable({ providedIn: 'root' })\nexport class RepositoryFactory {\n private http = inject(HttpClient);\n\n create<TEntity, TId extends string | number = number>(\n config: RepositoryConfig,\n ): BaseRepository<TEntity, TId> {\n const buildUrl = (path = '') => {\n const baseUrl = config.baseUrl || '/api';\n const version = config.version ? `/v${config.version}` : '';\n const endpoint = path ? `${config.endpoint}/${path}` : config.endpoint;\n return `${baseUrl}${version}/${endpoint}`.replace(/\\/+/g, '/');\n };\n\n const buildParams = (pagination?: PaginationParams) => {\n const params: any = {};\n if (pagination) {\n params.page = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n return params;\n };\n\n // Safe ID conversion function\n const idToString = (id: TId): string => {\n if (typeof id === 'string' || typeof id === 'number' || typeof id === 'bigint') {\n return id.toString();\n }\n // Fallback for other types - you might want to handle this differently\n return String(id);\n };\n\n return {\n getById: (id: TId) => this.http.get<TEntity>(buildUrl(idToString(id))),\n\n getAll: (pagination?) =>\n this.http.get<PagedResult<TEntity>>(buildUrl(), {\n params: buildParams(pagination),\n }),\n\n create: (entity: Partial<TEntity>) => this.http.post<TEntity>(buildUrl(), entity),\n\n update: (id: TId, entity: Partial<TEntity>) =>\n this.http.put<TEntity>(buildUrl(idToString(id)), entity),\n\n remove: (id: TId) => this.http.delete<void>(buildUrl(idToString(id))),\n };\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { HttpOptions, HttpPort } from '@acontplus/core';\n\nfunction mergeUrl(baseURL: string | undefined, endpoint: string): string {\n if (!baseURL) return endpoint;\n return `${baseURL.replace(/\\/+$/, '')}/${endpoint.replace(/^\\/+/, '')}`;\n}\n\nexport class AngularHttpAdapter implements HttpPort {\n constructor(\n private readonly http: HttpClient,\n private readonly baseURL?: string,\n ) {}\n\n private buildOptions(options?: HttpOptions) {\n return {\n headers: options?.headers ?? {},\n params: options?.params ?? {},\n };\n }\n\n private async request<T>(params: {\n method: 'get' | 'post' | 'put' | 'delete';\n url: string;\n data?: unknown;\n options?: HttpOptions;\n }): Promise<T> {\n const fullUrl = mergeUrl(this.baseURL, params.url);\n const httpOptions = this.buildOptions(params.options);\n\n const observable = this.http.request<T>(params.method, fullUrl, {\n body: params.data,\n ...httpOptions,\n });\n\n return await lastValueFrom(observable);\n }\n\n /** GET */\n get<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'get', url, options });\n }\n\n /** POST */\n post<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'post', url, data, options });\n }\n\n /** PUT */\n put<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'put', url, data, options });\n }\n\n /** DELETE */\n delete<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'delete', url, options });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CORE_CONFIG, DEFAULT_CONFIG, ENVIRONMENT } from '@acontplus/ng-config';\nimport { CoreConfig } from '@acontplus/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CoreConfigService {\n private config: Required<CoreConfig>;\n private environment = inject(ENVIRONMENT);\n\n constructor() {\n this.config = this.initializeConfig();\n }\n\n /**\n * Initialize configuration with defaults and environment overrides\n */\n private initializeConfig(): Required<CoreConfig> {\n const injectedConfig = inject(CORE_CONFIG, { optional: true });\n\n return {\n ...DEFAULT_CONFIG,\n // Environment overrides\n apiBaseUrl: this.environment.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl,\n enableRequestLogging: !this.environment.isProduction,\n // Injected config overrides\n ...injectedConfig,\n };\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Required<CoreConfig> {\n return { ...this.config };\n }\n\n /**\n * Update configuration at runtime\n */\n updateConfig(updates: Partial<CoreConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n /**\n * Get a specific configuration value\n */\n get<K extends keyof CoreConfig>(key: K): CoreConfig[K] {\n return this.config[key];\n }\n\n /**\n * Check if a feature is enabled\n */\n isFeatureEnabled(feature: keyof CoreConfig): boolean {\n const value = this.config[feature];\n return typeof value === 'boolean' ? value : false;\n }\n\n /**\n * Get API URL for a specific entity\n */\n getApiUrl(entityName?: string): string {\n const baseUrl = this.config.apiBaseUrl;\n if (!entityName) return baseUrl;\n return `${baseUrl}/${entityName}`.replace(/\\/+/g, '/');\n }\n\n /**\n * Check if a URL should be excluded from processing\n */\n shouldExcludeUrl(url: string): boolean {\n return this.config.excludeUrls.some(\n (excludePattern) => url.includes(excludePattern) || new RegExp(excludePattern).test(url),\n );\n }\n\n /**\n * Check if a method should be excluded from processing\n */\n shouldExcludeMethod(method: string): boolean {\n return this.config.excludeMethods.some(\n (excludeMethod) => excludeMethod.toLowerCase() === method.toLowerCase(),\n );\n }\n\n /**\n * Get custom headers with dynamic values resolved\n */\n getCustomHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n return headers;\n }\n\n /**\n * Reset configuration to defaults\n */\n resetConfig(): void {\n this.config = this.initializeConfig();\n }\n}\n\n// Provider function for easy setup\nexport function provideCoreConfig(config: Partial<CoreConfig> = {}) {\n return [\n {\n provide: CORE_CONFIG,\n useValue: config,\n },\n ];\n}\n\n// Helper function to create configuration\nexport function createCoreConfig(overrides: Partial<CoreConfig> = {}): CoreConfig {\n return {\n ...DEFAULT_CONFIG,\n ...overrides,\n };\n}\n","import { Observable } from 'rxjs';\n\nexport interface UseCase<TRequest = void, TResponse = void> {\n execute(request: TRequest): Observable<TResponse>;\n}\n\nexport abstract class BaseUseCase<TRequest = void, TResponse = void> implements UseCase<\n TRequest,\n TResponse\n> {\n abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\n// Only create commands if you have complex validation logic\nexport abstract class Command<TRequest, TResponse = void> extends BaseUseCase<TRequest, TResponse> {\n // Simple validation - override only when needed\n protected validate(_request: TRequest): string[] {\n return []; // Return array of error messages\n }\n\n override execute(request: TRequest): Observable<TResponse> {\n const errors = this.validate(request);\n if (errors.length > 0) {\n return throwError(() => ({\n status: 'error',\n code: 'VALIDATION_FAILED',\n message: 'Validation failed',\n errors: errors.map((msg) => ({ code: 'VALIDATION', message: msg })),\n timestamp: new Date().toISOString(),\n }));\n }\n\n return this.executeInternal(request).pipe(\n catchError((error) => {\n // Log the error for debugging\n const logger = inject(LoggingService);\n logger.error('An error occurred during command execution:', error);\n\n // Re-throw the error so the caller can handle it\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\nexport abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest, TResponse> {\n override execute(request: TRequest): Observable<TResponse> {\n return this.executeInternal(request).pipe(\n catchError((error) => {\n const logger = inject(LoggingService);\n logger.error('An error occurred during query execution:', error);\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError","DEFAULT_CONFIG"],"mappings":"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"}
1
+ {"version":3,"file":"acontplus-ng-infrastructure.mjs","sources":["../../../../packages/ng-infrastructure/src/lib/interceptors/api-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/services/logging-service.ts","../../../../packages/ng-infrastructure/src/lib/services/tenant-info.ts","../../../../packages/ng-infrastructure/src/lib/services/correlation-info.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/http-context-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/spinner-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/repositories/base-http-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/generic-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/repository-factory.ts","../../../../packages/ng-infrastructure/src/lib/adapters/angular-http-adapter.ts","../../../../packages/ng-infrastructure/src/lib/services/core-config-service.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/base-use-case.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/commands.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/queries.ts","../../../../packages/ng-infrastructure/src/acontplus-ng-infrastructure.ts"],"sourcesContent":["import {\n HttpInterceptorFn,\n HttpEvent,\n HttpResponse,\n HttpErrorResponse,\n HttpRequest,\n HttpContextToken,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, switchMap, of, timer, retry, throwError, Observable } from 'rxjs';\nimport { ApiResponse } from '@acontplus/core';\nimport { NotificationService } from '@acontplus/ng-notifications';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Skip all toast notifications for a specific request.\n * Usage: new HttpContext().set(SKIP_NOTIFICATION, true)\n */\nexport const SKIP_NOTIFICATION = new HttpContextToken<boolean>(() => false);\n\n/**\n * Force-show or force-hide notifications, overriding URL/method exclusion logic.\n * Usage: new HttpContext().set(SHOW_NOTIFICATIONS, true)\n */\nexport const SHOW_NOTIFICATIONS = new HttpContextToken<boolean | undefined>(() => undefined);\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const apiInterceptor: HttpInterceptorFn = (req, next) => {\n const toastr = inject(NotificationService);\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n\n // Attach Bearer token when available\n const token = tokenProvider?.getToken();\n const modifiedReq = token ? req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }) : req;\n\n return next(modifiedReq).pipe(\n // Retry only on network errors or 5xx — never on 4xx client errors.\n // Uses exponential back-off: 1 s, 2 s.\n retry({\n count: 2,\n delay: (error: HttpErrorResponse, attempt) => {\n const isRetryable = error.status === 0 || (error.status >= 500 && error.status < 600);\n if (!isRetryable) throw error; // 4xx — do not retry, bubble up immediately\n return timer(1000 * attempt); // attempt 1 → 1 s, attempt 2 → 2 s\n },\n }),\n\n // Handle successful responses via switchMap so we can return an Observable\n // (needed to properly throw ApiResponse errors into the RxJS stream).\n switchMap((event: HttpEvent<unknown>) => {\n if (event instanceof HttpResponse) {\n const standardized = standardizeApiResponse(event.body);\n handleToastNotifications(standardized, toastr, req);\n\n if (standardized.status === 'error') {\n handleApiResponseError(standardized, toastr, req);\n return throwError(() => standardized);\n }\n\n return of(transformResponseForConsumers(standardized, event));\n }\n return of(event);\n }),\n\n // Handle HTTP-level errors — show notification for critical errors, always re-throw.\n catchError((error: HttpErrorResponse) => handleHttpError(error, toastr)),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Standardisation\n// ---------------------------------------------------------------------------\n\nfunction standardizeApiResponse(body: unknown): ApiResponse<unknown> {\n if (isValidApiResponse(body)) return body;\n\n // Raw object without ApiResponse wrapper\n if (body !== null && body !== undefined && typeof body === 'object' && !('status' in body)) {\n return wrapSuccess(body);\n }\n\n // Primitive value\n if (body !== null && body !== undefined && typeof body !== 'object') {\n return wrapSuccess(body);\n }\n\n // null / undefined\n return wrapSuccess(undefined);\n}\n\nfunction wrapSuccess(data: unknown): ApiResponse<unknown> {\n return {\n status: 'success',\n code: '200',\n message: 'Operation completed successfully',\n data,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction isValidApiResponse(response: unknown): response is ApiResponse<unknown> {\n if (response === null || typeof response !== 'object') return false;\n const r = response as Record<string, unknown>;\n return (\n 'status' in r &&\n 'code' in r &&\n typeof r['status'] === 'string' &&\n ['success', 'error', 'warning'].includes(r['status'] as string)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Notifications\n// ---------------------------------------------------------------------------\n\nfunction handleToastNotifications(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): void {\n // SKIP_NOTIFICATION always wins — even over SHOW_NOTIFICATIONS\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const forceShow = req.context.get(SHOW_NOTIFICATIONS);\n const autoShow = shouldShowSuccessToast(req);\n const showNotifications = forceShow !== undefined ? forceShow : autoShow;\n\n if (!showNotifications) return;\n if (!response.message) return;\n if (!(['success', 'warning', 'error'] as string[]).includes(response.status)) return;\n\n // Primary notification — show main message once\n notificationService.show({\n type: response.status as 'success' | 'warning' | 'error',\n message: response.message,\n });\n\n // Secondary: show individual warnings only when no primary message covered them\n if (response.status === 'warning' && response.warnings?.length && !response.message) {\n response.warnings.forEach((w) =>\n notificationService.show({ type: 'warning', message: w.message }),\n );\n }\n\n // Secondary: show individual errors only when no primary message covered them\n if (response.status === 'error' && response.errors?.length && !response.message) {\n response.errors.forEach((e) => notificationService.show({ type: 'error', message: e.message }));\n }\n}\n\nfunction handleApiResponseError(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): void {\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const message =\n response.message || response.errors?.[0]?.message || 'An unexpected error occurred';\n\n notificationService.error({ message, config: { duration: 5000 } });\n}\n\n// ---------------------------------------------------------------------------\n// Response transformation\n// ---------------------------------------------------------------------------\n\nfunction transformResponseForConsumers(\n response: ApiResponse<unknown>,\n originalEvent: HttpResponse<unknown>,\n): HttpResponse<unknown> {\n switch (response.status) {\n case 'success':\n case 'warning':\n // Unwrap data for consumers; fall back to full envelope when no data\n return response.data !== undefined && response.data !== null\n ? originalEvent.clone({ body: response.data })\n : originalEvent.clone({ body: response });\n\n case 'error':\n // Already handled in switchMap — this is a safety fallback\n return originalEvent.clone({ body: response });\n\n default:\n return originalEvent.clone({ body: response });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error handling\n// ---------------------------------------------------------------------------\n\nfunction handleHttpError(\n error: HttpErrorResponse,\n notificationService: NotificationService,\n): Observable<never> {\n if (shouldShowCriticalErrorNotification(error.status)) {\n notificationService.error({\n message: getCriticalErrorMessage(error),\n title: getErrorTitle(error.status),\n config: { duration: 5000 },\n });\n }\n return throwError(() => error);\n}\n\nfunction shouldShowCriticalErrorNotification(status: number): boolean {\n return status === 0 || (status >= 500 && status < 600);\n}\n\nfunction getErrorTitle(status: number): string {\n if (status === 0) return 'Connection Error';\n if (status >= 500) return 'Server Error';\n return 'Error';\n}\n\nfunction getCriticalErrorMessage(error: HttpErrorResponse): string {\n if (error.status === 0) {\n return 'Unable to connect to the server. Please check your network connection.';\n }\n if (error.status >= 500) {\n return (\n error.error?.message ?? error.message ?? 'A server error occurred. Please try again later.'\n );\n }\n return error.error?.message ?? error.message ?? 'An unexpected error occurred';\n}\n\n// ---------------------------------------------------------------------------\n// Utility: decide whether to auto-show toast\n// ---------------------------------------------------------------------------\n\nconst MUTABLE_METHODS = new Set(['post', 'put', 'patch', 'delete']);\n\nconst EXCLUDED_URL_PATTERNS = [\n '/list',\n '/search',\n '/query',\n '/page',\n '/paginated',\n '/health',\n '/status',\n '/ping',\n];\n\nfunction shouldShowSuccessToast(req: HttpRequest<unknown>): boolean {\n const method = req.method.toLowerCase();\n const url = req.url.toLowerCase();\n\n if (!MUTABLE_METHODS.has(method)) return false;\n if (EXCLUDED_URL_PATTERNS.some((p) => url.includes(p))) return false;\n\n return true;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport { HttpRequestLog, HttpErrorLog } from '../interceptors';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoggingService {\n private environment = inject(ENVIRONMENT);\n\n log(level: 'info' | 'warn' | 'error', message: string, context?: unknown): void {\n if (this.environment.isProduction) {\n // Production logging (e.g., to external service)\n this.logToExternalService(level, message, context);\n } else {\n // Development logging - only log in development mode\n if (!this.environment.isProduction) {\n console[level](`[${level.toUpperCase()}] ${message}`, context);\n }\n }\n }\n\n info(message: string, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: string, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: string, context?: unknown): void {\n this.log('error', message, context);\n }\n\n // HTTP Request Logging\n logHttpRequest(log: HttpRequestLog): void {\n this.info(`HTTP Request - ${log.method} ${log.url}`, {\n requestId: log.requestId,\n correlationId: log.correlationId,\n tenantId: log.tenantId,\n headers: log.headers,\n isCustomUrl: log.isCustomUrl,\n timestamp: log.timestamp,\n });\n }\n\n // HTTP Error Logging\n logHttpError(error: HttpErrorLog): void {\n this.error(`HTTP Error - ${error.method} ${error.url}`, {\n status: error.status,\n statusText: error.statusText,\n requestId: error.requestId,\n correlationId: error.correlationId,\n tenantId: error.tenantId,\n errorDetails: error.errorDetails,\n environment: error.environment,\n timestamp: error.timestamp,\n });\n }\n\n // Network Error Logging\n logNetworkError(correlationId: string): void {\n this.error('Network connection failed', {\n type: 'network-error',\n correlationId,\n userAgent: navigator.userAgent,\n online: navigator.onLine,\n });\n }\n\n // Rate Limit Error Logging\n logRateLimitError(correlationId: string, url: string): void {\n this.warn('Rate limit exceeded', {\n type: 'rate-limit-error',\n correlationId,\n url,\n });\n }\n\n private logToExternalService(_level: string, _message: string, _context?: unknown): void {\n // Implement external logging service integration\n // e.g., Sentry, LogRocket, etc.\n // This is a placeholder for production logging implementation\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { LoggingService } from './logging-service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TenantInfo {\n private tenantId: string | null = null;\n private logger = inject(LoggingService);\n\n getTenantId(): string {\n if (!this.tenantId) {\n // Get from localStorage, sessionStorage, or JWT token\n this.tenantId =\n localStorage.getItem('tenantId') ||\n sessionStorage.getItem('tenantId') ||\n this.extractTenantFromToken() ||\n 'default-tenant';\n }\n return this.tenantId;\n }\n\n getCurrentTenant(): string | null {\n return this.tenantId;\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n localStorage.setItem('tenantId', tenantId);\n }\n\n setTenant(tenantId: string): void {\n this.setTenantId(tenantId);\n }\n\n handleForbidden(): void {\n this.logger.error('Access forbidden for tenant:', this.tenantId);\n // Redirect to tenant selection or show error message\n // this.router.navigate(['/tenant-access-denied']);\n }\n\n private extractTenantFromToken(): string | null {\n // Implementation depends on your JWT token structure\n // This is a placeholder\n return null;\n }\n\n clearTenant(): void {\n this.tenantId = null;\n localStorage.removeItem('tenantId');\n sessionStorage.removeItem('tenantId');\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CorrelationInfo {\n private correlationId = signal<string | null>(null);\n private readonly CORRELATION_KEY = 'correlation-id';\n\n // Signal-based getter for reactive updates\n readonly currentCorrelationId = computed(() => this.correlationId());\n\n getOrCreateCorrelationId(): string {\n if (!this.correlationId()) {\n // Try to get from sessionStorage first (for page refreshes)\n const id = sessionStorage.getItem(this.CORRELATION_KEY) || crypto.randomUUID();\n this.correlationId.set(id);\n sessionStorage.setItem(this.CORRELATION_KEY, id);\n }\n return this.correlationId()!;\n }\n\n setCorrelationId(correlationId: string): void {\n this.correlationId.set(correlationId);\n sessionStorage.setItem(this.CORRELATION_KEY, correlationId);\n }\n\n resetCorrelationId(): void {\n this.correlationId.set(null);\n sessionStorage.removeItem(this.CORRELATION_KEY);\n }\n\n getId(): string {\n return this.getOrCreateCorrelationId();\n }\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n HttpContextToken,\n HttpContext,\n HttpInterceptorFn,\n HttpErrorResponse,\n HttpRequest,\n} from '@angular/common/http';\nimport { catchError, throwError, switchMap, Observable } from 'rxjs';\n\nimport { AUTH_TOKEN, ENVIRONMENT } from '@acontplus/ng-config';\nimport { TenantInfo } from '../services/tenant-info';\nimport { CorrelationInfo } from '../services/correlation-info';\nimport { LoggingService } from '../services/logging-service';\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens & helpers\n// ---------------------------------------------------------------------------\n\n/** Mark a request as using an absolute URL (skip base-URL injection). */\nconst CUSTOM_URL = new HttpContextToken<boolean>(() => false);\n\n/** Skip all context headers (correlation, tenant, etc.) for this request. */\nconst SKIP_CONTEXT_HEADERS = new HttpContextToken<boolean>(() => false);\n\n/** Merge additional headers into the request at call-site. */\nconst CUSTOM_HEADERS = new HttpContextToken<Record<string, string>>(() => ({}));\n\nexport function customUrl(): HttpContext {\n return new HttpContext().set(CUSTOM_URL, true);\n}\n\nexport function skipContextHeaders(): HttpContext {\n return new HttpContext().set(SKIP_CONTEXT_HEADERS, true);\n}\n\nexport function withCustomHeaders(headers: Record<string, string>): HttpContext {\n return new HttpContext().set(CUSTOM_HEADERS, headers);\n}\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface HttpContextConfig {\n enableCorrelationTracking?: boolean;\n enableRequestLogging?: boolean;\n enableErrorLogging?: boolean;\n customHeaders?: Record<string, string | (() => string)>;\n clientVersion?: string;\n tenantIdHeader?: string;\n correlationIdHeader?: string;\n requestIdHeader?: string;\n timestampHeader?: string;\n /** URL substrings or regex patterns to exclude from header injection. */\n excludeUrls?: string[];\n /** URL substrings that should NOT receive an Authorization header. */\n skipAuthUrls?: string[];\n includeAuthToken?: boolean;\n baseUrlInjection?: boolean;\n /** Called when a 401 is received and a refresh token is available. */\n refreshTokenCallback?: () => Observable<{ token: string; refreshToken?: string }>;\n /** Called after a failed token refresh — should clear auth state. */\n logoutCallback?: () => void;\n}\n\nconst DEFAULT_CONFIG: Required<HttpContextConfig> = {\n enableCorrelationTracking: true,\n enableRequestLogging: false,\n enableErrorLogging: true,\n customHeaders: {},\n clientVersion: '1.0.0',\n tenantIdHeader: 'Tenant-Id',\n correlationIdHeader: 'Correlation-Id',\n requestIdHeader: 'Request-Id',\n timestampHeader: 'Timestamp',\n excludeUrls: [],\n skipAuthUrls: ['/login', '/register', '/refresh'],\n includeAuthToken: true,\n baseUrlInjection: true,\n refreshTokenCallback: undefined as any,\n logoutCallback: undefined as any,\n};\n\nexport const HTTP_CONTEXT_CONFIG = new InjectionToken<HttpContextConfig>('HTTP_CONTEXT_CONFIG', {\n factory: () => DEFAULT_CONFIG,\n});\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const httpContextInterceptor: HttpInterceptorFn = (req, next) => {\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n const router = inject(Router);\n const tenantService = inject(TenantInfo);\n const correlationService = inject(CorrelationInfo);\n const loggingService = inject(LoggingService);\n const environment = inject(ENVIRONMENT);\n\n const config: Required<HttpContextConfig> = {\n ...DEFAULT_CONFIG,\n enableRequestLogging: !environment.isProduction,\n ...inject(HTTP_CONTEXT_CONFIG, { optional: true }),\n };\n\n // ── Context token flags ──────────────────────────────────────────────────\n const isCustomUrl = req.context.get(CUSTOM_URL);\n const skipHeaders = req.context.get(SKIP_CONTEXT_HEADERS);\n const contextHeaders = req.context.get(CUSTOM_HEADERS);\n\n if (skipHeaders) return next(req);\n\n // ── URL exclusion (with ReDoS protection) ────────────────────────────────\n const shouldExclude = config.excludeUrls.some((pattern) => {\n try {\n return req.url.includes(pattern) || new RegExp(pattern).test(req.url);\n } catch {\n return false; // malformed regex — skip safely\n }\n });\n\n if (shouldExclude) return next(req);\n\n // ── Auth skip check ──────────────────────────────────────────────────────\n const skipAuth = config.skipAuthUrls.some((u) => req.url.includes(u));\n\n // ── URL resolution ───────────────────────────────────────────────────────\n const baseUrl = environment.apiBaseUrl;\n const finalUrl = isCustomUrl || !config.baseUrlInjection ? req.url : `${baseUrl}${req.url}`;\n\n // ── Header construction ──────────────────────────────────────────────────\n const correlationId = config.enableCorrelationTracking\n ? correlationService.getOrCreateCorrelationId()\n : crypto.randomUUID();\n const tenantId = tenantService.getTenantId();\n const requestId = crypto.randomUUID();\n\n const headers: Record<string, string> = {\n [config.requestIdHeader]: requestId,\n [config.timestampHeader]: new Date().toISOString(),\n };\n\n if (config.enableCorrelationTracking) {\n headers[config.correlationIdHeader] = correlationId;\n }\n\n if (tenantId) {\n headers[config.tenantIdHeader] = tenantId;\n }\n\n if (config.clientVersion) {\n headers['Client-Version'] = config.clientVersion;\n }\n\n if (environment.clientId) {\n headers['Client-Id'] = environment.clientId;\n }\n\n if (config.includeAuthToken && !skipAuth) {\n const authToken = tokenProvider?.getToken();\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n // Static and dynamic custom headers from config\n Object.entries(config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n // Per-request headers from HttpContext\n Object.entries(contextHeaders).forEach(([key, value]) => {\n headers[key] = value;\n });\n\n // Content-Type for mutation requests (do not override if already set)\n if (['POST', 'PUT', 'PATCH'].includes(req.method) && !req.headers.has('Content-Type')) {\n headers['Content-Type'] = 'application/json';\n }\n\n // ── Clone request ────────────────────────────────────────────────────────\n const enhancedReq = req.clone({ url: finalUrl, setHeaders: headers });\n\n // ── Request logging ──────────────────────────────────────────────────────\n if (config.enableRequestLogging) {\n loggingService.logHttpRequest({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n timestamp: new Date().toISOString(),\n headers: Object.keys(headers),\n isCustomUrl,\n });\n }\n\n // ── Execute request with unified error handling ──────────────────────────\n const hasAuth = !!headers['Authorization'];\n\n // Shared error context for both handlers below\n const errorCtx = {\n req,\n finalUrl,\n requestId,\n correlationId,\n tenantId,\n isCustomUrl,\n hasAuth,\n config,\n router,\n loggingService,\n tenantService,\n tokenProvider,\n environment,\n };\n\n // Base pipeline — always present\n const base$ = next(enhancedReq).pipe(\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n\n // When auth + refresh callback are available, prepend a 401-refresh layer\n if (!hasAuth || !config.refreshTokenCallback) {\n return base$;\n }\n\n return next(enhancedReq).pipe(\n // Intercept 401 first — attempt token refresh before general error handling\n catchError((error: HttpErrorResponse) => {\n if (error.status !== 401) return throwError(() => error);\n\n const refreshToken = tokenProvider?.getRefreshToken?.();\n if (!refreshToken?.trim()) return throwError(() => error);\n\n return config.refreshTokenCallback!().pipe(\n switchMap(({ token }) =>\n next(\n req.clone({\n url: finalUrl,\n setHeaders: { ...headers, Authorization: `Bearer ${token}` },\n }),\n ),\n ),\n catchError((refreshError) => {\n config.logoutCallback?.();\n return throwError(() => refreshError);\n }),\n );\n }),\n // General error handling (logs, redirects, tenant, rate-limit, etc.)\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Unified error handler (eliminates duplicated catchError blocks)\n// ---------------------------------------------------------------------------\n\ninterface ErrorContext {\n req: HttpRequest<unknown>;\n finalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n isCustomUrl: boolean;\n hasAuth: boolean;\n config: Required<HttpContextConfig>;\n router: Router;\n loggingService: LoggingService;\n tenantService: TenantInfo;\n tokenProvider: any;\n environment: any;\n}\n\nfunction handleContextError(error: HttpErrorResponse, ctx: ErrorContext) {\n const {\n req,\n finalUrl,\n requestId,\n correlationId,\n tenantId,\n isCustomUrl,\n config,\n router,\n loggingService,\n tenantService,\n environment,\n } = ctx;\n\n if (config.enableErrorLogging) {\n loggingService.logHttpError({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n status: error.status,\n statusText: error.statusText,\n message: error.message,\n timestamp: new Date().toISOString(),\n errorDetails: error.error,\n environment: environment.clientId,\n isCustomUrl,\n headers: [],\n });\n }\n\n switch (error.status) {\n case 401:\n loggingService.error('Unauthorized — redirecting to login');\n // Let auth service clear tokens before navigation\n config.logoutCallback?.();\n router.navigate([`/${environment.loginRoute}`]);\n break;\n case 403:\n tenantService.handleForbidden();\n break;\n case 0:\n loggingService.logNetworkError(correlationId);\n break;\n case 429:\n loggingService.logRateLimitError(correlationId, finalUrl);\n break;\n }\n\n return throwError(() => error);\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface HttpRequestLog {\n method: string;\n url: string;\n originalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n timestamp: string;\n headers: string[];\n isCustomUrl: boolean;\n}\n\nexport interface HttpErrorLog extends HttpRequestLog {\n status: number;\n statusText: string;\n message: string;\n errorDetails: unknown;\n environment: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public helpers for library consumers\n// ---------------------------------------------------------------------------\n\nexport function createHttpContextConfig(\n overrides: Partial<HttpContextConfig> = {},\n): HttpContextConfig {\n return { ...DEFAULT_CONFIG, ...overrides };\n}\n\n/**\n * Register the interceptor configuration in your app providers.\n *\n * @example\n * // app.config.ts\n * provideHttpClient(\n * withInterceptors([\n * httpContextInterceptor, // 1st — adds headers, handles 401 refresh\n * apiInterceptor, // 2nd — normalises response, shows toasts\n * ])\n * ),\n * ...provideHttpContext({ clientVersion: '2.0.0' }),\n */\nexport function provideHttpContext(config: Partial<HttpContextConfig> = {}) {\n return [\n {\n provide: HTTP_CONTEXT_CONFIG,\n useValue: createHttpContextConfig(config),\n },\n ];\n}\n","import {\n HttpContext,\n HttpContextToken,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { finalize } from 'rxjs/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { OverlayService } from '@acontplus/ng-components';\n\nexport const SHOW_SPINNER = new HttpContextToken<boolean>(() => true);\n\nexport function withoutSpinner(): HttpContext {\n return new HttpContext().set(SHOW_SPINNER, false);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActiveRequestsTracker {\n private readonly requests: HttpRequest<unknown>[] = [];\n\n get count(): number {\n return this.requests.length;\n }\n\n /** Retorna true si se pasa de 0 → 1 (primera request activa). */\n add(request: HttpRequest<unknown>): boolean {\n this.requests.push(request);\n return this.requests.length === 1;\n }\n\n /** Retorna true si se pasa de 1 → 0 (última request completada). */\n remove(request: HttpRequest<unknown>): boolean {\n const index = this.requests.indexOf(request);\n if (index >= 0) {\n this.requests.splice(index, 1);\n }\n return this.requests.length === 0;\n }\n}\n\nexport const spinnerInterceptor: HttpInterceptorFn = (req, next) => {\n const activeRequests = inject(ActiveRequestsTracker);\n const overlayService = inject(OverlayService);\n\n if (!req.context.get(SHOW_SPINNER)) {\n return next(req);\n }\n\n // showSpinner solo cuando pasamos de 0 → 1 requests\n const isFirst = activeRequests.add(req);\n if (isFirst) {\n overlayService.showSpinner();\n }\n\n return next(req).pipe(\n finalize(() => {\n // hideSpinner solo cuando pasamos de 1 → 0 requests\n const isEmpty = activeRequests.remove(req);\n if (isEmpty) {\n overlayService.hideSpinner();\n }\n }),\n );\n};\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { RepositoryConfig } from '@acontplus/core';\n\n@Injectable()\nexport abstract class BaseHttpRepository {\n protected http = inject(HttpClient);\n protected abstract config: RepositoryConfig; // Abstract property\n\n protected buildUrl(path = ''): string {\n const baseUrl = this.config.baseUrl || '/api';\n const version = this.config.version ? `/v${this.config.version}` : '';\n const endpoint = path ? `${this.config.endpoint}/${path}` : this.config.endpoint;\n\n return `${baseUrl}${version}/${endpoint}`.replace(/\\/+/g, '/');\n }\n\n protected get<T>(path = '', params?: Record<string, string | number | boolean>): Observable<T> {\n return this.http.get<T>(this.buildUrl(path), { params });\n }\n\n protected post<T>(path = '', body: unknown): Observable<T> {\n return this.http.post<T>(this.buildUrl(path), body);\n }\n\n protected put<T>(path = '', body: unknown): Observable<T> {\n return this.http.put<T>(this.buildUrl(path), body);\n }\n\n protected patch<T>(path = '', body?: unknown): Observable<T> {\n return this.http.patch<T>(this.buildUrl(path), body);\n }\n\n protected delete<T>(path = ''): Observable<T> {\n return this.http.delete<T>(this.buildUrl(path));\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseHttpRepository } from './base-http-repository';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository, SearchableRepository } from '@acontplus/ng-config';\n\n// Create an injection token for RepositoryConfig\nexport const REPOSITORY_CONFIG = new InjectionToken<RepositoryConfig>('REPOSITORY_CONFIG');\n\n@Injectable()\nexport class GenericRepository<TEntity = any, TId extends string | number = number>\n extends BaseHttpRepository\n implements BaseRepository<TEntity, TId>\n{\n protected override config: RepositoryConfig;\n\n constructor() {\n const config = inject<RepositoryConfig>(REPOSITORY_CONFIG);\n super();\n this.config = config;\n }\n\n getById(id: TId): Observable<TEntity> {\n return this.get<TEntity>(id.toString());\n }\n\n getAll(pagination?: PaginationParams): Observable<PagedResult<TEntity>> {\n const params = this.buildParams(pagination);\n return this.get<PagedResult<TEntity>>('', params);\n }\n\n create(entity: Partial<TEntity>): Observable<TEntity> {\n return this.post<TEntity>('', entity);\n }\n\n update(id: TId, entity: Partial<TEntity>): Observable<TEntity> {\n return this.put<TEntity>(id.toString(), entity);\n }\n\n remove(id: TId): Observable<void> {\n return super.delete<void>(id.toString());\n }\n\n protected buildParams(pagination?: PaginationParams, filters?: Record<string, any>): any {\n const params: any = {};\n\n if (pagination) {\n params.pageIndex = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n\n if (filters) {\n Object.assign(params, filters);\n }\n\n return params;\n }\n}\n\n@Injectable()\nexport class SearchableGenericRepository<TEntity = any, TId extends string | number = number>\n extends GenericRepository<TEntity, TId>\n implements SearchableRepository<TEntity, TId>\n{\n search(query: string, pagination: PaginationParams): Observable<PagedResult<TEntity>> {\n const searchFilters = { q: query };\n const params = this.buildParams(pagination, searchFilters);\n return this.get<PagedResult<TEntity>>('search', params);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository } from '@acontplus/ng-config';\n\n@Injectable({ providedIn: 'root' })\nexport class RepositoryFactory {\n private http = inject(HttpClient);\n\n create<TEntity, TId extends string | number = number>(\n config: RepositoryConfig,\n ): BaseRepository<TEntity, TId> {\n const buildUrl = (path = '') => {\n const baseUrl = config.baseUrl || '/api';\n const version = config.version ? `/v${config.version}` : '';\n const endpoint = path ? `${config.endpoint}/${path}` : config.endpoint;\n return `${baseUrl}${version}/${endpoint}`.replace(/\\/+/g, '/');\n };\n\n const buildParams = (pagination?: PaginationParams) => {\n const params: any = {};\n if (pagination) {\n params.page = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n return params;\n };\n\n // Safe ID conversion function\n const idToString = (id: TId): string => {\n if (typeof id === 'string' || typeof id === 'number' || typeof id === 'bigint') {\n return id.toString();\n }\n // Fallback for other types - you might want to handle this differently\n return String(id);\n };\n\n return {\n getById: (id: TId) => this.http.get<TEntity>(buildUrl(idToString(id))),\n\n getAll: (pagination?) =>\n this.http.get<PagedResult<TEntity>>(buildUrl(), {\n params: buildParams(pagination),\n }),\n\n create: (entity: Partial<TEntity>) => this.http.post<TEntity>(buildUrl(), entity),\n\n update: (id: TId, entity: Partial<TEntity>) =>\n this.http.put<TEntity>(buildUrl(idToString(id)), entity),\n\n remove: (id: TId) => this.http.delete<void>(buildUrl(idToString(id))),\n };\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { HttpOptions, HttpPort } from '@acontplus/core';\n\nfunction mergeUrl(baseURL: string | undefined, endpoint: string): string {\n if (!baseURL) return endpoint;\n return `${baseURL.replace(/\\/+$/, '')}/${endpoint.replace(/^\\/+/, '')}`;\n}\n\nexport class AngularHttpAdapter implements HttpPort {\n constructor(\n private readonly http: HttpClient,\n private readonly baseURL?: string,\n ) {}\n\n private buildOptions(options?: HttpOptions) {\n return {\n headers: options?.headers ?? {},\n params: options?.params ?? {},\n };\n }\n\n private async request<T>(params: {\n method: 'get' | 'post' | 'put' | 'delete';\n url: string;\n data?: unknown;\n options?: HttpOptions;\n }): Promise<T> {\n const fullUrl = mergeUrl(this.baseURL, params.url);\n const httpOptions = this.buildOptions(params.options);\n\n const observable = this.http.request<T>(params.method, fullUrl, {\n body: params.data,\n ...httpOptions,\n });\n\n return await lastValueFrom(observable);\n }\n\n /** GET */\n get<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'get', url, options });\n }\n\n /** POST */\n post<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'post', url, data, options });\n }\n\n /** PUT */\n put<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'put', url, data, options });\n }\n\n /** DELETE */\n delete<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'delete', url, options });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CORE_CONFIG, DEFAULT_CONFIG, ENVIRONMENT } from '@acontplus/ng-config';\nimport { CoreConfig } from '@acontplus/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CoreConfigService {\n private config: Required<CoreConfig>;\n private environment = inject(ENVIRONMENT);\n\n constructor() {\n this.config = this.initializeConfig();\n }\n\n /**\n * Initialize configuration with defaults and environment overrides\n */\n private initializeConfig(): Required<CoreConfig> {\n const injectedConfig = inject(CORE_CONFIG, { optional: true });\n\n return {\n ...DEFAULT_CONFIG,\n // Environment overrides\n apiBaseUrl: this.environment.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl,\n enableRequestLogging: !this.environment.isProduction,\n // Injected config overrides\n ...injectedConfig,\n };\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Required<CoreConfig> {\n return { ...this.config };\n }\n\n /**\n * Update configuration at runtime\n */\n updateConfig(updates: Partial<CoreConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n /**\n * Get a specific configuration value\n */\n get<K extends keyof CoreConfig>(key: K): CoreConfig[K] {\n return this.config[key];\n }\n\n /**\n * Check if a feature is enabled\n */\n isFeatureEnabled(feature: keyof CoreConfig): boolean {\n const value = this.config[feature];\n return typeof value === 'boolean' ? value : false;\n }\n\n /**\n * Get API URL for a specific entity\n */\n getApiUrl(entityName?: string): string {\n const baseUrl = this.config.apiBaseUrl;\n if (!entityName) return baseUrl;\n return `${baseUrl}/${entityName}`.replace(/\\/+/g, '/');\n }\n\n /**\n * Check if a URL should be excluded from processing\n */\n shouldExcludeUrl(url: string): boolean {\n return this.config.excludeUrls.some(\n (excludePattern) => url.includes(excludePattern) || new RegExp(excludePattern).test(url),\n );\n }\n\n /**\n * Check if a method should be excluded from processing\n */\n shouldExcludeMethod(method: string): boolean {\n return this.config.excludeMethods.some(\n (excludeMethod) => excludeMethod.toLowerCase() === method.toLowerCase(),\n );\n }\n\n /**\n * Get custom headers with dynamic values resolved\n */\n getCustomHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n return headers;\n }\n\n /**\n * Reset configuration to defaults\n */\n resetConfig(): void {\n this.config = this.initializeConfig();\n }\n}\n\n// Provider function for easy setup\nexport function provideCoreConfig(config: Partial<CoreConfig> = {}) {\n return [\n {\n provide: CORE_CONFIG,\n useValue: config,\n },\n ];\n}\n\n// Helper function to create configuration\nexport function createCoreConfig(overrides: Partial<CoreConfig> = {}): CoreConfig {\n return {\n ...DEFAULT_CONFIG,\n ...overrides,\n };\n}\n","import { Observable } from 'rxjs';\n\nexport interface UseCase<TRequest = void, TResponse = void> {\n execute(request: TRequest): Observable<TResponse>;\n}\n\nexport abstract class BaseUseCase<TRequest = void, TResponse = void> implements UseCase<\n TRequest,\n TResponse\n> {\n abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\n// Only create commands if you have complex validation logic\nexport abstract class Command<TRequest, TResponse = void> extends BaseUseCase<TRequest, TResponse> {\n // Simple validation - override only when needed\n protected validate(_request: TRequest): string[] {\n return []; // Return array of error messages\n }\n\n override execute(request: TRequest): Observable<TResponse> {\n const errors = this.validate(request);\n if (errors.length > 0) {\n return throwError(() => ({\n status: 'error',\n code: 'VALIDATION_FAILED',\n message: 'Validation failed',\n errors: errors.map((msg) => ({ code: 'VALIDATION', message: msg })),\n timestamp: new Date().toISOString(),\n }));\n }\n\n return this.executeInternal(request).pipe(\n catchError((error) => {\n // Log the error for debugging\n const logger = inject(LoggingService);\n logger.error('An error occurred during command execution:', error);\n\n // Re-throw the error so the caller can handle it\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\nexport abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest, TResponse> {\n override execute(request: TRequest): Observable<TResponse> {\n return this.executeInternal(request).pipe(\n catchError((error) => {\n const logger = inject(LoggingService);\n logger.error('An error occurred during query execution:', error);\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["DEFAULT_CONFIG","catchError"],"mappings":";;;;;;;;;;AAcA;AACA;AACA;AAEA;;;AAGG;AACI,MAAM,iBAAiB,GAAG,IAAI,gBAAgB,CAAU,MAAM,KAAK;AAE1E;;;AAGG;AACI,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,CAAsB,MAAM,SAAS;AAE3F;AACA;AACA;MAEa,cAAc,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AAC7D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG5D,IAAA,MAAM,KAAK,GAAG,aAAa,EAAE,QAAQ,EAAE;IACvC,MAAM,WAAW,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE,EAAE,CAAC,GAAG,GAAG;AAEjG,IAAA,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI;;;AAG3B,IAAA,KAAK,CAAC;AACJ,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,KAAK,EAAE,CAAC,KAAwB,EAAE,OAAO,KAAI;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;AACrF,YAAA,IAAI,CAAC,WAAW;gBAAE,MAAM,KAAK,CAAC;YAC9B,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;;;AAIF,IAAA,SAAS,CAAC,CAAC,KAAyB,KAAI;AACtC,QAAA,IAAI,KAAK,YAAY,YAAY,EAAE;YACjC,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;AACvD,YAAA,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC;AAEnD,YAAA,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,EAAE;AACnC,gBAAA,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC;AACjD,gBAAA,OAAO,UAAU,CAAC,MAAM,YAAY,CAAC;YACvC;YAEA,OAAO,EAAE,CAAC,6BAA6B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/D;AACA,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC;AAClB,IAAA,CAAC,CAAC;;AAGF,IAAA,UAAU,CAAC,CAAC,KAAwB,KAAK,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CACzE;AACH;AAEA;AACA;AACA;AAEA,SAAS,sBAAsB,CAAC,IAAa,EAAA;IAC3C,IAAI,kBAAkB,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;;IAGzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,EAAE;AAC1F,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC;IAC1B;;AAGA,IAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACnE,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC;IAC1B;;AAGA,IAAA,OAAO,WAAW,CAAC,SAAS,CAAC;AAC/B;AAEA,SAAS,WAAW,CAAC,IAAa,EAAA;IAChC,OAAO;AACL,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,OAAO,EAAE,kCAAkC;QAC3C,IAAI;AACJ,QAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC;AACH;AAEA,SAAS,kBAAkB,CAAC,QAAiB,EAAA;AAC3C,IAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IACnE,MAAM,CAAC,GAAG,QAAmC;IAC7C,QACE,QAAQ,IAAI,CAAC;AACb,QAAA,MAAM,IAAI,CAAC;AACX,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;AAC/B,QAAA,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAW,CAAC;AAEnE;AAEA;AACA;AACA;AAEA,SAAS,wBAAwB,CAC/B,QAA8B,EAC9B,mBAAwC,EACxC,GAAyB,EAAA;;AAGzB,IAAA,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAAE;IAExC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACrD,IAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC;AAC5C,IAAA,MAAM,iBAAiB,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,QAAQ;AAExE,IAAA,IAAI,CAAC,iBAAiB;QAAE;IACxB,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE;AACvB,IAAA,IAAI,CAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE;;IAG9E,mBAAmB,CAAC,IAAI,CAAC;QACvB,IAAI,EAAE,QAAQ,CAAC,MAAyC;QACxD,OAAO,EAAE,QAAQ,CAAC,OAAO;AAC1B,KAAA,CAAC;;AAGF,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QACnF,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAC1B,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAClE;IACH;;AAGA,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC/E,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjG;AACF;AAEA,SAAS,sBAAsB,CAC7B,QAA8B,EAC9B,mBAAwC,EACxC,GAAyB,EAAA;AAEzB,IAAA,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAAE;AAExC,IAAA,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,IAAI,8BAA8B;AAErF,IAAA,mBAAmB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;AACpE;AAEA;AACA;AACA;AAEA,SAAS,6BAA6B,CACpC,QAA8B,EAC9B,aAAoC,EAAA;AAEpC,IAAA,QAAQ,QAAQ,CAAC,MAAM;AACrB,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,SAAS;;YAEZ,OAAO,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK;AACtD,kBAAE,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;kBAC3C,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE7C,QAAA,KAAK,OAAO;;YAEV,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAEhD,QAAA;YACE,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;AAEpD;AAEA;AACA;AACA;AAEA,SAAS,eAAe,CACtB,KAAwB,EACxB,mBAAwC,EAAA;AAExC,IAAA,IAAI,mCAAmC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACrD,mBAAmB,CAAC,KAAK,CAAC;AACxB,YAAA,OAAO,EAAE,uBAAuB,CAAC,KAAK,CAAC;AACvC,YAAA,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;AAClC,YAAA,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC3B,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;AAChC;AAEA,SAAS,mCAAmC,CAAC,MAAc,EAAA;AACzD,IAAA,OAAO,MAAM,KAAK,CAAC,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AACxD;AAEA,SAAS,aAAa,CAAC,MAAc,EAAA;IACnC,IAAI,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,kBAAkB;IAC3C,IAAI,MAAM,IAAI,GAAG;AAAE,QAAA,OAAO,cAAc;AACxC,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,uBAAuB,CAAC,KAAwB,EAAA;AACvD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,wEAAwE;IACjF;AACA,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE;AACvB,QAAA,QACE,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,kDAAkD;IAE/F;IACA,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,8BAA8B;AAChF;AAEA;AACA;AACA;AAEA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEnE,MAAM,qBAAqB,GAAG;IAC5B,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,YAAY;IACZ,SAAS;IACT,SAAS;IACT,OAAO;CACR;AAED,SAAS,sBAAsB,CAAC,GAAyB,EAAA;IACvD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;IACvC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE;AAEjC,IAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,KAAK;AAC9C,IAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;AAEpE,IAAA,OAAO,IAAI;AACb;;MC7Pa,cAAc,CAAA;AACjB,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEzC,IAAA,GAAG,CAAC,KAAgC,EAAE,OAAe,EAAE,OAAiB,EAAA;AACtE,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;;YAEjC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QACpD;aAAO;;AAEL,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAClC,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,CAAA,CAAE,EAAE,OAAO,CAAC;YAChE;QACF;IACF;IAEA,IAAI,CAAC,OAAe,EAAE,OAAiB,EAAA;QACrC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACpC;IAEA,IAAI,CAAC,OAAe,EAAE,OAAiB,EAAA;QACrC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACpC;IAEA,KAAK,CAAC,OAAe,EAAE,OAAiB,EAAA;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;IACrC;;AAGA,IAAA,cAAc,CAAC,GAAmB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,GAAG,CAAA,CAAE,EAAE;YACnD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;AACzB,SAAA,CAAC;IACJ;;AAGA,IAAA,YAAY,CAAC,KAAmB,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,CAAA,aAAA,EAAgB,KAAK,CAAC,MAAM,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE,EAAE;YACtD,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;AAC3B,SAAA,CAAC;IACJ;;AAGA,IAAA,eAAe,CAAC,aAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE;AACtC,YAAA,IAAI,EAAE,eAAe;YACrB,aAAa;YACb,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;AACzB,SAAA,CAAC;IACJ;;IAGA,iBAAiB,CAAC,aAAqB,EAAE,GAAW,EAAA;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;AAC/B,YAAA,IAAI,EAAE,kBAAkB;YACxB,aAAa;YACb,GAAG;AACJ,SAAA,CAAC;IACJ;AAEQ,IAAA,oBAAoB,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAkB,EAAA;;;;IAIjF;uGA5EW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,UAAU,CAAA;IACb,QAAQ,GAAkB,IAAI;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAEvC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;;AAElB,YAAA,IAAI,CAAC,QAAQ;AACX,gBAAA,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;AAChC,oBAAA,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC;oBAClC,IAAI,CAAC,sBAAsB,EAAE;AAC7B,oBAAA,gBAAgB;QACpB;QACA,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC5C;AAEA,IAAA,SAAS,CAAC,QAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC5B;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CAAC;;;IAGlE;IAEQ,sBAAsB,GAAA;;;AAG5B,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;AACnC,QAAA,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC;IACvC;uGA7CW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,eAAe,CAAA;AAClB,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;IAClC,eAAe,GAAG,gBAAgB;;IAG1C,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAEpE,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;;AAEzB,YAAA,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE;AAC9E,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAClD;AACA,QAAA,OAAO,IAAI,CAAC,aAAa,EAAG;IAC9B;AAEA,IAAA,gBAAgB,CAAC,aAAqB,EAAA;AACpC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;QACrC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC;IAC7D;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;IACjD;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,wBAAwB,EAAE;IACxC;uGA7BW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACYD;AACA;AACA;AAEA;AACA,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAU,MAAM,KAAK,CAAC;AAE7D;AACA,MAAM,oBAAoB,GAAG,IAAI,gBAAgB,CAAU,MAAM,KAAK,CAAC;AAEvE;AACA,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAyB,OAAO,EAAE,CAAC,CAAC;SAE/D,SAAS,GAAA;IACvB,OAAO,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;AAChD;SAEgB,kBAAkB,GAAA;IAChC,OAAO,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC;AAC1D;AAEM,SAAU,iBAAiB,CAAC,OAA+B,EAAA;IAC/D,OAAO,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC;AACvD;AA4BA,MAAM,cAAc,GAAgC;AAClD,IAAA,yBAAyB,EAAE,IAAI;AAC/B,IAAA,oBAAoB,EAAE,KAAK;AAC3B,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,aAAa,EAAE,OAAO;AACtB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,mBAAmB,EAAE,gBAAgB;AACrC,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC;AACjD,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,oBAAoB,EAAE,SAAgB;AACtC,IAAA,cAAc,EAAE,SAAgB;CACjC;MAEY,mBAAmB,GAAG,IAAI,cAAc,CAAoB,qBAAqB,EAAE;AAC9F,IAAA,OAAO,EAAE,MAAM,cAAc;AAC9B,CAAA;AAED;AACA;AACA;MAEa,sBAAsB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AACrE,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC;AAClD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEvC,IAAA,MAAM,MAAM,GAAgC;AAC1C,QAAA,GAAG,cAAc;AACjB,QAAA,oBAAoB,EAAE,CAAC,WAAW,CAAC,YAAY;QAC/C,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnD;;IAGD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACzD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEtD,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;;IAGjC,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AACxD,QAAA,IAAI;YACF,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACvE;AAAE,QAAA,MAAM;YACN,OAAO,KAAK,CAAC;QACf;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,aAAa;AAAE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;;IAGnC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;AAGrE,IAAA,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU;IACtC,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA,EAAG,OAAO,GAAG,GAAG,CAAC,GAAG,CAAA,CAAE;;AAG3F,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC;AAC3B,UAAE,kBAAkB,CAAC,wBAAwB;AAC7C,UAAE,MAAM,CAAC,UAAU,EAAE;AACvB,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE;AAC5C,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE;AAErC,IAAA,MAAM,OAAO,GAA2B;AACtC,QAAA,CAAC,MAAM,CAAC,eAAe,GAAG,SAAS;QACnC,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnD;AAED,IAAA,IAAI,MAAM,CAAC,yBAAyB,EAAE;AACpC,QAAA,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,aAAa;IACrD;IAEA,IAAI,QAAQ,EAAE;AACZ,QAAA,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ;IAC3C;AAEA,IAAA,IAAI,MAAM,CAAC,aAAa,EAAE;AACxB,QAAA,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,aAAa;IAClD;AAEA,IAAA,IAAI,WAAW,CAAC,QAAQ,EAAE;AACxB,QAAA,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,QAAQ;IAC7C;AAEA,IAAA,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE;AACxC,QAAA,MAAM,SAAS,GAAG,aAAa,EAAE,QAAQ,EAAE;AAC3C,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,CAAC,eAAe,CAAC,GAAG,CAAA,OAAA,EAAU,SAAS,EAAE;IACjE;;AAGA,IAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC5D,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG,KAAK;AAC9D,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACtD,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;AACtB,IAAA,CAAC,CAAC;;IAGF,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;AACrF,QAAA,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB;IAC9C;;AAGA,IAAA,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;AAGrE,IAAA,IAAI,MAAM,CAAC,oBAAoB,EAAE;QAC/B,cAAc,CAAC,cAAc,CAAC;YAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,YAAA,GAAG,EAAE,QAAQ;YACb,WAAW,EAAE,GAAG,CAAC,GAAG;YACpB,SAAS;YACT,aAAa;YACb,QAAQ;AACR,YAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,YAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,WAAW;AACZ,SAAA,CAAC;IACJ;;IAGA,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;;AAG1C,IAAA,MAAM,QAAQ,GAAG;QACf,GAAG;QACH,QAAQ;QACR,SAAS;QACT,aAAa;QACb,QAAQ;QACR,WAAW;QACX,OAAO;QACP,MAAM;QACN,MAAM;QACN,cAAc;QACd,aAAa;QACb,aAAa;QACb,WAAW;KACZ;;IAGD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAClC,UAAU,CAAC,CAAC,KAAwB,KAAK,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAC9E;;IAGD,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE;AAC5C,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI;;AAE3B,IAAA,UAAU,CAAC,CAAC,KAAwB,KAAI;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;AAAE,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;AAExD,QAAA,MAAM,YAAY,GAAG,aAAa,EAAE,eAAe,IAAI;AACvD,QAAA,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;AAAE,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAEzD,OAAO,MAAM,CAAC,oBAAqB,EAAE,CAAC,IAAI,CACxC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAClB,IAAI,CACF,GAAG,CAAC,KAAK,CAAC;AACR,YAAA,GAAG,EAAE,QAAQ;YACb,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE;SAC7D,CAAC,CACH,CACF,EACD,UAAU,CAAC,CAAC,YAAY,KAAI;AAC1B,YAAA,MAAM,CAAC,cAAc,IAAI;AACzB,YAAA,OAAO,UAAU,CAAC,MAAM,YAAY,CAAC;QACvC,CAAC,CAAC,CACH;AACH,IAAA,CAAC,CAAC;;AAEF,IAAA,UAAU,CAAC,CAAC,KAAwB,KAAK,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAC9E;AACH;AAsBA,SAAS,kBAAkB,CAAC,KAAwB,EAAE,GAAiB,EAAA;IACrE,MAAM,EACJ,GAAG,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,QAAQ,EACR,WAAW,EACX,MAAM,EACN,MAAM,EACN,cAAc,EACd,aAAa,EACb,WAAW,GACZ,GAAG,GAAG;AAEP,IAAA,IAAI,MAAM,CAAC,kBAAkB,EAAE;QAC7B,cAAc,CAAC,YAAY,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,YAAA,GAAG,EAAE,QAAQ;YACb,WAAW,EAAE,GAAG,CAAC,GAAG;YACpB,SAAS;YACT,aAAa;YACb,QAAQ;YACR,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,YAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,YAAY,EAAE,KAAK,CAAC,KAAK;YACzB,WAAW,EAAE,WAAW,CAAC,QAAQ;YACjC,WAAW;AACX,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC;IACJ;AAEA,IAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,QAAA,KAAK,GAAG;AACN,YAAA,cAAc,CAAC,KAAK,CAAC,qCAAqC,CAAC;;AAE3D,YAAA,MAAM,CAAC,cAAc,IAAI;YACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,UAAU,CAAA,CAAE,CAAC,CAAC;YAC/C;AACF,QAAA,KAAK,GAAG;YACN,aAAa,CAAC,eAAe,EAAE;YAC/B;AACF,QAAA,KAAK,CAAC;AACJ,YAAA,cAAc,CAAC,eAAe,CAAC,aAAa,CAAC;YAC7C;AACF,QAAA,KAAK,GAAG;AACN,YAAA,cAAc,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC;YACzD;;AAGJ,IAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;AAChC;AA0BA;AACA;AACA;AAEM,SAAU,uBAAuB,CACrC,SAAA,GAAwC,EAAE,EAAA;AAE1C,IAAA,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE;AAC5C;AAEA;;;;;;;;;;;;AAYG;AACG,SAAU,kBAAkB,CAAC,MAAA,GAAqC,EAAE,EAAA;IACxE,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,mBAAmB;AAC5B,YAAA,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC;AAC1C,SAAA;KACF;AACH;;ACvXO,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAU,MAAM,IAAI;SAEpD,cAAc,GAAA;IAC5B,OAAO,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;AACnD;MAGa,qBAAqB,CAAA;IACf,QAAQ,GAA2B,EAAE;AAEtD,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM;IAC7B;;AAGA,IAAA,GAAG,CAAC,OAA6B,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;IACnC;;AAGA,IAAA,MAAM,CAAC,OAA6B,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AAC5C,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC;AACA,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;IACnC;uGApBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;MAwBrB,kBAAkB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AACjE,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACpD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAE7C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;AAClC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB;;IAGA,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,IAAI,OAAO,EAAE;QACX,cAAc,CAAC,WAAW,EAAE;IAC9B;IAEA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CACnB,QAAQ,CAAC,MAAK;;QAEZ,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1C,IAAI,OAAO,EAAE;YACX,cAAc,CAAC,WAAW,EAAE;QAC9B;IACF,CAAC,CAAC,CACH;AACH;;MCzDsB,kBAAkB,CAAA;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IAGzB,QAAQ,CAAC,IAAI,GAAG,EAAE,EAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE;QACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;AAEhF,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,OAAO,IAAI,QAAQ,CAAA,CAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;IAChE;AAEU,IAAA,GAAG,CAAI,IAAI,GAAG,EAAE,EAAE,MAAkD,EAAA;AAC5E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;IAC1D;AAEU,IAAA,IAAI,CAAI,IAAI,GAAG,EAAE,EAAE,IAAa,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrD;AAEU,IAAA,GAAG,CAAI,IAAI,GAAG,EAAE,EAAE,IAAa,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACpD;AAEU,IAAA,KAAK,CAAI,IAAI,GAAG,EAAE,EAAE,IAAc,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACtD;IAEU,MAAM,CAAI,IAAI,GAAG,EAAE,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD;uGA9BoB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAlB,kBAAkB,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBADvC;;;ACCD;MACa,iBAAiB,GAAG,IAAI,cAAc,CAAmB,mBAAmB;AAGnF,MAAO,iBACX,SAAQ,kBAAkB,CAAA;AAGP,IAAA,MAAM;AAEzB,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAmB,iBAAiB,CAAC;AAC1D,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACtB;AAEA,IAAA,OAAO,CAAC,EAAO,EAAA;QACb,OAAO,IAAI,CAAC,GAAG,CAAU,EAAE,CAAC,QAAQ,EAAE,CAAC;IACzC;AAEA,IAAA,MAAM,CAAC,UAA6B,EAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAuB,EAAE,EAAE,MAAM,CAAC;IACnD;AAEA,IAAA,MAAM,CAAC,MAAwB,EAAA;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAU,EAAE,EAAE,MAAM,CAAC;IACvC;IAEA,MAAM,CAAC,EAAO,EAAE,MAAwB,EAAA;QACtC,OAAO,IAAI,CAAC,GAAG,CAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;IACjD;AAEA,IAAA,MAAM,CAAC,EAAO,EAAA;QACZ,OAAO,KAAK,CAAC,MAAM,CAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC1C;IAEU,WAAW,CAAC,UAA6B,EAAE,OAA6B,EAAA;QAChF,MAAM,MAAM,GAAQ,EAAE;QAEtB,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG;YAC1D,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI;YACzD,IAAI,UAAU,CAAC,MAAM;AAAE,gBAAA,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;YACxD,IAAI,UAAU,CAAC,aAAa;AAAE,gBAAA,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa;QAC/E;QAEA,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAChC;AAEA,QAAA,OAAO,MAAM;IACf;uGAhDW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAjB,iBAAiB,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;AAqDK,MAAO,2BACX,SAAQ,iBAA+B,CAAA;IAGvC,MAAM,CAAC,KAAa,EAAE,UAA4B,EAAA;AAChD,QAAA,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAuB,QAAQ,EAAE,MAAM,CAAC;IACzD;uGARW,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA3B,2BAA2B,EAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;MCvDY,iBAAiB,CAAA;AACpB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjC,IAAA,MAAM,CACJ,MAAwB,EAAA;AAExB,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,KAAI;AAC7B,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM;AACxC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,CAAA,EAAA,EAAK,MAAM,CAAC,OAAO,CAAA,CAAE,GAAG,EAAE;AAC3D,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ;AACtE,YAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,OAAO,IAAI,QAAQ,CAAA,CAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AAChE,QAAA,CAAC;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,UAA6B,KAAI;YACpD,MAAM,MAAM,GAAQ,EAAE;YACtB,IAAI,UAAU,EAAE;gBACd,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG;gBACrD,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI;gBACzD,IAAI,UAAU,CAAC,MAAM;AAAE,oBAAA,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;gBACxD,IAAI,UAAU,CAAC,aAAa;AAAE,oBAAA,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa;YAC/E;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;;AAGD,QAAA,MAAM,UAAU,GAAG,CAAC,EAAO,KAAY;AACrC,YAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;AAC9E,gBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE;YACtB;;AAEA,YAAA,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,QAAA,CAAC;QAED,OAAO;AACL,YAAA,OAAO,EAAE,CAAC,EAAO,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAU,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtE,YAAA,MAAM,EAAE,CAAC,UAAW,KAClB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAuB,QAAQ,EAAE,EAAE;AAC9C,gBAAA,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC;aAChC,CAAC;AAEJ,YAAA,MAAM,EAAE,CAAC,MAAwB,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAU,QAAQ,EAAE,EAAE,MAAM,CAAC;YAEjF,MAAM,EAAE,CAAC,EAAO,EAAE,MAAwB,KACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAU,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;AAE1D,YAAA,MAAM,EAAE,CAAC,EAAO,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;SACtE;IACH;uGAhDW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACDlC,SAAS,QAAQ,CAAC,OAA2B,EAAE,QAAgB,EAAA;AAC7D,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,QAAQ;AAC7B,IAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AACzE;MAEa,kBAAkB,CAAA;AAEV,IAAA,IAAA;AACA,IAAA,OAAA;IAFnB,WAAA,CACmB,IAAgB,EAChB,OAAgB,EAAA;QADhB,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,OAAO,GAAP,OAAO;IACvB;AAEK,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,OAAO;AACL,YAAA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAC/B,YAAA,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE;SAC9B;IACH;IAEQ,MAAM,OAAO,CAAI,MAKxB,EAAA;AACC,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;AAErD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE;YAC9D,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,GAAG,WAAW;AACf,SAAA,CAAC;AAEF,QAAA,OAAO,MAAM,aAAa,CAAC,UAAU,CAAC;IACxC;;IAGA,GAAG,CAAI,GAAW,EAAE,OAAqB,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACtD;;AAGA,IAAA,IAAI,CAAI,GAAW,EAAE,IAAc,EAAE,OAAqB,EAAA;AACxD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7D;;AAGA,IAAA,GAAG,CAAI,GAAW,EAAE,IAAc,EAAE,OAAqB,EAAA;AACvD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC5D;;IAGA,MAAM,CAAI,GAAW,EAAE,OAAqB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACzD;AACD;;MCnDY,iBAAiB,CAAA;AACpB,IAAA,MAAM;AACN,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEzC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;IACvC;AAEA;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE9D,OAAO;AACL,YAAA,GAAGA,gBAAc;;YAEjB,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,IAAIA,gBAAc,CAAC,UAAU;AACpE,YAAA,oBAAoB,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY;;AAEpD,YAAA,GAAG,cAAc;SAClB;IACH;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;IAC3B;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,OAA4B,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE;IAC9C;AAEA;;AAEG;AACH,IAAA,GAAG,CAA6B,GAAM,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,OAAyB,EAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,QAAA,OAAO,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;IACnD;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,UAAmB,EAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;AACtC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,OAAO;AAC/B,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;IACxD;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,GAAW,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CACjC,CAAC,cAAc,KAAK,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACzF;IACH;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,MAAc,EAAA;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CACpC,CAAC,aAAa,KAAK,aAAa,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CACxE;IACH;AAEA;;AAEG;IACH,gBAAgB,GAAA;QACd,MAAM,OAAO,GAA2B,EAAE;AAE1C,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACjE,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG,KAAK;AAC9D,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;IACvC;uGAlGW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;AAsGD;AACM,SAAU,iBAAiB,CAAC,MAAA,GAA8B,EAAE,EAAA;IAChE,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,WAAW;AACpB,YAAA,QAAQ,EAAE,MAAM;AACjB,SAAA;KACF;AACH;AAEA;AACM,SAAU,gBAAgB,CAAC,SAAA,GAAiC,EAAE,EAAA;IAClE,OAAO;AACL,QAAA,GAAGA,gBAAc;AACjB,QAAA,GAAG,SAAS;KACb;AACH;;MCtHsB,WAAW,CAAA;AAKhC;;ACLD;AACM,MAAgB,OAAoC,SAAQ,WAAgC,CAAA;;AAEtF,IAAA,QAAQ,CAAC,QAAkB,EAAA;QACnC,OAAO,EAAE,CAAC;IACZ;AAES,IAAA,OAAO,CAAC,OAAiB,EAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AACrC,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,OAAO,UAAU,CAAC,OAAO;AACvB,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,mBAAmB;gBAC5B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;AACnE,gBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACpC,aAAA,CAAC,CAAC;QACL;AAEA,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CACvCC,YAAU,CAAC,CAAC,KAAK,KAAI;;AAEnB,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,YAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC;;AAGlE,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAGD;;AChCK,MAAgB,KAA2B,SAAQ,WAAgC,CAAA;AAC9E,IAAA,OAAO,CAAC,OAAiB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CACvCA,YAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,YAAA,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AAChE,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAGD;;AClBD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@acontplus/ng-infrastructure",
3
- "version": "2.0.8",
3
+ "version": "2.0.11",
4
4
  "description": "Angular infrastructure library implementing clean architecture patterns with HTTP interceptors, repository implementations, adapters, dependency injection providers, and core infrastructure services for enterprise applications.",
5
5
  "peerDependencies": {
6
6
  "@acontplus/core": "^1.1.4",
7
7
  "@acontplus/ng-config": "^2.0.3",
8
8
  "@acontplus/ng-notifications": "^2.0.5",
9
- "@acontplus/ng-components": "^2.1.28",
9
+ "@acontplus/ng-components": "^2.1.30",
10
10
  "@angular/common": "^21.0.0",
11
11
  "@angular/core": "^21.0.0"
12
12
  },
@@ -5,7 +5,15 @@ import { Observable } from 'rxjs';
5
5
  import { RepositoryConfig, PaginationParams, PagedResult, HttpPort, HttpOptions, CoreConfig } from '@acontplus/core';
6
6
  import { BaseRepository, SearchableRepository } from '@acontplus/ng-config';
7
7
 
8
+ /**
9
+ * Skip all toast notifications for a specific request.
10
+ * Usage: new HttpContext().set(SKIP_NOTIFICATION, true)
11
+ */
8
12
  declare const SKIP_NOTIFICATION: HttpContextToken<boolean>;
13
+ /**
14
+ * Force-show or force-hide notifications, overriding URL/method exclusion logic.
15
+ * Usage: new HttpContext().set(SHOW_NOTIFICATIONS, true)
16
+ */
9
17
  declare const SHOW_NOTIFICATIONS: HttpContextToken<boolean | undefined>;
10
18
  declare const apiInterceptor: HttpInterceptorFn;
11
19
 
@@ -22,13 +30,18 @@ interface HttpContextConfig {
22
30
  correlationIdHeader?: string;
23
31
  requestIdHeader?: string;
24
32
  timestampHeader?: string;
33
+ /** URL substrings or regex patterns to exclude from header injection. */
25
34
  excludeUrls?: string[];
35
+ /** URL substrings that should NOT receive an Authorization header. */
36
+ skipAuthUrls?: string[];
26
37
  includeAuthToken?: boolean;
27
38
  baseUrlInjection?: boolean;
39
+ /** Called when a 401 is received and a refresh token is available. */
28
40
  refreshTokenCallback?: () => Observable<{
29
41
  token: string;
30
42
  refreshToken?: string;
31
43
  }>;
44
+ /** Called after a failed token refresh — should clear auth state. */
32
45
  logoutCallback?: () => void;
33
46
  }
34
47
  declare const HTTP_CONTEXT_CONFIG: InjectionToken<HttpContextConfig>;
@@ -52,29 +65,36 @@ interface HttpErrorLog extends HttpRequestLog {
52
65
  environment: string;
53
66
  }
54
67
  declare function createHttpContextConfig(overrides?: Partial<HttpContextConfig>): HttpContextConfig;
68
+ /**
69
+ * Register the interceptor configuration in your app providers.
70
+ *
71
+ * @example
72
+ * // app.config.ts
73
+ * provideHttpClient(
74
+ * withInterceptors([
75
+ * httpContextInterceptor, // 1st — adds headers, handles 401 refresh
76
+ * apiInterceptor, // 2nd — normalises response, shows toasts
77
+ * ])
78
+ * ),
79
+ * ...provideHttpContext({ clientVersion: '2.0.0' }),
80
+ */
55
81
  declare function provideHttpContext(config?: Partial<HttpContextConfig>): {
56
82
  provide: InjectionToken<HttpContextConfig>;
57
83
  useValue: HttpContextConfig;
58
84
  }[];
59
85
 
60
- /**
61
- * Helper function to disable spinner for specific requests
62
- * @returns HttpContext with spinner disabled
63
- */
86
+ declare const SHOW_SPINNER: HttpContextToken<boolean>;
64
87
  declare function withoutSpinner(): HttpContext;
65
- /**
66
- * Service to track active HTTP requests
67
- */
68
88
  declare class ActiveRequestsTracker {
89
+ private readonly requests;
69
90
  get count(): number;
70
- add(request: HttpRequest<unknown>): void;
71
- remove(request: HttpRequest<unknown>): void;
91
+ /** Retorna true si se pasa de 0 → 1 (primera request activa). */
92
+ add(request: HttpRequest<unknown>): boolean;
93
+ /** Retorna true si se pasa de 1 → 0 (última request completada). */
94
+ remove(request: HttpRequest<unknown>): boolean;
72
95
  static ɵfac: i0.ɵɵFactoryDeclaration<ActiveRequestsTracker, never>;
73
96
  static ɵprov: i0.ɵɵInjectableDeclaration<ActiveRequestsTracker>;
74
97
  }
75
- /**
76
- * Interceptor that shows/hides a loading spinner based on active HTTP requests
77
- */
78
98
  declare const spinnerInterceptor: HttpInterceptorFn;
79
99
 
80
100
  declare abstract class BaseHttpRepository {
@@ -230,5 +250,5 @@ declare abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest,
230
250
  protected abstract executeInternal(request: TRequest): Observable<TResponse>;
231
251
  }
232
252
 
233
- export { ActiveRequestsTracker, AngularHttpAdapter, BaseHttpRepository, BaseUseCase, Command, CoreConfigService, CorrelationInfo, GenericRepository, HTTP_CONTEXT_CONFIG, LoggingService, Query, REPOSITORY_CONFIG, RepositoryFactory, SHOW_NOTIFICATIONS, SKIP_NOTIFICATION, SearchableGenericRepository, apiInterceptor, createCoreConfig, createHttpContextConfig, customUrl, httpContextInterceptor, provideCoreConfig, provideHttpContext, skipContextHeaders, spinnerInterceptor, withCustomHeaders, withoutSpinner };
253
+ export { ActiveRequestsTracker, AngularHttpAdapter, BaseHttpRepository, BaseUseCase, Command, CoreConfigService, CorrelationInfo, GenericRepository, HTTP_CONTEXT_CONFIG, LoggingService, Query, REPOSITORY_CONFIG, RepositoryFactory, SHOW_NOTIFICATIONS, SHOW_SPINNER, SKIP_NOTIFICATION, SearchableGenericRepository, apiInterceptor, createCoreConfig, createHttpContextConfig, customUrl, httpContextInterceptor, provideCoreConfig, provideHttpContext, skipContextHeaders, spinnerInterceptor, withCustomHeaders, withoutSpinner };
234
254
  export type { HttpContextConfig, HttpErrorLog, HttpRequestLog, UseCase };