UNPKG

ngx-metafrenzy

Version:

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

255 lines (249 loc) 9.86 kB
import * as i0 from '@angular/core'; import { ViewEncapsulation, Injectable, Inject, NgModule } from '@angular/core'; import { DOCUMENT, CommonModule } from '@angular/common'; import * as i1 from '@angular/platform-browser'; class MetafrenzyService { constructor(title, meta, rendererFactory, document) { this.title = title; this.meta = meta; this.rendererFactory = rendererFactory; this.document = document; } setTitle(title) { this.title.setTitle(title); } getTitle() { return this.title.getTitle(); } setMetaTag(name, content) { const metaDefinition = {}; if (name.lastIndexOf('og:', 0) === 0) { metaDefinition['property'] = name; } else { metaDefinition['name'] = name; } metaDefinition['content'] = content; this.meta.updateTag(metaDefinition); } getMetaTag(selector, returnElement) { const tag = this.meta.getTag(selector); if (!tag) { return ''; } return returnElement === true ? tag : tag.content; } removeMetaTag(selector) { if (selector instanceof HTMLMetaElement) { this.meta.removeTagElement(selector); } else { this.meta.removeTag(selector); } } setMetaCharsetTag(value) { this.meta.updateTag({ charset: value }, 'charset'); } removeLinkTags(shouldRemoveLinkTagCb) { const links = this.document.head.getElementsByTagName('link'); const toRemove = []; for (let i = 0; i < links.length; i++) { if (shouldRemoveLinkTagCb(links[i])) { toRemove.push(links[i]); } } toRemove.forEach(el => el.remove()); } setLinkTag(tag) { try { const renderer = this.rendererFactory.createRenderer(this.document, { id: '-1', encapsulation: ViewEncapsulation.None, styles: [], data: {} }); const link = renderer.createElement('link'); const head = this.document.head; Object.keys(tag).forEach((property) => { return renderer.setAttribute(link, property, String(tag[property])); }); this.removeLinkTags(el => { if ((el.getAttribute('name') !== null && el.getAttribute('name') === link.getAttribute('name')) || (el.getAttribute('rel') !== null && el.getAttribute('rel') === link.getAttribute('rel') && link.getAttribute('rel') !== 'stylesheet' && link.getAttribute('rel') !== 'alternate')) { return true; } return false; }); renderer.appendChild(head, link); } catch (e) { } } setAllTitleTags(title) { this.setTitle(title); this.setMetaTag('og:title', title); } setAllDescriptionTags(description) { this.setMetaTag('description', description); this.setMetaTag('og:description', description); } setCanonical(href) { this.setLinkTag({ rel: 'canonical', href }); } removeCanonical() { this.removeLinkTags(el => el.getAttribute('rel') === 'canonical'); } setRobots(content) { this.setLinkTag({ rel: 'robots', content }); } setOpenGraph(og) { Object.keys(og).forEach((name) => { this.setMetaTag('og:' + name, String(og[name])); }); } setTags(tags) { if (tags.hasOwnProperty('title') && tags.title) { this.setAllTitleTags(tags.title); } if (tags.hasOwnProperty('description') && tags.description) { this.setAllDescriptionTags(tags.description); } if (tags.hasOwnProperty('url') && tags.url) { this.setMetaTag('og:url', tags.url); this.setCanonical(tags.url); } if (tags.hasOwnProperty('image') && tags.image) { this.setMetaTag('og:image:url', tags.image); } if (tags.hasOwnProperty('robots') && tags.robots) { this.setRobots(tags.robots); } } } MetafrenzyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService, deps: [{ token: i1.Title }, { token: i1.Meta }, { token: i0.RendererFactory2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); MetafrenzyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.Title }, { type: i1.Meta }, { type: i0.RendererFactory2 }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); class MetafrenzyGuard { constructor(metafrenzyService) { this.metafrenzyService = metafrenzyService; } canActivate(next, state) { const metaTags = (next && next.data && next.data.metafrenzy) ? next.data.metafrenzy : null; if (metaTags) { for (const key in metaTags) { if (!metaTags.hasOwnProperty(key)) { continue; } const value = metaTags[key]; if (key === 'title') { this.metafrenzyService.setTitle(value); } else if (key === 'tags') { value.forEach((tag) => { if ('name' in tag && 'content' in tag) { this.metafrenzyService.setMetaTag(tag.name, tag.content); } }); } else if (key === 'links') { value.forEach((link) => { this.metafrenzyService.setLinkTag(link); }); } } } return true; } canActivateChild(next, state) { return this.canActivate(next, state); } canDeactivate(compontent, current) { const metaTags = (current && current.data && current.data.metafrenzy) ? current.data.metafrenzy : null; if (metaTags) { for (const key in metaTags) { if (!metaTags.hasOwnProperty(key)) { continue; } const value = metaTags[key]; if (key === 'title') { this.metafrenzyService.setTitle(''); } else if (key === 'tags') { value.forEach((tag) => { if ('name' in tag && 'content' in tag) { this.metafrenzyService.removeMetaTag(`name="${tag.name}"`); } }); } else if (key === 'links') { value.forEach((link) => { this.metafrenzyService.removeLinkTags(el => { if ((el.getAttribute('name') !== null && el.getAttribute('name') === link.name) || (el.getAttribute('rel') !== null && el.getAttribute('rel') === link.rel && link.rel !== 'stylesheet' && link.rel !== 'alternate')) { return true; } return false; }); }); } } } return true; } } MetafrenzyGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyGuard, deps: [{ token: MetafrenzyService }], target: i0.ɵɵFactoryTarget.Injectable }); MetafrenzyGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyGuard }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyGuard, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: MetafrenzyService }]; } }); class MetafrenzyModule { static forRoot() { return { ngModule: MetafrenzyModule, providers: [ MetafrenzyService, MetafrenzyGuard ] }; } } MetafrenzyModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); MetafrenzyModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyModule, imports: [CommonModule] }); MetafrenzyModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyModule, imports: [[ CommonModule ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule ] }] }] }); /** * Generated bundle index. Do not edit. */ export { MetafrenzyGuard, MetafrenzyModule, MetafrenzyService }; //# sourceMappingURL=ngx-metafrenzy.mjs.map