{"version":3,"file":"angular-meta.mjs","sources":["../../../projects/angular-meta/src/config.ts","../../../projects/angular-meta/src/service/angular-meta.service.ts","../../../projects/angular-meta/src/resolver/angular-meta.resolver.ts","../../../projects/angular-meta/src/public-api.ts","../../../projects/angular-meta/src/angular-meta.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\r\n\r\n/**\r\n * @param apiEndpoint - required\r\n * @param forceCreation - True to create a new element without checking whether one already exists.\r\n */\r\nexport interface AngularMetaConfig {\r\n  apiEndpoint: string;\r\n  forceCreation?: boolean;\r\n}\r\nexport const ANGULAR_META_CONFIG = new InjectionToken<AngularMetaConfig>(\r\n  'ANGULAR_META_CONFIG'\r\n);\r\n\r\ninterface LinkTag {\r\n  href?: string;\r\n  rel?: string;\r\n  type?: string;\r\n  title?: string;\r\n  media?: string;\r\n}\r\n\r\ninterface MetaTag {\r\n  charset?: string;\r\n  content?: string;\r\n  httpEquiv?: string;\r\n  id?: string;\r\n  itemprop?: string;\r\n  name?: string;\r\n  property?: string;\r\n  scheme?: string;\r\n  url?: string;\r\n}\r\n\r\ntype DataTag = LinkTag | MetaTag;\r\n\r\nexport interface AngularMetaData {\r\n  title: string;\r\n  meta: Array<DataTag>;\r\n  schema: any;\r\n}\r\n\r\nexport function provideAngularMeta(config: AngularMetaConfig): Provider[] {\r\n  return [{ provide: ANGULAR_META_CONFIG, useValue: config }];\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable, DOCUMENT } from '@angular/core';\r\nimport { filter, firstValueFrom, map, of, switchMap } from 'rxjs';\r\nimport { ANGULAR_META_CONFIG, AngularMetaData } from '../config';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\n\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AngularMetaCtrl {\r\n  private config = inject(ANGULAR_META_CONFIG);\r\n  private httpClient = inject(HttpClient);\r\n  private meta = inject(Meta);\r\n  private title = inject(Title);\r\n  private document = inject(DOCUMENT);\r\n  private router = inject(Router);\r\n  private activatedRoute = inject(ActivatedRoute);\r\n\r\n  async getMetas(data: any) {\r\n    return await firstValueFrom(\r\n      this.httpClient.get<AngularMetaData>(this.config.apiEndpoint, {\r\n        params: data,\r\n        headers: { 'content-type': 'application/json' },\r\n      })\r\n    );\r\n  }\r\n\r\n  async setMetaData(data: AngularMetaData) {\r\n    try {\r\n      // Set title\r\n      this.title.setTitle(data.title);\r\n      // Set meta tags\r\n      for (let i = 0, l = data.meta.length; i < l; i++) {\r\n        const each: any = data.meta[i];\r\n        // Update or Add link tag if provided\r\n        if (each.hasOwnProperty('href')) {\r\n          const link = this.document.createElement('link');\r\n          if (each.hasOwnProperty('href')) {\r\n            link.href = each.href;\r\n          }\r\n          if (each.hasOwnProperty('rel')) {\r\n            link.rel = each.rel;\r\n          }\r\n          if (each.hasOwnProperty('type')) {\r\n            link.type = each.type;\r\n          }\r\n          if (each.hasOwnProperty('title')) {\r\n            link.title = each.title;\r\n          }\r\n          if (each.hasOwnProperty('media')) {\r\n            link.media = each.media;\r\n          }\r\n          this.document.head.appendChild(link);\r\n        } else {\r\n          // Add meta tag\r\n          this.meta.addTag(each, this.config.forceCreation ?? false);\r\n          // There might be tags which will exists.\r\n          // Just update their content\r\n          this.meta.updateTag(each);\r\n        }\r\n      }\r\n      // Set schema\r\n      const all = this.document.head.getElementsByTagName('script');\r\n      let isExists = null;\r\n      for (let i = 0, l = all.length; i < l; i++) {\r\n        if (all[i].id === `ng_metas_page_json_ld`) {\r\n          isExists = all[i];\r\n          break;\r\n        }\r\n      }\r\n      if (isExists) {\r\n        isExists.innerText = JSON.stringify(data.schema);\r\n      } else {\r\n        const script = this.document.createElement('script');\r\n        script.type = 'application/ld+json';\r\n        script.id = `ng_metas_page_json_ld`;\r\n        script.innerText = JSON.stringify(data.schema);\r\n        this.document.head.appendChild(script);\r\n      }\r\n      return true;\r\n    } catch (e) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  initFromCtrl() {\r\n    this.router.events\r\n      .pipe(\r\n        filter((event) => event instanceof NavigationEnd),\r\n        map(() => this.activatedRoute),\r\n        map((route) => route.firstChild),\r\n        switchMap((route) => {\r\n          return of({\r\n            params: route?.snapshot.params,\r\n            queryParams: route?.snapshot.queryParams,\r\n            data: route?.snapshot.data,\r\n            url: new URL(this.document.URL).toString(),\r\n          });\r\n        })\r\n      )\r\n      .subscribe({\r\n        next: async (response) => {\r\n          const metas = await this.getMetas(response);\r\n          this.setMetaData(metas);\r\n        },\r\n      });\r\n  }\r\n}\r\n","\r\nimport { inject, DOCUMENT } from '@angular/core';\r\nimport { ResolveFn } from '@angular/router';\r\nimport { AngularMetaCtrl } from '../service/angular-meta.service';\r\n\r\nexport const angularMetaResolver: ResolveFn<boolean> = async (route, state) => {\r\n  const document = inject(DOCUMENT);\r\n  const metaCtrl = inject(AngularMetaCtrl);\r\n  const params = route.params;\r\n  const queryParams = route.queryParams;\r\n  const data = route.data;\r\n  const url = new URL(document.URL).toString();\r\n  const metaData = await metaCtrl.getMetas({ params, queryParams, data, url });\r\n  return await metaCtrl.setMetaData(metaData);\r\n};\r\n","/*\r\n * Public API Surface of ng-metas\r\n */\r\nexport { provideAngularMeta } from './config';\r\nexport { angularMetaResolver } from './resolver/angular-meta.resolver';\r\nexport { AngularMetaCtrl } from './service/angular-meta.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}