ngx-metafrenzy
Version:
Angular 13 module for setting head tags such as title, meta, and link.
255 lines (249 loc) • 9.86 kB
JavaScript
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