UNPKG

ngx-metafrenzy

Version:

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

142 lines 19 kB
import { Injectable, Inject, ViewEncapsulation } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; export 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] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWZyZW56eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9tZXRhZnJlbnp5L21ldGFmcmVuenkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUF1QzNDLE1BQU0sT0FBTyxpQkFBaUI7SUFFMUIsWUFDcUIsS0FBWSxFQUNaLElBQVUsRUFDVixlQUFpQyxFQUN4QixRQUFhO1FBSHRCLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1Ysb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQUs7SUFDeEMsQ0FBQztJQUVKLFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWSxFQUFFLE9BQWU7UUFDcEMsTUFBTSxjQUFjLEdBQVEsRUFBRSxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDckM7YUFBTTtZQUNILGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFFRCxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMs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MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBT0YsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUmVuZGVyZXJGYWN0b3J5MiwgSW5qZWN0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVmaW5pdGlvbiB7XG4gICAgY2hhcnNldD86IHN0cmluZztcbiAgICBjcm9zc29yaWdpbj86IHN0cmluZztcbiAgICBocmVmPzogc3RyaW5nO1xuICAgIGhyZWZsYW5nPzogc3RyaW5nO1xuICAgIG1lZGlhPzogc3RyaW5nO1xuICAgIHJlbD86IHN0cmluZztcbiAgICByZXY/OiBzdHJpbmc7XG4gICAgc2l6ZXM/OiBzdHJpbmc7XG4gICAgdGFyZ2V0Pzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgW3Byb3A6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuR3JhcGgge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGltYWdlPzogc3RyaW5nO1xuICAgIHNpdGVfbmFtZT86IHN0cmluZztcbiAgICBbcHJvcDogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICByb2JvdHM/OiBSb2JvdHM7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFJvYm90cyA9XG4gICAgJ2luZGV4LGZvbGxvdycgfCAnaW5kZXgsbm9mb2xsb3cnIHwgJ25vaW5kZXgsbm9mb2xsb3cnIHwgJ25vaW5kZXgsZm9sbG93JyB8XG4gICAgJ2luZGV4LCBmb2xsb3cnIHwgJ2luZGV4LCBub2ZvbGxvdycgfCAnbm9pbmRleCwgbm9mb2xsb3cnIHwgJ25vaW5kZXgsIGZvbGxvdyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZXRhZnJlbnp5U2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogVGl0bGUsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YTogTWV0YSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTIsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueVxuICAgICkge31cblxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XG4gICAgfVxuXG4gICAgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGUuZ2V0VGl0bGUoKTtcbiAgICB9XG5cbiAgICBzZXRNZXRhVGFnKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1ldGFEZWZpbml0aW9uOiBhbnkgPSB7fTtcblxuICAgICAgICBpZiAobmFtZS5sYXN0SW5kZXhPZignb2c6JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgIG1ldGFEZWZpbml0aW9uWydwcm9wZXJ0eSddID0gbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGFEZWZpbml0aW9uWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgbWV0YURlZmluaXRpb25bJ2NvbnRlbnQnXSA9IGNvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyhtZXRhRGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0TWV0YVRhZyhzZWxlY3Rvcjogc3RyaW5nLCByZXR1cm5FbGVtZW50PzogYm9vbGVhbik6IHN0cmluZ3xIVE1MTWV0YUVsZW1lbnQge1xuICAgICAgICBjb25zdCB0YWcgPSB0aGlzLm1ldGEuZ2V0VGFnKHNlbGVjdG9yKTtcbiAgICAgICAgaWYgKCF0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5FbGVtZW50ID09PSB0cnVlID8gdGFnIDogdGFnLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlTWV0YVRhZyhzZWxlY3Rvcjogc3RyaW5nfEhUTUxNZXRhRWxlbWVudCkge1xuICAgICAgICBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MTWV0YUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWdFbGVtZW50KHNlbGVjdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWcoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TWV0YUNoYXJzZXRUYWcodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgICAgIGNoYXJzZXQ6IHZhbHVlXG4gICAgICAgIH0sICdjaGFyc2V0Jyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTGlua1RhZ3Moc2hvdWxkUmVtb3ZlTGlua1RhZ0NiOiAobGlua1RhZzogSFRNTExpbmtFbGVtZW50KSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxMaW5rRWxlbWVudD4gPSB0aGlzLmRvY3VtZW50LmhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcblxuICAgICAgICBjb25zdCB0b1JlbW92ZTogSFRNTExpbmtFbGVtZW50W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlTGlua1RhZ0NiKGxpbmtzW2ldKSkge1xuICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gobGlua3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG9SZW1vdmUuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgc2V0TGlua1RhZyh0YWc6IExpbmtEZWZpbml0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKHRoaXMuZG9jdW1lbnQsIHtcbiAgICAgICAgICAgICAgICBpZDogJy0xJyxcbiAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgICAgICAgICAgICAgIHN0eWxlczogW10sXG4gICAgICAgICAgICAgICAgZGF0YToge31cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgY29uc3QgaGVhZCA9IHRoaXMuZG9jdW1lbnQuaGVhZDtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXModGFnKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnNldEF0dHJpYnV0ZShsaW5rLCBwcm9wZXJ0eSwgU3RyaW5nKHRhZ1twcm9wZXJ0eV0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmtUYWdzKGVsID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChlbC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCduYW1lJykgPT09IGxpbmsuZ2V0QXR0cmlidXRlKCduYW1lJykpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpID09PSBsaW5rLmdldEF0dHJpYnV0ZSgncmVsJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuZ2V0QXR0cmlidXRlKCdyZWwnKSAhPT0gJ3N0eWxlc2hlZXQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmdldEF0dHJpYnV0ZSgncmVsJykgIT09ICdhbHRlcm5hdGUnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKGhlYWQsIGxpbmspO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHNldEFsbFRpdGxlVGFncyh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnRpdGxlJywgdGl0bGUpO1xuICAgIH1cblxuICAgIHNldEFsbERlc2NyaXB0aW9uVGFncyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0TWV0YVRhZygnZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuc2V0TWV0YVRhZygnb2c6ZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgc2V0Q2Fub25pY2FsKGhyZWY6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldExpbmtUYWcoe1xuICAgICAgICAgICAgcmVsOiAnY2Fub25pY2FsJyxcbiAgICAgICAgICAgIGhyZWZcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ2Fub25pY2FsKCkge1xuICAgICAgdGhpcy5yZW1vdmVMaW5rVGFncyhlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpID09PSAnY2Fub25pY2FsJyk7XG4gICAgfVxuXG4gICAgc2V0Um9ib3RzKGNvbnRlbnQ6IFJvYm90cykge1xuICAgICAgICB0aGlzLnNldExpbmtUYWcoe1xuICAgICAgICAgICAgcmVsOiAncm9ib3RzJyxcbiAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0T3BlbkdyYXBoKG9nOiBPcGVuR3JhcGgpIHtcbiAgICAgICAgT2JqZWN0LmtleXMob2cpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRNZXRhVGFnKCdvZzonICsgbmFtZSwgU3RyaW5nKG9nW25hbWVdKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRhZ3ModGFnczogVGFncykge1xuICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eSgndGl0bGUnKSAmJiB0YWdzLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFsbFRpdGxlVGFncyh0YWdzLnRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KCdkZXNjcmlwdGlvbicpICYmIHRhZ3MuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWxsRGVzY3JpcHRpb25UYWdzKHRhZ3MuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhZ3MuaGFzT3duUHJvcGVydHkoJ3VybCcpICYmIHRhZ3MudXJsKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnVybCcsIHRhZ3MudXJsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2Fub25pY2FsKHRhZ3MudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KCdpbWFnZScpICYmIHRhZ3MuaW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWV0YVRhZygnb2c6aW1hZ2U6dXJsJywgdGFncy5pbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eSgncm9ib3RzJykgJiYgdGFncy5yb2JvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Um9ib3RzKHRhZ3Mucm9ib3RzKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19