UNPKG

ngx-metafrenzy

Version:

Angular 13 module for setting head tags such as title, meta, and link.

1 lines 16.9 kB
{"version":3,"file":"ngx-metafrenzy.mjs","sources":["../../src/app/metafrenzy/metafrenzy.service.ts","../../src/app/metafrenzy/metafrenzy.guard.ts","../../src/app/metafrenzy/metafrenzy.module.ts","../../src/ngx-metafrenzy.ts"],"sourcesContent":["import { Injectable, RendererFactory2, Inject, ViewEncapsulation } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { DOCUMENT } from '@angular/common';\n\nexport interface LinkDefinition {\n charset?: string;\n crossorigin?: string;\n href?: string;\n hreflang?: string;\n media?: string;\n rel?: string;\n rev?: string;\n sizes?: string;\n target?: string;\n type?: string;\n [prop: string]: string | undefined;\n}\n\nexport interface OpenGraph {\n title?: string;\n description?: string;\n type?: string;\n url?: string;\n image?: string;\n site_name?: string;\n [prop: string]: string | undefined;\n}\n\nexport interface Tags {\n title?: string;\n description?: string;\n url?: string;\n robots?: Robots;\n image?: string;\n}\n\nexport type Robots =\n 'index,follow' | 'index,nofollow' | 'noindex,nofollow' | 'noindex,follow' |\n 'index, follow' | 'index, nofollow' | 'noindex, nofollow' | 'noindex, follow';\n\n@Injectable()\nexport class MetafrenzyService {\n\n constructor(\n private readonly title: Title,\n private readonly meta: Meta,\n private readonly rendererFactory: RendererFactory2,\n @Inject(DOCUMENT) private document: any\n ) {}\n\n setTitle(title: string) {\n this.title.setTitle(title);\n }\n\n getTitle(): string {\n return this.title.getTitle();\n }\n\n setMetaTag(name: string, content: string) {\n const metaDefinition: any = {};\n\n if (name.lastIndexOf('og:', 0) === 0) {\n metaDefinition['property'] = name;\n } else {\n metaDefinition['name'] = name;\n }\n\n metaDefinition['content'] = content;\n\n this.meta.updateTag(metaDefinition);\n }\n\n getMetaTag(selector: string, returnElement?: boolean): string|HTMLMetaElement {\n const tag = this.meta.getTag(selector);\n if (!tag) {\n return '';\n }\n\n return returnElement === true ? tag : tag.content;\n }\n\n removeMetaTag(selector: string|HTMLMetaElement) {\n if (selector instanceof HTMLMetaElement) {\n this.meta.removeTagElement(selector);\n } else {\n this.meta.removeTag(selector);\n }\n }\n\n setMetaCharsetTag(value: string) {\n this.meta.updateTag({\n charset: value\n }, 'charset');\n }\n\n removeLinkTags(shouldRemoveLinkTagCb: (linkTag: HTMLLinkElement) => boolean) {\n const links: HTMLCollectionOf<HTMLLinkElement> = this.document.head.getElementsByTagName('link');\n\n const toRemove: HTMLLinkElement[] = [];\n\n for (let i = 0; i < links.length; i++) {\n if (shouldRemoveLinkTagCb(links[i])) {\n toRemove.push(links[i]);\n }\n }\n\n toRemove.forEach(el => el.remove());\n }\n\n setLinkTag(tag: LinkDefinition) {\n try {\n const renderer = this.rendererFactory.createRenderer(this.document, {\n id: '-1',\n encapsulation: ViewEncapsulation.None,\n styles: [],\n data: {}\n });\n\n const link = renderer.createElement('link');\n const head = this.document.head;\n\n Object.keys(tag).forEach((property: string) => {\n return renderer.setAttribute(link, property, String(tag[property]));\n });\n\n this.removeLinkTags(el => {\n if (\n (el.getAttribute('name') !== null &&\n el.getAttribute('name') === link.getAttribute('name')) ||\n (el.getAttribute('rel') !== null &&\n el.getAttribute('rel') === link.getAttribute('rel') &&\n link.getAttribute('rel') !== 'stylesheet' &&\n link.getAttribute('rel') !== 'alternate')\n ) {\n return true;\n }\n\n return false;\n });\n\n renderer.appendChild(head, link);\n } catch (e) {}\n }\n\n setAllTitleTags(title: string) {\n this.setTitle(title);\n this.setMetaTag('og:title', title);\n }\n\n setAllDescriptionTags(description: string) {\n this.setMetaTag('description', description);\n this.setMetaTag('og:description', description);\n }\n\n setCanonical(href: string) {\n this.setLinkTag({\n rel: 'canonical',\n href\n });\n }\n\n removeCanonical() {\n this.removeLinkTags(el => el.getAttribute('rel') === 'canonical');\n }\n\n setRobots(content: Robots) {\n this.setLinkTag({\n rel: 'robots',\n content\n });\n }\n\n setOpenGraph(og: OpenGraph) {\n Object.keys(og).forEach((name: string) => {\n this.setMetaTag('og:' + name, String(og[name]));\n });\n }\n\n setTags(tags: Tags) {\n if (tags.hasOwnProperty('title') && tags.title) {\n this.setAllTitleTags(tags.title);\n }\n\n if (tags.hasOwnProperty('description') && tags.description) {\n this.setAllDescriptionTags(tags.description);\n }\n\n if (tags.hasOwnProperty('url') && tags.url) {\n this.setMetaTag('og:url', tags.url);\n this.setCanonical(tags.url);\n }\n\n if (tags.hasOwnProperty('image') && tags.image) {\n this.setMetaTag('og:image:url', tags.image);\n }\n\n if (tags.hasOwnProperty('robots') && tags.robots) {\n this.setRobots(tags.robots);\n }\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { Observable } from 'rxjs';\n\nimport { MetafrenzyService, LinkDefinition } from './metafrenzy.service';\n\n@Injectable()\nexport class MetafrenzyGuard implements CanActivate, CanActivateChild {\n constructor(private readonly metafrenzyService: MetafrenzyService) {}\n\n canActivate(\n next: ActivatedRouteSnapshot,\n state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {\n\n const metaTags = (next && next.data && next.data.metafrenzy) ? next.data.metafrenzy : null;\n\n if (metaTags) {\n for (const key in metaTags) {\n if (!metaTags.hasOwnProperty(key)) {\n continue;\n }\n\n const value = metaTags[key];\n\n if (key === 'title') {\n this.metafrenzyService.setTitle(value);\n } else if (key === 'tags') {\n value.forEach((tag: any) => {\n if ('name' in tag && 'content' in tag) {\n this.metafrenzyService.setMetaTag(tag.name, tag.content);\n }\n });\n } else if (key === 'links') {\n value.forEach((link: LinkDefinition) => {\n this.metafrenzyService.setLinkTag(link);\n });\n }\n }\n }\n\n return true;\n }\n\n canActivateChild(\n next: ActivatedRouteSnapshot,\n state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {\n\n return this.canActivate(next, state);\n }\n\n canDeactivate<T>(\n compontent: T,\n current: ActivatedRouteSnapshot): Observable<boolean> | Promise<boolean> | boolean {\n\n const metaTags = (current && current.data && current.data.metafrenzy) ? current.data.metafrenzy : null;\n\n if (metaTags) {\n for (const key in metaTags) {\n if (!metaTags.hasOwnProperty(key)) {\n continue;\n }\n\n const value = metaTags[key];\n\n if (key === 'title') {\n this.metafrenzyService.setTitle('');\n } else if (key === 'tags') {\n value.forEach((tag: any) => {\n if ('name' in tag && 'content' in tag) {\n this.metafrenzyService.removeMetaTag(`name=\"${tag.name}\"`);\n }\n });\n } else if (key === 'links') {\n value.forEach((link: LinkDefinition) => {\n this.metafrenzyService.removeLinkTags(el => {\n if (\n (el.getAttribute('name') !== null &&\n el.getAttribute('name') === link.name) ||\n (el.getAttribute('rel') !== null &&\n el.getAttribute('rel') === link.rel &&\n link.rel !== 'stylesheet' &&\n link.rel !== 'alternate')\n ) {\n return true;\n }\n\n return false;\n });\n });\n }\n }\n }\n\n return true;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { MetafrenzyService } from './metafrenzy.service';\nimport { MetafrenzyGuard } from './metafrenzy.guard';\n\n@NgModule({\n imports: [\n CommonModule\n ]\n})\nexport class MetafrenzyModule {\n static forRoot(): ModuleWithProviders<MetafrenzyModule> {\n return {\n ngModule: MetafrenzyModule,\n providers: [\n MetafrenzyService,\n MetafrenzyGuard\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}