@rxap/ngx-error
Version:
This package provides a comprehensive error handling solution for Angular applications, including interceptors, services, and UI components to display different types of errors in a user-friendly dialog. It supports handling of generic errors, HTTP errors
1 lines • 60.5 kB
Source Map (JSON)
{"version":3,"file":"rxap-ngx-error.mjs","sources":["../../../../../packages/angular/error/src/lib/tokens.ts","../../../../../packages/angular/error/src/lib/open-api-http-response-error/open-api-http-response-error.component.ts","../../../../../packages/angular/error/src/lib/open-api-http-response-error/open-api-http-response-error.component.html","../../../../../packages/angular/error/src/lib/error-dialog/error-dialog.component.ts","../../../../../packages/angular/error/src/lib/error-dialog/error-dialog.component.html","../../../../../packages/angular/error/src/lib/error-capture.service.ts","../../../../../packages/angular/error/src/lib/any-http-error/any-http-error.component.ts","../../../../../packages/angular/error/src/lib/any-http-error/any-http-error.component.html","../../../../../packages/angular/error/src/lib/any-http-error/any-http-error.service.ts","../../../../../packages/angular/error/src/lib/open-api-http-response-error/open-api-http-response-error.service.ts","../../../../../packages/angular/error/src/lib/message-http-error/message-http-error.component.ts","../../../../../packages/angular/error/src/lib/message-http-error/message-http-error.component.html","../../../../../packages/angular/error/src/lib/message-http-error/message-http-error.service.ts","../../../../../packages/angular/error/src/lib/error/angular-error.component.ts","../../../../../packages/angular/error/src/lib/error/angular-error.component.html","../../../../../packages/angular/error/src/lib/error/angular-error.service.ts","../../../../../packages/angular/error/src/lib/code-http-error/code-http-error.component.ts","../../../../../packages/angular/error/src/lib/code-http-error/code-http-error.component.html","../../../../../packages/angular/error/src/lib/code-http-error/code-http-error.service.ts","../../../../../packages/angular/error/src/lib/utilities.ts","../../../../../packages/angular/error/src/lib/error-handler.ts","../../../../../packages/angular/error/src/lib/error-interceptor-options.ts","../../../../../packages/angular/error/src/lib/http-error-interceptor.ts","../../../../../packages/angular/error/src/index.ts","../../../../../packages/angular/error/src/rxap-ngx-error.ts"],"sourcesContent":["import { ComponentType } from '@angular/cdk/overlay';\nimport {\n InjectionToken,\n Signal,\n} from '@angular/core';\nimport { IErrorDialogComponent } from './error-dialog/error-dialog.component';\nimport { ErrorInterceptorOptions } from './error-interceptor-options';\n\nexport const RXAP_ERROR_DIALOG_DATA = new InjectionToken<Signal<any[]>>('rxap/error/dialog-data');\n\nexport const RXAP_ERROR_DIALOG_ERROR = new InjectionToken<any>('rxap/error/dialog-error');\n\nexport const RXAP_ERROR_DIALOG_COMPONENT = new InjectionToken<ComponentType<IErrorDialogComponent>>(\n 'rxap/error/dialog-component');\n\nexport const RXAP_ERROR_INTERCEPTOR_OPTIONS = new InjectionToken<ErrorInterceptorOptions>(\n 'rxap/error/interceptor-options');\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n} from '@angular/core';\nimport {\n CopyToClipboardComponent,\n JsonViewerComponent,\n} from '@rxap/components';\nimport {\n DataGridCellDefDirective,\n DataGridComponent,\n DataGridRowDefDirective,\n} from '@rxap/data-grid';\nimport { RXAP_ENVIRONMENT } from '@rxap/environment';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { RXAP_ERROR_DIALOG_ERROR } from '../tokens';\nimport { OpenApiHttpResponseErrorDialogData } from './open-api-http-response-error-dialog-data';\n\n@Component({\n selector: 'rxap-open-api-http-response-error',\n imports: [\n CommonModule, CopyToClipboardComponent, DataGridCellDefDirective, DataGridComponent,\n DataGridRowDefDirective, JsonViewerComponent,\n ],\n templateUrl: './open-api-http-response-error.component.html',\n styleUrl: './open-api-http-response-error.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OpenApiHttpResponseErrorComponent implements IErrorDialogComponent<OpenApiHttpResponseErrorDialogData> {\n\n public readonly isProduction: boolean = inject(RXAP_ENVIRONMENT, { optional: true })?.production ?? false;\n\n public readonly error: OpenApiHttpResponseErrorDialogData = inject(RXAP_ERROR_DIALOG_ERROR);\n}\n","<rxap-data-grid [data]=\"error\">\n <ng-container rxapDataGridRowDef=\"name\"></ng-container>\n <ng-container rxapDataGridRowDef=\"timestamp\">\n <td *rxapDataGridCellDef=\"let value\">{{ value | date:'HH:mm:ss' }}</td>\n </ng-container>\n <ng-container rxapDataGridRowDef=\"method\"></ng-container>\n <ng-container rxapDataGridRowDef=\"url\"></ng-container>\n <ng-container rxapDataGridRowDef=\"status\"></ng-container>\n <ng-container rxapDataGridRowDef=\"statusText\"></ng-container>\n <ng-container rxapDataGridRowDef=\"message\"></ng-container>\n <ng-container rxapDataGridRowDef=\"headers\">\n <td *rxapDataGridCellDef=\"let value\">\n <rxap-data-grid [data]=\"value\">\n <ng-container *ngFor=\"let entry of value | keyvalue\" [rxapDataGridRowDef]=\"$any(entry.key)\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value.length > 1\">\n <ul>\n <li *ngFor=\"let item of value\">{{ item }}</li>\n </ul>\n </ng-container>\n <ng-container *ngIf=\"value.length === 1\">{{ value[0] }}</ng-container>\n <ng-container *ngIf=\"value.length === 0\">NONE</ng-container>\n </td>\n </ng-container>\n </rxap-data-grid>\n </td>\n </ng-container>\n <ng-container *ngIf=\"!isProduction\" rxapDataGridRowDef=\"error\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value\">\n <rxap-copy-to-clipboard [value]=\"value | json\">Copy Response Body</rxap-copy-to-clipboard>\n <div class=\"body\">\n <rxap-json-viewer [expanded]=\"false\" [json]=\"value\"></rxap-json-viewer>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!value\">NONE</ng-container>\n </td>\n </ng-container>\n <ng-container *ngIf=\"!isProduction\" rxapDataGridRowDef=\"body\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value\">\n <rxap-copy-to-clipboard [value]=\"value | json\">Copy Request Body</rxap-copy-to-clipboard>\n <div class=\"body\">\n <rxap-json-viewer [expanded]=\"false\" [json]=\"value\"></rxap-json-viewer>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!value\">NONE</ng-container>\n </td>\n </ng-container>\n</rxap-data-grid>\n","import {\n ComponentPortal,\n PortalModule,\n} from '@angular/cdk/portal';\nimport {\n NgClass,\n NgForOf,\n NgIf,\n} from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n INJECTOR,\n Injector,\n Output,\n signal,\n Signal,\n ViewChild,\n} from '@angular/core';\nimport {\n RXAP_ERROR_DIALOG_COMPONENT,\n RXAP_ERROR_DIALOG_DATA,\n RXAP_ERROR_DIALOG_ERROR,\n} from '../tokens';\n\nexport interface IErrorDialogComponent<Error = any> {\n error: Error;\n}\n\n@Component({\n selector: 'rxap-error-dialog',\n templateUrl: './error-dialog.component.html',\n styleUrls: ['./error-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n imports: [\n NgIf,\n NgClass,\n NgForOf,\n PortalModule,\n ]\n})\nexport class ErrorDialogComponent implements AfterViewInit {\n\n @ViewChild('dialog', { static: true })\n public dialog!: ElementRef<HTMLDialogElement>;\n\n public readonly data: Signal<any[]> = inject(RXAP_ERROR_DIALOG_DATA);\n\n public readonly activeIndex = signal(0);\n public readonly displayedButtons = computed(() => {\n const start = Math.max(0, this.activeIndex() - 2);\n const end = Math.min(this.data().length, start + 5);\n return Array.from({ length: end - start }, (_, i) => start + i);\n });\n @Output()\n public closeDialog = new EventEmitter<void>();\n private readonly component = inject(RXAP_ERROR_DIALOG_COMPONENT);\n private readonly injector = inject(INJECTOR);\n public readonly componentPortal = computed(() => {\n const index = this.activeIndex();\n const data = this.data();\n const injector = Injector.create({\n parent: this.injector,\n providers: [\n {\n provide: RXAP_ERROR_DIALOG_ERROR,\n useValue: data[index],\n },\n ],\n });\n return new ComponentPortal(this.component, null, injector);\n });\n\n ngAfterViewInit() {\n this.dialog.nativeElement.showModal();\n }\n\n close() {\n this.dialog.nativeElement.close();\n this.closeDialog.emit();\n }\n\n}\n","<dialog #dialog\n class=\"rounded overflow-auto drop-shadow-2xl bg-white text-black dark:bg-black dark:text-white flex flex-col gap-3 p-6\"\n style=\"max-width: 80vw; max-height: 80vh\">\n <div *ngIf=\"data().length > 1\" class=\"controls flex justify-center space-x-2 mt-4\">\n <button\n (click)=\"activeIndex.set(activeIndex() - 1)\"\n *ngIf=\"activeIndex() > 0\" class=\"px-4 py-2 bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 hover:bg-gray-300 transition-colors duration-150 rounded\">Previous\n </button>\n <button (click)=\"activeIndex.set(item)\"\n *ngFor=\"let item of displayedButtons()\"\n [ngClass]=\"{\n 'bg-primary-500': item === activeIndex(),\n 'bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 hover:bg-gray-300 transition-colors duration-150': item !== activeIndex()\n }\"\n class=\"px-4 py-2 rounded\">\n {{ item + 1 }}\n </button>\n <button\n (click)=\"activeIndex.set(activeIndex() + 1)\"\n *ngIf=\"activeIndex() < data().length - 1\" class=\"px-4 py-2 bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 hover:bg-gray-300 transition-colors duration-150 rounded\">Next\n </button>\n </div>\n <div class=\"flex flex-col overflow-auto\">\n <ng-template [cdkPortalOutlet]=\"componentPortal()\"></ng-template>\n </div>\n <button (click)=\"close()\" class=\"px-4 py-2 rounded bg-primary-500\" i18n>close</button>\n</dialog>\n","import { ComponentType } from '@angular/cdk/overlay';\nimport {\n ApplicationRef,\n createComponent,\n inject,\n Injectable,\n Injector,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { take } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport {\n ErrorDialogComponent,\n IErrorDialogComponent,\n} from './error-dialog/error-dialog.component';\nimport {\n RXAP_ERROR_DIALOG_COMPONENT,\n RXAP_ERROR_DIALOG_DATA,\n} from './tokens';\n\n@Injectable()\nexport abstract class ErrorCaptureService<Error = any> {\n\n protected abstract readonly component: ComponentType<IErrorDialogComponent>;\n private readonly applicationRef = inject(ApplicationRef);\n private errorList: Array<WritableSignal<Error[]>> = [];\n\n push(error: Error) {\n if (this.errorList.length) {\n const last = this.errorList[this.errorList.length - 1];\n const value = last();\n if (value.some(e => this.compare(e, error))) {\n last.update(value => {\n value.push(error);\n return value.slice();\n });\n return;\n }\n }\n const newList = signal([ error ]);\n this.errorList.push(newList);\n this.openDialog(newList);\n }\n\n abstract compare(a: Error, b: Error): boolean;\n\n openDialog(errorList: WritableSignal<Error[]>) {\n const body = document.getElementsByTagName('body')[0];\n const div = document.createElement('div');\n body.appendChild(div);\n const componentRef = createComponent(ErrorDialogComponent, {\n hostElement: div,\n environmentInjector: this.applicationRef.injector,\n elementInjector: Injector.create({\n providers: [\n {\n provide: RXAP_ERROR_DIALOG_DATA,\n useValue: errorList,\n },\n {\n provide: RXAP_ERROR_DIALOG_COMPONENT,\n useValue: this.component,\n },\n ],\n }),\n });\n this.applicationRef.attachView(componentRef.hostView);\n componentRef.instance.closeDialog.pipe(\n take(1),\n tap(() => {\n componentRef.destroy();\n body.removeChild(div);\n div.remove();\n this.errorList.splice(this.errorList.indexOf(errorList), 1);\n }),\n ).subscribe();\n }\n\n}\n","import {\n DatePipe,\n JsonPipe,\n KeyValuePipe,\n NgForOf,\n NgIf,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n} from '@angular/core';\nimport {\n CopyToClipboardComponent,\n JsonViewerComponent,\n} from '@rxap/components';\nimport { DataGridModule } from '@rxap/data-grid';\nimport { RXAP_ENVIRONMENT } from '@rxap/environment';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { RXAP_ERROR_DIALOG_ERROR } from '../tokens';\nimport { AnyHttpErrorDialogData } from './any-http-error-dialog-data';\n\n@Component({\n selector: 'rxap-any-http-error',\n templateUrl: './any-http-error.component.html',\n styleUrls: ['./any-http-error.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n DataGridModule,\n NgIf,\n DatePipe,\n KeyValuePipe,\n NgForOf,\n CopyToClipboardComponent,\n JsonPipe,\n JsonViewerComponent,\n ]\n})\nexport class AnyHttpErrorComponent implements IErrorDialogComponent<AnyHttpErrorDialogData> {\n\n public readonly isProduction: boolean = inject(RXAP_ENVIRONMENT, { optional: true })?.production ?? false;\n\n public readonly error: AnyHttpErrorDialogData = inject(RXAP_ERROR_DIALOG_ERROR);\n\n}\n","<rxap-data-grid [data]=\"error\">\n <ng-container rxapDataGridRowDef=\"name\"></ng-container>\n <ng-container rxapDataGridRowDef=\"timestamp\">\n <td *rxapDataGridCellDef=\"let value\">{{ value | date:'HH:mm:ss' }}</td>\n </ng-container>\n <ng-container rxapDataGridRowDef=\"method\"></ng-container>\n <ng-container rxapDataGridRowDef=\"url\"></ng-container>\n <ng-container rxapDataGridRowDef=\"status\"></ng-container>\n <ng-container rxapDataGridRowDef=\"statusText\"></ng-container>\n <ng-container rxapDataGridRowDef=\"message\"></ng-container>\n <ng-container rxapDataGridRowDef=\"headers\">\n <td *rxapDataGridCellDef=\"let value\">\n <rxap-data-grid [data]=\"value\">\n <ng-container *ngFor=\"let entry of value | keyvalue\" [rxapDataGridRowDef]=\"$any(entry.key)\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value.length > 1\">\n <ul>\n <li *ngFor=\"let item of value\">{{ item }}</li>\n </ul>\n </ng-container>\n <ng-container *ngIf=\"value.length === 1\">{{ value[0] }}</ng-container>\n <ng-container *ngIf=\"value.length === 0\">NONE</ng-container>\n </td>\n </ng-container>\n </rxap-data-grid>\n </td>\n </ng-container>\n <ng-container *ngIf=\"!isProduction\" rxapDataGridRowDef=\"error\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value\">\n <rxap-copy-to-clipboard [value]=\"value | json\">Copy Response Body</rxap-copy-to-clipboard>\n <div class=\"body\">\n <rxap-json-viewer [expanded]=\"false\" [json]=\"value\"></rxap-json-viewer>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!value\">NONE</ng-container>\n </td>\n </ng-container>\n <ng-container *ngIf=\"!isProduction\" rxapDataGridRowDef=\"body\">\n <td *rxapDataGridCellDef=\"let value\">\n <ng-container *ngIf=\"value\">\n <rxap-copy-to-clipboard [value]=\"value | json\">Copy Request Body</rxap-copy-to-clipboard>\n <div class=\"body\">\n <rxap-json-viewer [expanded]=\"false\" [json]=\"value\"></rxap-json-viewer>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!value\">NONE</ng-container>\n </td>\n </ng-container>\n</rxap-data-grid>\n","import { ComponentType } from '@angular/cdk/overlay';\nimport { Injectable } from '@angular/core';\nimport { ErrorCaptureService } from '../error-capture.service';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { AnyHttpErrorDialogData } from './any-http-error-dialog-data';\nimport { AnyHttpErrorComponent } from './any-http-error.component';\n\n@Injectable({ providedIn: 'root' })\nexport class AnyHttpErrorService<Error extends AnyHttpErrorDialogData = AnyHttpErrorDialogData>\n extends ErrorCaptureService<Error> {\n\n protected readonly component: ComponentType<IErrorDialogComponent> = AnyHttpErrorComponent;\n\n override compare(a: Error, b: Error): boolean {\n return a.url === b.url && a.method === b.method && a.status === b.status && a.message === b.message;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { AnyHttpErrorService } from '../any-http-error/any-http-error.service';\nimport { OpenApiHttpResponseErrorDialogData } from './open-api-http-response-error-dialog-data';\nimport { OpenApiHttpResponseErrorComponent } from './open-api-http-response-error.component';\n\n@Injectable({ providedIn: 'root' })\nexport class OpenApiHttpResponseErrorService extends AnyHttpErrorService<OpenApiHttpResponseErrorDialogData> {\n\n protected override readonly component = OpenApiHttpResponseErrorComponent;\n\n override compare(a: OpenApiHttpResponseErrorDialogData, b: OpenApiHttpResponseErrorDialogData): boolean {\n return true;\n }\n\n}\n","import { NgIf } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n signal,\n} from '@angular/core';\nimport { RXAP_ENVIRONMENT } from '@rxap/environment';\nimport { AnyHttpErrorComponent } from '../any-http-error/any-http-error.component';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { RXAP_ERROR_DIALOG_ERROR } from '../tokens';\nimport { MessageHttpErrorDialogData } from './message-http-error-dialog-data';\n\n@Component({\n selector: 'rxap-http-error-message',\n templateUrl: './message-http-error.component.html',\n styleUrls: ['./message-http-error.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgIf,\n AnyHttpErrorComponent,\n ]\n})\nexport class MessageHttpErrorComponent implements IErrorDialogComponent<MessageHttpErrorDialogData> {\n\n public readonly isProduction: boolean = inject(RXAP_ENVIRONMENT, { optional: true })?.production ?? false;\n\n public readonly error: MessageHttpErrorDialogData = inject(RXAP_ERROR_DIALOG_ERROR);\n\n public readonly showMore = signal(false);\n\n}\n","<div class=\"flex flex-col gap-2\">\n <p class=\"text-xl\">Http Error Message:</p>\n <p>{{ error.error.message }}</p>\n <ng-container *ngIf=\"!isProduction\">\n <hr>\n <button (click)=\"showMore.set(true)\"\n *ngIf=\"!showMore()\"\n class=\"px-4 py-2 rounded bg-accent-500\">\n <ng-container i18n>Show more details</ng-container>\n </button>\n <rxap-any-http-error *ngIf=\"showMore()\"></rxap-any-http-error>\n </ng-container>\n</div>\n","import { Injectable } from '@angular/core';\nimport { AnyHttpErrorService } from '../any-http-error/any-http-error.service';\nimport { MessageHttpErrorDialogData } from './message-http-error-dialog-data';\nimport { MessageHttpErrorComponent } from './message-http-error.component';\n\n@Injectable({ providedIn: 'root' })\nexport class MessageHttpErrorService extends AnyHttpErrorService<MessageHttpErrorDialogData> {\n\n protected override readonly component = MessageHttpErrorComponent;\n\n override compare(a: MessageHttpErrorDialogData, b: MessageHttpErrorDialogData): boolean {\n return super.compare(a, b) && a.error.message === b.error.message;\n }\n\n}\n","import {\n KeyValuePipe,\n NgForOf,\n NgIf,\n} from '@angular/common';\nimport {\n Component,\n inject,\n} from '@angular/core';\nimport { DataGridModule } from '@rxap/data-grid';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { RXAP_ERROR_DIALOG_ERROR } from '../tokens';\nimport { AngularErrorDialogData } from './angular-error-dialog-data';\n\n@Component({\n selector: 'rxap-angular-error',\n imports: [DataGridModule, KeyValuePipe, NgForOf, NgIf],\n templateUrl: './angular-error.component.html',\n styleUrls: ['./angular-error.component.scss']\n})\nexport class AngularErrorComponent implements IErrorDialogComponent<AngularErrorDialogData> {\n\n public readonly error: AngularErrorDialogData = inject(RXAP_ERROR_DIALOG_ERROR);\n\n public get hasTags(): boolean {\n return Object.keys(this.error.tags).length > 0;\n }\n\n public get hasContexts(): boolean {\n return Object.keys(this.error.contexts).length > 0;\n }\n\n public get hasExtra(): boolean {\n return Object.keys(this.error.extra).length > 0;\n }\n\n}\n","<rxap-data-grid [data]=\"error\">\n <ng-container *ngIf=\"error.name\" rxapDataGridRowDef=\"name\"></ng-container>\n <ng-container rxapDataGridRowDef=\"message\"></ng-container>\n <ng-container *ngIf=\"hasExtra || hasTags || hasContexts || error.stack\" rxapDataGridRowDef>\n <th *rxapDataGridHeaderCellDef>\n <span i18n>Details</span>\n </th>\n </ng-container>\n <ng-container *ngIf=\"error.stack\" rxapDataGridRowDef=\"stack\">\n <td *rxapDataGridCellDef=\"let value\">\n <pre>{{ value }}</pre>\n </td>\n </ng-container>\n <ng-container *ngIf=\"hasTags\" rxapDataGridRowDef=\"tags\">\n <td *rxapDataGridCellDef=\"let value\">\n <rxap-data-grid [data]=\"value\" auto></rxap-data-grid>\n </td>\n </ng-container>\n <ng-container *ngIf=\"hasExtra\" rxapDataGridRowDef=\"extra\">\n <td *rxapDataGridCellDef=\"let value\">\n <rxap-data-grid [data]=\"value\" auto></rxap-data-grid>\n </td>\n </ng-container>\n <ng-container *ngIf=\"hasContexts\" rxapDataGridRowDef=\"contexts\">\n <td *rxapDataGridCellDef=\"let value\">\n <rxap-data-grid [data]=\"value\" auto></rxap-data-grid>\n </td>\n </ng-container>\n</rxap-data-grid>\n","import { Injectable } from '@angular/core';\nimport { ErrorCaptureService } from '../error-capture.service';\nimport { AngularErrorDialogData } from './angular-error-dialog-data';\nimport { AngularErrorComponent } from './angular-error.component';\n\n@Injectable({ providedIn: 'root' })\nexport class AngularErrorService extends ErrorCaptureService<AngularErrorDialogData> {\n\n protected readonly component = AngularErrorComponent;\n\n override compare(a: AngularErrorDialogData, b: AngularErrorDialogData): boolean {\n return true;\n }\n\n}\n","import { NgIf } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n signal,\n} from '@angular/core';\nimport { RXAP_ENVIRONMENT } from '@rxap/environment';\nimport { AnyHttpErrorComponent } from '../any-http-error/any-http-error.component';\nimport { IErrorDialogComponent } from '../error-dialog/error-dialog.component';\nimport { RXAP_ERROR_DIALOG_ERROR } from '../tokens';\nimport { CodeHttpErrorDialogData } from './code-http-error-dialog-data';\n\n@Component({\n selector: 'rxap-http-error-message',\n templateUrl: './code-http-error.component.html',\n styleUrls: ['./code-http-error.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgIf,\n AnyHttpErrorComponent,\n ]\n})\nexport class CodeHttpErrorComponent implements IErrorDialogComponent<CodeHttpErrorDialogData> {\n\n public readonly isProduction: boolean = inject(RXAP_ENVIRONMENT, { optional: true })?.production ?? false;\n\n public readonly error: CodeHttpErrorDialogData = inject(RXAP_ERROR_DIALOG_ERROR);\n\n public readonly showMore = signal(false);\n\n}\n","<div class=\"flex flex-col gap-2\">\n <p class=\"text-xl\">Http Error Code: <span class=\"font-bold text-red-800\">{{ error.errorCode }}</span></p>\n <p>{{ error.error.message ?? error.message }}</p>\n <ng-container *ngIf=\"!isProduction\">\n <hr>\n <button (click)=\"showMore.set(true)\"\n *ngIf=\"!showMore()\"\n class=\"px-4 py-2 rounded bg-accent-500\">\n <ng-container i18n>Show more details</ng-container>\n </button>\n <rxap-any-http-error *ngIf=\"showMore()\"></rxap-any-http-error>\n </ng-container>\n</div>\n","import { Injectable } from '@angular/core';\nimport { AnyHttpErrorService } from '../any-http-error/any-http-error.service';\nimport { CodeHttpErrorDialogData } from './code-http-error-dialog-data';\nimport { CodeHttpErrorComponent } from './code-http-error.component';\n\n@Injectable({ providedIn: 'root' })\nexport class CodeHttpErrorService extends AnyHttpErrorService<CodeHttpErrorDialogData> {\n\n protected override readonly component = CodeHttpErrorComponent;\n\n override compare(a: CodeHttpErrorDialogData, b: CodeHttpErrorDialogData): boolean {\n return super.compare(a, b) && a.errorCode === b.errorCode;\n }\n\n}\n","import {\n HttpErrorResponse,\n HttpEventType,\n} from '@angular/common/http';\n\nexport interface SimplifiedHttpErrorResponse extends Record<string, unknown> {\n url: string | null;\n message: string;\n name: string;\n status: number;\n statusText: string;\n headers: Record<string, string[]>;\n error: any;\n errorMessage: string;\n ok: boolean;\n type: HttpEventType.Response | HttpEventType.ResponseHeader;\n}\n\nexport function SimplifyHttpErrorResponse(event: HttpErrorResponse): SimplifiedHttpErrorResponse {\n let error = event.error;\n if (typeof error !== 'object') {\n if (error instanceof Blob) {\n console.warn('error response object is a blob');\n error = '[BLOB]';\n } else {\n try {\n error = JSON.parse(error);\n } catch (e) {\n console.warn('error response object is not a json');\n }\n }\n }\n return {\n errorMessage: (typeof error === 'object' ? error?.message : undefined) ?? event.message,\n error: error,\n message: event.message,\n name: event.name,\n status: event.status,\n statusText: event.statusText,\n url: event.url,\n ok: event.ok,\n type: event.type,\n headers: event.headers.keys()\n .reduce((map, key) => ({\n ...map,\n [key]: event.headers.getAll(key),\n }), {}),\n };\n}\n\nexport function ExtractContextFromError(error: unknown) {\n const context: Record<string, Record<string, unknown>> = {};\n\n if (error instanceof HttpErrorResponse) {\n context['response'] = SimplifyHttpErrorResponse(error);\n }\n\n return context;\n}\n\nexport function ExtractExtraFromError(error: unknown) {\n return {};\n}\n\nexport function ExtractTagsFromError(error: unknown) {\n return {};\n}\n\nexport function ExtractError(error: unknown) {\n if (error instanceof HttpErrorResponse) {\n return error;\n }\n\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return 'Handled unknown error';\n}\n\nexport function PrintError(errorCandidate: unknown) {\n if (errorCandidate instanceof HttpErrorResponse) {\n console.groupCollapsed(errorCandidate.message);\n const {\n headers,\n error,\n ...map\n } = SimplifyHttpErrorResponse(errorCandidate);\n if (typeof error === 'object' && error?.message) {\n console.log(error?.message);\n }\n console.log(error);\n console.table(map);\n console.groupCollapsed('Headers');\n console.table(headers);\n console.groupEnd();\n console.groupEnd();\n } else if (errorCandidate instanceof Error) {\n console.error(errorCandidate);\n } else if (typeof errorCandidate === 'string') {\n console.error(errorCandidate);\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n ErrorHandler,\n inject,\n Injectable,\n InjectionToken,\n INJECTOR,\n isDevMode,\n runInInjectionContext,\n StaticProvider,\n} from '@angular/core';\nimport { ConfigService } from '@rxap/config';\nimport {\n IsNotReleaseVersion,\n RXAP_ENVIRONMENT,\n} from '@rxap/environment';\nimport { OpenApiHttpResponseError } from '@rxap/open-api';\nimport * as Sentry from '@sentry/angular';\nimport { AngularErrorDialogData } from './error/angular-error-dialog-data';\nimport { AngularErrorService } from './error/angular-error.service';\nimport { OpenApiHttpResponseErrorDialogData } from './open-api-http-response-error/open-api-http-response-error-dialog-data';\nimport { OpenApiHttpResponseErrorService } from './open-api-http-response-error/open-api-http-response-error.service';\nimport {\n ExtractContextFromError,\n ExtractError,\n ExtractExtraFromError,\n ExtractTagsFromError,\n PrintError,\n SimplifyHttpErrorResponse,\n} from './utilities';\n\nexport interface ErrorHandlerOptions {\n logErrors?: boolean;\n showDialog?: boolean;\n sentry?: {\n showDialog?: boolean;\n dialogOptions?: Sentry.ReportDialogOptions;\n };\n}\n\nexport const RXAP_ERROR_HANDLER_OPTIONS = new InjectionToken<ErrorHandlerOptions>('rxap-error-handler-options', {\n providedIn: 'root',\n factory: () => ({ logErrors: true }),\n});\n\n@Injectable()\nexport class RxapErrorHandler implements ErrorHandler {\n\n protected readonly options: ErrorHandlerOptions = (() => {\n const options = inject(RXAP_ERROR_HANDLER_OPTIONS);\n const environment = inject(RXAP_ENVIRONMENT);\n const config = inject(ConfigService);\n options.logErrors ??= true;\n options.sentry ??= {};\n options.sentry.showDialog ??= config.get('sentry.showDialog', false);\n // enforce sentry showDialog to false in dev mode\n options.sentry.showDialog = !isDevMode() && options.sentry.showDialog;\n options.showDialog ??= IsNotReleaseVersion(environment);\n options.sentry.dialogOptions ??= config.get('sentry.dialogOptions', {});\n options.sentry.dialogOptions.user ??= {};\n return options;\n })();\n\n protected readonly injector = inject(INJECTOR);\n\n /**\n * Method called for every value captured through the ErrorHandler\n */\n public handleError(errorCandidate: unknown): void {\n\n let error = errorCandidate;\n\n // Try to unwrap zone.js error.\n // https://github.com/angular/angular/blob/master/packages/core/src/util/errors.ts\n if (error && (error as { ngOriginalError: Error }).ngOriginalError) {\n error = (error as { ngOriginalError: Error }).ngOriginalError;\n }\n\n const extractedError = ExtractError(error);\n\n const contexts = ExtractContextFromError(error);\n const extra = ExtractExtraFromError(error);\n const tags = ExtractTagsFromError(error);\n\n let eventId: string;\n\n // Capture handled exception and send it to Sentry.\n if (typeof extractedError === 'string') {\n eventId = Sentry.captureMessage(extractedError, {\n level: 'error',\n contexts,\n extra,\n tags,\n });\n } else {\n eventId = Sentry.captureException(extractedError, {\n level: 'error',\n contexts,\n extra,\n tags,\n });\n }\n\n if (this.options.logErrors) {\n PrintError(error);\n }\n\n if (this.options.sentry?.showDialog) {\n if (!(error instanceof HttpErrorResponse)) {\n Sentry.showReportDialog({\n ...(this.options.sentry.dialogOptions ?? {}),\n eventId,\n });\n }\n } else if (this.options.showDialog) {\n const nonMessage = 'unsupported error type for angular error dialog';\n const data: AngularErrorDialogData = {\n message: nonMessage,\n contexts,\n extra,\n tags,\n };\n if (typeof extractedError === 'string') {\n data.message = extractedError;\n } else if (!(extractedError instanceof HttpErrorResponse)) {\n data.message = extractedError.message;\n data.stack = extractedError.stack;\n data.name = extractedError.name;\n }\n\n if (extractedError instanceof OpenApiHttpResponseError) {\n this.showOpenApiHttpResponseErrorDialog({\n ...data,\n ...SimplifyHttpErrorResponse(extractedError.httpErrorResponse),\n timestamp: Date.now(),\n metadata: extractedError.metadata,\n method: !extractedError.metadata.operation || typeof extractedError.metadata.operation === 'string' ? 'unknown' : extractedError.metadata.operation.method,\n operationId: extractedError.operationId,\n serverId: extractedError.serverId\n });\n } else {\n if (data.message !== nonMessage) {\n this.showAngularErrorDialog(data);\n }\n }\n\n }\n\n }\n\n protected showOpenApiHttpResponseErrorDialog(data: OpenApiHttpResponseErrorDialogData): void {\n runInInjectionContext(this.injector, () => {\n inject(OpenApiHttpResponseErrorService).push(data);\n });\n }\n\n protected showAngularErrorDialog(data: AngularErrorDialogData): void {\n runInInjectionContext(this.injector, () => {\n inject(AngularErrorService).push(data);\n });\n }\n\n\n}\n\nexport function ProvideErrorHandler(): StaticProvider {\n return {\n provide: ErrorHandler,\n useClass: RxapErrorHandler,\n };\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nexport function DefaultErrorCodeExtractor(error: HttpErrorResponse): number | string | null {\n return error.error?.code ?? null;\n}\n\nexport function DefaultErrorFilter(error: HttpErrorResponse): boolean {\n return error.status >= 400 && (!error.url || !/\\/api\\/status/.test(error.url));\n}\n\nexport interface ErrorInterceptorOptions {\n extractErrorCode?: (error: HttpErrorResponse) => number | string | null;\n filter?: Array<(error: HttpErrorResponse) => boolean>;\n}\n","import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandlerFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport * as Sentry from '@sentry/angular';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AnyHttpErrorService } from './any-http-error/any-http-error.service';\nimport { CodeHttpErrorService } from './code-http-error/code-http-error.service';\nimport {\n DefaultErrorCodeExtractor,\n DefaultErrorFilter,\n} from './error-interceptor-options';\nimport { MessageHttpErrorService } from './message-http-error/message-http-error.service';\nimport { RXAP_ERROR_INTERCEPTOR_OPTIONS } from './tokens';\nimport {\n ExtractContextFromError,\n ExtractExtraFromError,\n ExtractTagsFromError,\n SimplifyHttpErrorResponse,\n} from './utilities';\n\nexport function HttpErrorInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> {\n\n const anyHttpErrorService = inject(AnyHttpErrorService);\n const messageHttpErrorService = inject(MessageHttpErrorService);\n const codeHttpErrorService = inject(CodeHttpErrorService);\n const options = inject(RXAP_ERROR_INTERCEPTOR_OPTIONS, { optional: true }) ?? {};\n\n options.extractErrorCode ??= DefaultErrorCodeExtractor;\n options.filter ??= [];\n if (!options.filter.length) {\n options.filter.push(DefaultErrorFilter);\n }\n\n return next(req).pipe(\n tap({\n error: async (event: Error) => {\n if (event instanceof HttpErrorResponse) {\n\n if (!options.filter?.some((filter) => filter(event))) {\n return;\n }\n\n let error = event.error;\n if (event.error instanceof Blob) {\n error = await event.error.text();\n try {\n error = JSON.parse(error);\n } catch (e) {\n console.warn('error response object is not a json');\n }\n }\n\n const data = {\n ...SimplifyHttpErrorResponse(event),\n method: req.method,\n body: req.body,\n timestamp: Date.now(),\n };\n\n if (error && typeof error === 'object') {\n const errorCode = options.extractErrorCode!(error);\n if (errorCode) {\n Sentry.captureMessage(`Error Code ${ errorCode }`, {\n level: 'warning',\n contexts: ExtractContextFromError(error),\n extra: ExtractExtraFromError(error),\n tags: ExtractTagsFromError(error),\n });\n codeHttpErrorService.push({\n ...data,\n errorCode,\n });\n } else if (event.error.message) {\n messageHttpErrorService.push(data);\n } else {\n anyHttpErrorService.push(data);\n }\n } else {\n anyHttpErrorService.push(data);\n }\n }\n },\n }),\n );\n\n}\n","// region open-api-http-response-error\nexport * from './lib/open-api-http-response-error/open-api-http-response-error-dialog-data';\nexport * from './lib/open-api-http-response-error/open-api-http-response-error.component';\nexport * from './lib/open-api-http-response-error/open-api-http-response-error.service';\n// endregion\n\n// region message-http-error\nexport * from './lib/message-http-error/message-http-error-dialog-data';\nexport * from './lib/message-http-error/message-http-error.component';\nexport * from './lib/message-http-error/message-http-error.service';\n// endregion\n\n// region error-dialog\nexport * from './lib/error-dialog/error-dialog.component';\n// endregion\n\n// region error\nexport * from './lib/error/angular-error-dialog-data';\nexport * from './lib/error/angular-error.component';\nexport * from './lib/error/angular-error.service';\n// endregion\n\n// region code-http-error\nexport * from './lib/code-http-error/code-http-error-dialog-data';\nexport * from './lib/code-http-error/code-http-error.component';\nexport * from './lib/code-http-error/code-http-error.service';\n// endregion\n\n// region any-http-error\nexport * from './lib/any-http-error/any-http-error-dialog-data';\nexport * from './lib/any-http-error/any-http-error.component';\nexport * from './lib/any-http-error/any-http-error.service';\n// endregion\n\n// region \nexport * from './lib/error-capture.service';\nexport * from './lib/error-handler';\nexport * from './lib/error-interceptor-options';\nexport * from './lib/http-error-interceptor';\nexport * from './lib/tokens';\nexport * from './lib/utilities';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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