{"version":3,"file":"ngx-link-preview.mjs","sources":["../../../projects/ngx-link-preview/src/lib/components/ngx-link-preview/ngx-link-preview-loading-spinner.ts","../../../projects/ngx-link-preview/src/lib/services/ngx-link-preview-loading.manager.ts","../../../projects/ngx-link-preview/src/lib/services/ngx-link-preview-cache.service.ts","../../../projects/ngx-link-preview/src/lib/components/ngx-link-preview/ngx-link-preview.component.ts","../../../projects/ngx-link-preview/src/lib/components/ngx-link-preview/ngx-link-preview.component.html","../../../projects/ngx-link-preview/src/lib/ngx-link-preview.module.ts","../../../projects/ngx-link-preview/src/public-api.ts","../../../projects/ngx-link-preview/src/ngx-link-preview.ts"],"sourcesContent":["/* tslint:disable:max-line-length */\nexport const NgxLinkPreviewLoadingSpinner = `\n<svg class=\"lds-message\" width=\"60px\"  height=\"60px\"  xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\"><g transform=\"translate(20 50)\">\n<circle cx=\"0\" cy=\"0\" r=\"7\" fill=\"#1B364C\" transform=\"scale(0.99275 0.99275)\">\n  <animateTransform attributeName=\"transform\" type=\"scale\" begin=\"-0.375s\" calcMode=\"spline\" keySplines=\"0.3 0 0.7 1;0.3 0 0.7 1\" values=\"0;1;0\" keyTimes=\"0;0.5;1\" dur=\"1s\" repeatCount=\"indefinite\"></animateTransform>\n</circle>\n</g><g transform=\"translate(40 50)\">\n<circle cx=\"0\" cy=\"0\" r=\"7\" fill=\"#285072\" transform=\"scale(0.773605 0.773605)\">\n  <animateTransform attributeName=\"transform\" type=\"scale\" begin=\"-0.25s\" calcMode=\"spline\" keySplines=\"0.3 0 0.7 1;0.3 0 0.7 1\" values=\"0;1;0\" keyTimes=\"0;0.5;1\" dur=\"1s\" repeatCount=\"indefinite\"></animateTransform>\n</circle>\n</g><g transform=\"translate(60 50)\">\n<circle cx=\"0\" cy=\"0\" r=\"7\" fill=\"#346B99\" transform=\"scale(0.42525 0.42525)\">\n  <animateTransform attributeName=\"transform\" type=\"scale\" begin=\"-0.125s\" calcMode=\"spline\" keySplines=\"0.3 0 0.7 1;0.3 0 0.7 1\" values=\"0;1;0\" keyTimes=\"0;0.5;1\" dur=\"1s\" repeatCount=\"indefinite\"></animateTransform>\n</circle>\n</g><g transform=\"translate(80 50)\">\n<circle cx=\"0\" cy=\"0\" r=\"7\" fill=\"#999999\" transform=\"scale(0.113418 0.113418)\">\n  <animateTransform attributeName=\"transform\" type=\"scale\" begin=\"0s\" calcMode=\"spline\" keySplines=\"0.3 0 0.7 1;0.3 0 0.7 1\" values=\"0;1;0\" keyTimes=\"0;0.5;1\" dur=\"1s\" repeatCount=\"indefinite\"></animateTransform>\n</circle>\n</g></svg>\n`;\n","import { BehaviorSubject } from 'rxjs';\n\nexport class NgxLinkPreviewLoadingManager {\n   /** The loading stack, holding an item for each */\n   private loadingStack: string[] = [];\n\n   /** Observable to retrieve if has pending jobs */\n   public hasPendingJobs$ = new BehaviorSubject(false);\n\n   constructor() {}\n\n   /**\n    * Add task to stack\n    */\n   public addTask(name?: string): void {\n      name = this.getTaskName(name);\n      this.loadingStack.push(name);\n      this.emitHasPendingJobs();\n   }\n\n   /**\n    * Remove task from stack\n    */\n   public removeTask(name?: string): void {\n      name = this.getTaskName(name);\n      if (this.loadingStack.length) {\n         const taskIndex = this.loadingStack.indexOf(name);\n         if (taskIndex !== -1) {\n            this.loadingStack.splice(taskIndex, 1);\n         } else {\n            console.error(`[NgxLinkPreviewLoadingManager] Task [${name}] not found and can't be removed.`);\n         }\n      } else {\n         console.error('[NgxLinkPreviewLoadingManager] No pending task available for remove');\n      }\n      this.emitHasPendingJobs();\n   }\n\n   /**\n    * Get task name\n    */\n   private getTaskName(name: string): string {\n      return name ? name : 'UNKNOWN_TASK';\n   }\n\n   /**\n    * Emit if has loading jobs\n    */\n   private emitHasPendingJobs(): void {\n      if (this.loadingStack.length) {\n         this.hasPendingJobs$.next(true);\n      } else {\n         this.hasPendingJobs$.next(false);\n      }\n   }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class NgxLinkPreviewCacheService {\n   /** Holds the current cache state (RAM cache) */\n   private cache = {};\n\n   /** localStorage cache key */\n   private localStorageKey = 'NgxLinkPreviewCache_q16qy4aOCzm2';\n\n   constructor() {\n      this.loadCacheFromLocalStorage();\n   }\n\n   /**\n    * Try to load the cache from localstorage\n    */\n   private loadCacheFromLocalStorage(): void {\n      try {\n         this.cache = JSON.parse(localStorage.getItem(this.localStorageKey));\n      } catch (e) {\n         this.cache = {};\n      }\n   }\n\n   /**\n    * Update item in RAM cache\n    */\n   public updateCacheItem(cacheKey: string, data: any): void {\n      if (!this.cache) {\n         this.cache = {};\n      }\n      this.cache[cacheKey] = data;\n      this.saveCache();\n   }\n\n   /**\n    * Get item from cache\n    */\n   public getCacheItem(cacheKey: string): any {\n      let cacheData;\n      try {\n         cacheData = this.cache[cacheKey];\n      } catch (e) {\n         cacheData = undefined;\n      }\n\n      if (!cacheData) {\n         cacheData = undefined;\n      }\n\n      return cacheData;\n   }\n\n   /**\n    * Save whole cache to localStorage\n    */\n   public saveCache(): void {\n      try {\n         localStorage.setItem(this.localStorageKey, JSON.stringify(this.cache));\n      } catch (e) {\n         console.warn('Failed to save OgLinkPreviewCache in localStorage!', e);\n      }\n   }\n}\n","import { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';\nimport { OpenGraphMetaData } from '../../interfaces/open-graph-meta-data';\nimport { NgxLinkPreviewCacheService } from '../../services/ngx-link-preview-cache.service';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { NgxLinkPreviewLoadingSpinner } from './ngx-link-preview-loading-spinner';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { NgxLinkPreviewLoadingManager } from '../../services/ngx-link-preview-loading.manager';\nimport { map } from 'rxjs/operators';\n\ntype HtmlLinkTarget = '_blank' | '_self' | '_parent' | '_top' | FrameName;\ntype FrameName = string;\n\n@Component({\n   selector: 'ngx-link-preview',\n   templateUrl: './ngx-link-preview.component.html',\n   styleUrls: ['./ngx-link-preview.component.scss']\n})\nexport class NgxLinkPreviewComponent implements OnChanges, OnDestroy {\n   /** Plain links string array */\n   @Input()\n   public links: string[] = [];\n\n   /** Input string to parse for links */\n   @Input()\n   public parseForLinksStr: string;\n\n   /** Method that does the API request, provide as class member arrow function from parent */\n   @Input()\n   public getApiEndpoint$: (requestUrl: string) => Observable<any>;\n\n   /** API route where to get the meta data from, component will build the full request url\n    * Schema: api.example.com/api/get-meta-data?url=d3d3LmV4YW1wbGUuY29t\n    */\n   @Input()\n   public apiRoute: string;\n\n   /** Target url will be attached as encodeURI(btoa(url)), so it must be decoded on the server */\n   @Input()\n   public queryParamName = 'url';\n\n   /** boolean: show image in preview */\n   @Input()\n   public showImage = true;\n\n   /** boolean: show site name in preview */\n   @Input()\n   public showSiteName = true;\n\n   /** boolean: show title in preview */\n   @Input()\n   public showTitle = true;\n\n   /** boolean: show description in preview */\n   @Input()\n   public showDescription = true;\n\n   /** boolean: show link url in preview */\n   @Input()\n   public showLinkUrl = false;\n\n   /** boolean: use cache to display previews faster on next rendering */\n   @Input()\n   public useCache = true;\n\n   /** number: max age the data cache of a link preview should be used */\n   @Input()\n   public maxCacheAgeMs = 1000 * 60 * 60 * 24 * 7; // 7 days\n\n   /** boolean: show loading indicator */\n   @Input()\n   public showLoadingIndicator = true;\n\n   /**\n    * boolean: whether the <a href=\"...\"></a> link should be clickable.\n    * This is a question of context security. Otherwise use (previewClick) event.\n    */\n   @Input()\n   public useHtmlLinkDefaultClickEvent = false;\n\n   /**\n    * HtmlLinkTarget: where the HTML link should be opened on click.\n    * Only has an effect if [useHtmlLinkDefaultClickEvent]=\"true\"\n    */\n   @Input()\n   public htmlLinkTarget: HtmlLinkTarget = '_blank';\n\n   /** Event emitter: on click to handle the click event, emits the clicked URL */\n   @Output()\n   public previewClicked = new EventEmitter<string>();\n\n   /** Scanned links[] from @Input() links & @Input() parseForLinks */\n   private scannedLinks: string[] = [];\n\n   /** Array of metadata objects where the preview is rendered from */\n   public previews: OpenGraphMetaData[] = [];\n\n   private loadingMgr = new NgxLinkPreviewLoadingManager();\n   public loadingSpinner = this.sanitizer.bypassSecurityTrustHtml(NgxLinkPreviewLoadingSpinner);\n   public showLoadingSpinner = false;\n\n   private subscriptions: Subscription[] = [];\n\n   constructor(private sanitizer: DomSanitizer, private cacheSvc: NgxLinkPreviewCacheService) {\n      this.subscribeLoadingMgrHasJobs();\n   }\n\n   ngOnDestroy(): void {\n      this.unsubscribeAll();\n   }\n\n   /**\n    * Preview will be refreshed every time a change is recognized\n    */\n   ngOnChanges(changes: SimpleChanges): void {\n      this.init();\n   }\n\n   /**\n    * Subscribe to loading manager has jobs stream\n    */\n   private subscribeLoadingMgrHasJobs(): void {\n      this.subscriptions.push(\n         this.loadingMgr.hasPendingJobs$.subscribe(hasJobs => {\n            this.showLoadingSpinner = hasJobs;\n         })\n      );\n   }\n\n   /**\n    * Unsubscribe all subscriptions\n    */\n   private unsubscribeAll(): void {\n      this.subscriptions.forEach((sub: Subscription) => {\n         sub.unsubscribe();\n      });\n   }\n\n   /**\n    * Init preview\n    */\n   private init(): void {\n      this.scannedLinks = [];\n      this.previews = [];\n      this.checkInputParameters();\n\n      // Find links in string\n      if (this.parseForLinksStr) {\n         // Parse for links and push to links\n         const links = this.parseStringForLinks(this.parseForLinksStr);\n         this.scannedLinks = this.scannedLinks.concat(links);\n      }\n      // Add links passed as string[]\n      if (this.links && this.links.length) {\n         this.scannedLinks = this.scannedLinks.concat(this.links);\n      }\n\n      for (const link of this.scannedLinks) {\n         this.loadCacheOrGet(link);\n      }\n   }\n\n   /**\n    * Load cache or get from api\n    */\n   private loadCacheOrGet(link: string): void {\n      const encodedLink = this.encodeUrlSafe(link);\n      const requestUrl = this.apiRoute + '?' + this.queryParamName + '=' + encodedLink;\n\n      // Try to load from cache, use encodedLink as key\n      const cacheItem = this.cacheSvc.getCacheItem(encodedLink);\n      if (this.useCache && cacheItem && !this.isCacheOutdated(cacheItem)) {\n         this.previews.push(cacheItem);\n      } else {\n         this.loadingMgr.addTask(encodedLink);\n         this.getApiEndpoint$(requestUrl)\n            .pipe(\n               map((resp: OpenGraphMetaData) => {\n                  resp.timestampMs = new Date().valueOf();\n                  return resp;\n               })\n            )\n            .subscribe((resp: OpenGraphMetaData) => {\n               this.cacheSvc.updateCacheItem(encodedLink, resp);\n               this.loadingMgr.removeTask(encodedLink);\n               this.previews.push(resp);\n            });\n      }\n   }\n\n   /**\n    * Check if cache item is outdated by max-cache-age\n    */\n   private isCacheOutdated(item: OpenGraphMetaData): boolean {\n      const now = new Date().valueOf();\n      const maxValidTimestamp = now - this.maxCacheAgeMs;\n      return maxValidTimestamp > item.timestampMs;\n   }\n\n   /**\n    * On link click emit to EventEmitter\n    */\n   public onLinkClick(url: string): void {\n      this.previewClicked.emit(url);\n   }\n   public disableDefaultLink(event: MouseEvent): void {\n      if (!this.useHtmlLinkDefaultClickEvent) {\n         event.preventDefault();\n      }\n   }\n\n   /**\n    * Encode string url safe\n    */\n   private encodeUrlSafe(url: string): string {\n      return encodeURI(btoa(url));\n   }\n\n   /**\n    * Check required input parameters\n    */\n   private checkInputParameters(): void {\n      if (!this.apiRoute) {\n         throw new Error('<ngx-link-preview></ngx-link-preview> Missing [apiRoute] input parameter');\n      }\n      if (!this.getApiEndpoint$) {\n         throw new Error('<ngx-link-preview></ngx-link-preview> Missing [getApiEndpoint$] input parameter');\n      }\n   }\n\n   /**\n    * Parse string for links\n    */\n   private parseStringForLinks(msg: string): string[] {\n      const links = msg.match(\n         /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&\\/=]*)/gim\n      );\n\n      if (links) {\n         return links;\n      } else {\n         return [];\n      }\n   }\n\n   /**\n    * Get sanitized image url due data often contains url errors\n    */\n   public getSanitizedImageUrl(p: OpenGraphMetaData): string {\n      if (p['og:image'].startsWith('http')) {\n         return p['og:image'];\n      } else if (p['og:image'].startsWith('www')) {\n         return p['og:image'];\n      } else if (p['og:image'].startsWith('//www')) {\n         return 'https://' + p['og:image'].slice(2);\n      } else if (p['og:image'].startsWith('/yts/')) {\n         return 'https://' + p.source + p['og:image'];\n      }\n   }\n}\n","<div class=\"ngx-link-preview-container\">\n\n   <ng-container *ngFor=\"let p of previews\">\n\n      <div class=\"og-link-preview\" *ngIf=\"p.url\" (click)=\"onLinkClick(p.url)\">\n         <a class=\"row\" [href]=\"p.url\" (click)=\"disableDefaultLink($event)\" [target]=\"htmlLinkTarget\">\n\n            <div class=\"col preview-image\" [ngStyle]=\"{backgroundImage: 'url('+getSanitizedImageUrl(p)+')'}\">\n               <div class=\"image\" *ngIf=\"showImage && (p['og:image'] || p.image)\">\n                  <img [src]=\"getSanitizedImageUrl(p)\" alt=\"\">\n               </div>\n            </div>\n\n            <div class=\"col text-data\">\n               <div class=\"header\" *ngIf=\"showSiteName\">\n                  <div class=\"site-name\" *ngIf=\"p['og:site_name']\">\n                     {{ p['og:site_name'] }}\n                  </div>\n               </div>\n\n               <div class=\"title\" *ngIf=\"showTitle && (p['og:title'] || p.title)\">\n                  {{ p['og:title'] || p.title }}\n               </div>\n\n               <div class=\"description\" *ngIf=\"showDescription && (p['og:description'] || p.description)\">\n                  {{ p['og:description'] || p.description }}\n               </div>\n\n               <div class=\"footer\">\n                  <div class=\"url\" *ngIf=\"showLinkUrl && (p['og:url'] || p.url)\">\n                     {{ p['og:url'] || p.url }}\n                  </div>\n               </div>\n            </div>\n\n         </a><!-- a.row -->\n      </div><!-- og-link-preview -->\n\n   </ng-container><!-- *ngFor -->\n</div>\n\n<div class=\"loading-spinner\" *ngIf=\"showLoadingIndicator && showLoadingSpinner\">\n   <!-- Custom loading spinner -->\n   <ng-container>\n      <div class=\"wrapper-custom\" #ngContentLoading>\n         <ng-content></ng-content>\n      </div>\n   </ng-container>\n\n   <!-- Default loading spinner -->\n   <ng-container *ngIf=\"ngContentLoading.childNodes.length === 0\">\n      <div class=\"wrapper-default\" [innerHTML]=\"loadingSpinner\"></div>\n   </ng-container>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxLinkPreviewComponent } from './components/ngx-link-preview/ngx-link-preview.component';\nimport { NgxLinkPreviewCacheService } from './services/ngx-link-preview-cache.service';\n\n@NgModule({\n   declarations: [NgxLinkPreviewComponent],\n   exports: [NgxLinkPreviewComponent],\n   imports: [CommonModule],\n   providers: [NgxLinkPreviewCacheService]\n})\nexport class NgxLinkPreviewModule {}\n","/*\n * Public API Surface of ngx-link-preview\n */\nexport * from './lib/ngx-link-preview.module';\nexport * from './lib/services/ngx-link-preview-cache.service';\nexport * from './lib/services/ngx-link-preview-loading.manager';\nexport * from './lib/components/ngx-link-preview/ngx-link-preview.component';\nexport * from './lib/interfaces/open-graph-meta-data';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.NgxLinkPreviewCacheService"],"mappings":"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"}