{ "version": 3, "sources": ["src/app/shared/modules/evox/evox.consts.ts", "src/app/shared/modules/evox/evox.service.ts", "src/app/shared/modules/evox/evox.component.ts", "src/app/shared/modules/evox/evox.component.html", "src/app/shared/modules/evox/evox.module.ts"], "sourcesContent": ["import { InjectionToken } from \"@angular/core\";\n\nexport type EvoxConfig = {\n url: string;\n fallbackImage: string;\n};\n\nexport const EVOX_CONFIG_TOKEN = new InjectionToken(\"EVOX_CONFIG\");\n", "import { HttpClient } from \"@angular/common/http\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport { DomSanitizer, SafeUrl } from \"@angular/platform-browser\";\nimport { Observable, of } from \"rxjs\";\nimport { tap, map, catchError, startWith } from \"rxjs/operators\";\n\nimport { EvoxConfig, EVOX_CONFIG_TOKEN } from \"./evox.consts\";\n\nexport type Vehicle = {\n readonly make?: string;\n readonly model?: string;\n readonly year?: string;\n};\n\nconst isNotNil = (a: A): a is NonNullable =>\n a !== null && a !== undefined;\n\nconst vehicleIndex = ({ make, model, year }: Vehicle): string =>\n `${year}/${encodeURIComponent(make)}/${encodeURIComponent(model)}`;\n\nconst formatUrl = (url: string, vehicle: Vehicle): string =>\n `${url}/${vehicleIndex(vehicle)}`;\n\nconst isVehicle = (vehicle?: Vehicle): vehicle is Required =>\n isNotNil(vehicle) && !!vehicle.make && !!vehicle.model && !!vehicle.year;\n\n@Injectable()\nexport class EvoxImageService {\n // Currently only cache \"session\"\n readonly cache = new Map();\n fallbackImage = this.sanitizer.bypassSecurityTrustUrl(\"\");\n\n constructor(\n readonly http: HttpClient,\n readonly sanitizer: DomSanitizer,\n @Inject(EVOX_CONFIG_TOKEN) readonly config: EvoxConfig\n ) {\n this.fallbackImage = this.sanitizer.bypassSecurityTrustUrl(\n this.config.fallbackImage\n );\n }\n\n readonly getImage = (vehicle?: Vehicle): Observable => {\n // Validate input and fallback if bad\n if (!isVehicle(vehicle)) {\n return of(this.fallbackImage);\n }\n\n // Create index and check cache\n const index = vehicleIndex(vehicle);\n if (this.cache.has(index)) {\n return of(this.cache.get(index));\n }\n\n // Get image if not cached\n return this.http\n .get(formatUrl(this.config.url, vehicle), { responseType: \"blob\" }) // Try to get image\n .pipe(\n map((blob) => URL.createObjectURL(blob)), // Convert to blob url\n map((url) => this.sanitizer.bypassSecurityTrustUrl(url)), // Sanitize blob url\n catchError(() => of(this.fallbackImage)), // Fallback to fallback image\n tap((safeUrl) => this.cache.set(index, safeUrl)), // Add safeUrl to cache at index (using fallbackImage too)\n startWith(this.fallbackImage) // Render the fallbackImage while loading\n );\n };\n}\n", "import { Component, Input } from \"@angular/core\";\nimport { EvoxImageService, Vehicle } from \"./evox.service\";\n\n@Component({\n selector: \"evox-vehicle-image\",\n templateUrl: \"./evox.component.html\",\n styleUrls: [\"./evox.component.scss\"],\n})\nexport class EvoxVehicleImageComponent {\n @Input() vehicle: Vehicle = {};\n @Input() innerClass = \"\";\n\n constructor(readonly imgSvc: EvoxImageService) {}\n}\n", "\n", "import { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { EvoxImageService } from \"./evox.service\";\n\nimport { EvoxVehicleImageComponent } from \"./evox.component\";\nimport { EvoxConfig, EVOX_CONFIG_TOKEN } from \"./evox.consts\";\nimport { MapPipeModule } from \"../../pipes/map\";\n\n@NgModule({\n declarations: [EvoxVehicleImageComponent],\n imports: [CommonModule, MapPipeModule],\n exports: [EvoxVehicleImageComponent],\n providers: [EvoxImageService],\n})\nexport class EvoxImageModule {\n static forRoot(config: EvoxConfig): ModuleWithProviders {\n return {\n ngModule: EvoxImageModule,\n providers: [{ provide: EVOX_CONFIG_TOKEN, useValue: config }],\n };\n }\n}\n"], "mappings": "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", "names": ["EVOX_CONFIG_TOKEN", "InjectionToken", "isNotNil", "a", "vehicleIndex", "make", "model", "year", "encodeURIComponent", "formatUrl", "url", "vehicle", "isVehicle", "EvoxImageService", "constructor", "http", "sanitizer", "config", "cache", "Map", "fallbackImage", "bypassSecurityTrustUrl", "getImage", "of", "index", "has", "get", "responseType", "pipe", "map", "blob", "URL", "createObjectURL", "catchError", "tap", "safeUrl", "set", "startWith", "\u0275\u0275inject", "HttpClient", "DomSanitizer", "EVOX_CONFIG_TOKEN", "factory", "\u0275fac", "_EvoxImageService", "EvoxVehicleImageComponent", "constructor", "imgSvc", "vehicle", "innerClass", "\u0275\u0275directiveInject", "EvoxImageService", "selectors", "inputs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275classMap", "\u0275\u0275property", "\u0275\u0275pipeBind1", "\u0275\u0275pipeBind2", "getImage", "\u0275\u0275sanitizeUrl", "_EvoxVehicleImageComponent", "EvoxImageModule", "forRoot", "config", "ngModule", "providers", "provide", "EVOX_CONFIG_TOKEN", "useValue", "EvoxImageService", "imports", "CommonModule", "MapPipeModule", "_EvoxImageModule"] }