UNPKG

angular-meta

Version:

angular-meta is a lightweight and flexible SEO utility for Angular applications, designed to work seamlessly with Server-Side Rendering (SSR). It dynamically updates <meta>, <link>, and structured schema tags using route data, parameters, and URL. Easily

1 lines 10.1 kB
{"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 } 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\nimport { DOCUMENT } from '@angular/common';\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 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 this.meta.addTag(each, this.config.forceCreation ?? false);\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","import { DOCUMENT } from '@angular/common';\r\nimport { inject } 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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"}