UNPKG

@ngaox/seo

Version:

Easily generate and manage SEO-friendly meta tags, page title,...

156 lines 19 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, Optional } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; import { SeoDefaultsToken } from './shared/models'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; export class SeoService { constructor(title, meta, document, defaults = {}) { this.title = title; this.meta = meta; this.document = document; this.defaults = defaults; } generateTags(definitions) { definitions.forEach(meta => { this.meta.updateTag(meta); }); } set(seoData) { seoData = { ...this.defaults, ...seoData }; if (seoData.title) this.setTitle(seoData.title); if (seoData.keywords) this.setKeywords(seoData.keywords); if (seoData.description) this.setDescription(seoData.description); if (seoData.url) this.setUrl(seoData.url); if (seoData.type) this.setType(seoData.type); if (seoData.image) this.setImage(seoData.image); if (seoData.twitter) this.setTwitter(seoData.twitter); if (seoData.fbAppId) this.setFbAppId(seoData.fbAppId); if (seoData.siteName) this.setSiteName(seoData.siteName); if (seoData.extra) this.generateTags(seoData.extra); } setTitle(title) { this.title.setTitle(title); this.generateTags([ { property: 'og:title', content: title }, { name: 'twitter:title', content: title }, { name: 'title', content: title } ]); } setKeywords(keywords) { this.generateTags([{ name: 'keywords', content: keywords }]); } setDescription(description) { this.generateTags([ { name: 'description', content: description }, { property: 'og:description', content: description }, { name: 'twitter:description', content: description } ]); } setUrl(url) { this.generateTags([{ property: 'og:url', content: url }]); // set canonical link const oldElement = this.document.head.querySelector(`link[rel='canonical']`); if (oldElement) { this.document.head.removeChild(oldElement); } const link = this.document.createElement('link'); link.setAttribute('rel', 'canonical'); link.setAttribute('href', url); this.document.head.appendChild(link); } setType(type) { this.generateTags([{ property: 'og:type', content: type }]); } setImage(image) { if (typeof image === 'string') { this.generateTags([ { property: 'og:image', content: image }, { name: 'twitter:image', content: image }, { property: 'image', content: image } ]); } else { this.generateTags([ { property: 'og:image', content: image.url }, { name: 'twitter:image', content: image.url }, { property: 'image', content: image.url } ]); if (image.url.startsWith('https')) { this.generateTags([ { property: 'og:image:secure_url', content: image.url } ]); } if (image.alt) { this.generateTags([ { property: 'twitter:image:alt', content: image.alt }, { property: 'og:image:alt', content: image.alt } ]); } if (image.height) { this.generateTags([ { property: 'og:image:height', content: image.height.toString() } ]); } if (image.width) { this.generateTags([ { property: 'og:image:width', content: image.width.toString() } ]); } if (image.width) { this.generateTags([ { property: 'og:image:type', content: `${image.mimeType}` } ]); } } } setTwitter(twitterData) { if (twitterData.site) { this.generateTags([{ name: 'twitter:site', content: twitterData.site }]); } if (twitterData.creator) { this.generateTags([ { name: 'twitter:creator', content: twitterData.creator } ]); } if (twitterData.card) { this.generateTags([{ name: 'twitter:card', content: twitterData.card }]); } } setFbAppId(Id) { this.generateTags([{ property: 'fb:app_id', content: Id }]); } setSiteName(siteName) { this.generateTags([{ property: 'og:site_name', content: siteName }]); } } SeoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: SeoService, deps: [{ token: i1.Title }, { token: i1.Meta }, { token: DOCUMENT }, { token: SeoDefaultsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); SeoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: SeoService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: SeoService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.Title }, { type: i1.Meta }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [SeoDefaultsToken] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zZW8vc3JjL2xpYi9zZW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQWtCLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hFLE9BQU8sRUFJTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBS3pCLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFlBQ1UsS0FBWSxFQUNaLElBQVUsRUFDUSxRQUFrQixFQUNFLFdBQXlCLEVBQUU7UUFIakUsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFNBQUksR0FBSixJQUFJLENBQU07UUFDUSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ0UsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7SUFDeEUsQ0FBQztJQUVHLFlBQVksQ0FBQyxXQUE2QjtRQUMvQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEdBQUcsQ0FBQyxPQUFxQjtRQUM5QixPQUFPLEdBQUc7WUFDUixHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ2hCLEdBQUcsT0FBTztTQUNYLENBQUM7UUFDRixJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFD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LENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQztJQUNNLFVBQVUsQ0FBQyxFQUFVO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sV0FBVyxDQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDOzt1R0FwSVUsVUFBVSwyREFJWCxRQUFRLGFBQ0ksZ0JBQWdCOzJHQUwzQixVQUFVLGNBRlQsTUFBTTsyRkFFUCxVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBS0ksTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldGEsIE1ldGFEZWZpbml0aW9uLCBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtcbiAgSVBhZ2VTZW9EYXRhLFxuICBJU2VvSW1hZ2UsXG4gIElTZW9Ud2l0dGVyLFxuICBTZW9EZWZhdWx0c1Rva2VuXG59IGZyb20gJy4vc2hhcmVkL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlb1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcbiAgICBwcml2YXRlIG1ldGE6IE1ldGEsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTZW9EZWZhdWx0c1Rva2VuKSBwcml2YXRlIGRlZmF1bHRzOiBJUGFnZVNlb0RhdGEgPSB7fVxuICApIHt9XG5cbiAgcHVibGljIGdlbmVyYXRlVGFncyhkZWZpbml0aW9uczogTWV0YURlZmluaXRpb25bXSk6IHZvaWQge1xuICAgIGRlZmluaXRpb25zLmZvckVhY2gobWV0YSA9PiB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKG1ldGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldChzZW9EYXRhOiBJUGFnZVNlb0RhdGEpIHtcbiAgICBzZW9EYXRhID0ge1xuICAgICAgLi4udGhpcy5kZWZhdWx0cyxcbiAgICAgIC4uLnNlb0RhdGFcbiAgICB9O1xuICAgIGlmIChzZW9EYXRhLnRpdGxlKSB0aGlzLnNldFRpdGxlKHNlb0RhdGEudGl0bGUpO1xuICAgIGlmIChzZW9EYXRhLmtleXdvcmRzKSB0aGlzLnNldEtleXdvcmRzKHNlb0RhdGEua2V5d29yZHMpO1xuICAgIGlmIChzZW9EYXRhLmRlc2NyaXB0aW9uKSB0aGlzLnNldERlc2NyaXB0aW9uKHNlb0RhdGEuZGVzY3JpcHRpb24pO1xuICAgIGlmIChzZW9EYXRhLnVybCkgdGhpcy5zZXRVcmwoc2VvRGF0YS51cmwpO1xuICAgIGlmIChzZW9EYXRhLnR5cGUpIHRoaXMuc2V0VHlwZShzZW9EYXRhLnR5cGUpO1xuICAgIGlmIChzZW9EYXRhLmltYWdlKSB0aGlzLnNldEltYWdlKHNlb0RhdGEuaW1hZ2UpO1xuICAgIGlmIChzZW9EYXRhLnR3aXR0ZXIpIHRoaXMuc2V0VHdpdHRlcihzZW9EYXRhLnR3aXR0ZXIpO1xuICAgIGlmIChzZW9EYXRhLmZiQXBwSWQpIHRoaXMuc2V0RmJBcHBJZChzZW9EYXRhLmZiQXBwSWQpO1xuICAgIGlmIChzZW9EYXRhLnNpdGVOYW1lKSB0aGlzLnNldFNpdGVOYW1lKHNlb0RhdGEuc2l0ZU5hbWUpO1xuICAgIGlmIChzZW9EYXRhLmV4dHJhKSB0aGlzLmdlbmVyYXRlVGFncyhzZW9EYXRhLmV4dHJhKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xuICAgICAgeyBwcm9wZXJ0eTogJ29nOnRpdGxlJywgY29udGVudDogdGl0bGUgfSxcbiAgICAgIHsgbmFtZTogJ3R3aXR0ZXI6dGl0bGUnLCBjb250ZW50OiB0aXRsZSB9LFxuICAgICAgeyBuYW1lOiAndGl0bGUnLCBjb250ZW50OiB0aXRsZSB9XG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgc2V0S2V5d29yZHMoa2V5d29yZHM6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFt7IG5hbWU6ICdrZXl3b3JkcycsIGNvbnRlbnQ6IGtleXdvcmRzIH1dKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xuICAgICAgeyBuYW1lOiAnZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9LFxuICAgICAgeyBwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogZGVzY3JpcHRpb24gfSxcbiAgICAgIHsgbmFtZTogJ3R3aXR0ZXI6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9XG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW3sgcHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiB1cmwgfV0pO1xuICAgIC8vIHNldCBjYW5vbmljYWwgbGlua1xuICAgIGNvbnN0IG9sZEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBsaW5rW3JlbD0nY2Fub25pY2FsJ11gXG4gICAgKTtcbiAgICBpZiAob2xkRWxlbWVudCkge1xuICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdCBsaW5rOiBIVE1MTGlua0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ2Nhbm9uaWNhbCcpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gIH1cblxuICBwdWJsaWMgc2V0VHlwZSh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBwcm9wZXJ0eTogJ29nOnR5cGUnLCBjb250ZW50OiB0eXBlIH1dKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRJbWFnZShpbWFnZTogc3RyaW5nIHwgSVNlb0ltYWdlKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFtcbiAgICAgICAgeyBwcm9wZXJ0eTogJ29nOmltYWdlJywgY29udGVudDogaW1hZ2UgfSxcbiAgICAgICAgeyBuYW1lOiAndHdpdHRlcjppbWFnZScsIGNvbnRlbnQ6IGltYWdlIH0sXG4gICAgICAgIHsgcHJvcGVydHk6ICdpbWFnZScsIGNvbnRlbnQ6IGltYWdlIH1cbiAgICAgIF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlbmVyYXRlVGFncyhbXG4gICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IGltYWdlLnVybCB9LFxuICAgICAgICB7IG5hbWU6ICd0d2l0dGVyOmltYWdlJywgY29udGVudDogaW1hZ2UudXJsIH0sXG4gICAgICAgIHsgcHJvcGVydHk6ICdpbWFnZScsIGNvbnRlbnQ6IGltYWdlLnVybCB9XG4gICAgICBdKTtcbiAgICAgIGlmIChpbWFnZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlVGFncyhbXG4gICAgICAgICAgeyBwcm9wZXJ0eTogJ29nOmltYWdlOnNlY3VyZV91cmwnLCBjb250ZW50OiBpbWFnZS51cmwgfVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWFnZS5hbHQpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xuICAgICAgICAgIHsgcHJvcGVydHk6ICd0d2l0dGVyOmltYWdlOmFsdCcsIGNvbnRlbnQ6IGltYWdlLmFsdCB9LFxuICAgICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZTphbHQnLCBjb250ZW50OiBpbWFnZS5hbHQgfVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWFnZS5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xuICAgICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZTpoZWlnaHQnLCBjb250ZW50OiBpbWFnZS5oZWlnaHQudG9TdHJpbmcoKSB9XG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLndpZHRoKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFtcbiAgICAgICAgICB7IHByb3BlcnR5OiAnb2c6aW1hZ2U6d2lkdGgnLCBjb250ZW50OiBpbWFnZS53aWR0aC50b1N0cmluZygpIH1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAoaW1hZ2Uud2lkdGgpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xuICAgICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZTp0eXBlJywgY29udGVudDogYCR7aW1hZ2UubWltZVR5cGV9YCB9XG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRUd2l0dGVyKHR3aXR0ZXJEYXRhOiBJU2VvVHdpdHRlcik6IHZvaWQge1xuICAgIGlmICh0d2l0dGVyRGF0YS5zaXRlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBuYW1lOiAndHdpdHRlcjpzaXRlJywgY29udGVudDogdHdpdHRlckRhdGEuc2l0ZSB9XSk7XG4gICAgfVxuICAgIGlmICh0d2l0dGVyRGF0YS5jcmVhdG9yKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlVGFncyhbXG4gICAgICAgIHsgbmFtZTogJ3R3aXR0ZXI6Y3JlYXRvcicsIGNvbnRlbnQ6IHR3aXR0ZXJEYXRhLmNyZWF0b3IgfVxuICAgICAgXSk7XG4gICAgfVxuICAgIGlmICh0d2l0dGVyRGF0YS5jYXJkKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBuYW1lOiAndHdpdHRlcjpjYXJkJywgY29udGVudDogdHdpdHRlckRhdGEuY2FyZCB9XSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRGYkFwcElkKElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBwcm9wZXJ0eTogJ2ZiOmFwcF9pZCcsIGNvbnRlbnQ6IElkIH1dKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTaXRlTmFtZShzaXRlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW3sgcHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlTmFtZSB9XSk7XG4gIH1cbn1cbiJdfQ==