UNPKG

@ngaox/seo

Version:

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

156 lines 19.6 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 }]); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SeoService, deps: [{ token: i1.Title }, { token: i1.Meta }, { token: DOCUMENT }, { token: SeoDefaultsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SeoService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SeoService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ 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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LEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUU7YUFDMUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFDTSxVQUFVLENBQUMsRUFBVTtRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFnQjtRQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs4R0FwSVUsVUFBVSwyREFJWCxRQUFRLGFBQ0ksZ0JBQWdCO2tIQUwzQixVQUFVLGNBRlQsTUFBTTs7MkZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUtJLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWV0YSwgTWV0YURlZmluaXRpb24sIFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7XHJcbiAgSVBhZ2VTZW9EYXRhLFxyXG4gIElTZW9JbWFnZSxcclxuICBJU2VvVHdpdHRlcixcclxuICBTZW9EZWZhdWx0c1Rva2VuXHJcbn0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlb1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0aXRsZTogVGl0bGUsXHJcbiAgICBwcml2YXRlIG1ldGE6IE1ldGEsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU2VvRGVmYXVsdHNUb2tlbikgcHJpdmF0ZSBkZWZhdWx0czogSVBhZ2VTZW9EYXRhID0ge31cclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVRhZ3MoZGVmaW5pdGlvbnM6IE1ldGFEZWZpbml0aW9uW10pOiB2b2lkIHtcclxuICAgIGRlZmluaXRpb25zLmZvckVhY2gobWV0YSA9PiB7XHJcbiAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcobWV0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQoc2VvRGF0YTogSVBhZ2VTZW9EYXRhKSB7XHJcbiAgICBzZW9EYXRhID0ge1xyXG4gICAgICAuLi50aGlzLmRlZmF1bHRzLFxyXG4gICAgICAuLi5zZW9EYXRhXHJcbiAgICB9O1xyXG4gICAgaWYgKHNlb0RhdGEudGl0bGUpIHRoaXMuc2V0VGl0bGUoc2VvRGF0YS50aXRsZSk7XHJcbiAgICBpZiAoc2VvRGF0YS5rZXl3b3JkcykgdGhpcy5zZXRLZXl3b3JkcyhzZW9EYXRhLmtleXdvcmRzKTtcclxuICAgIGlmIChzZW9EYXRhLmRlc2NyaXB0aW9uKSB0aGlzLnNldERlc2NyaXB0aW9uKHNlb0RhdGEuZGVzY3JpcHRpb24pO1xyXG4gICAgaWYgKHNlb0RhdGEudXJsKSB0aGlzLnNldFVybChzZW9EYXRhLnVybCk7XHJcbiAgICBpZiAoc2VvRGF0YS50eXBlKSB0aGlzLnNldFR5cGUoc2VvRGF0YS50eXBlKTtcclxuICAgIGlmIChzZW9EYXRhLmltYWdlKSB0aGlzLnNldEltYWdlKHNlb0RhdGEuaW1hZ2UpO1xyXG4gICAgaWYgKHNlb0RhdGEudHdpdHRlcikgdGhpcy5zZXRUd2l0dGVyKHNlb0RhdGEudHdpdHRlcik7XHJcbiAgICBpZiAoc2VvRGF0YS5mYkFwcElkKSB0aGlzLnNldEZiQXBwSWQoc2VvRGF0YS5mYkFwcElkKTtcclxuICAgIGlmIChzZW9EYXRhLnNpdGVOYW1lKSB0aGlzLnNldFNpdGVOYW1lKHNlb0RhdGEuc2l0ZU5hbWUpO1xyXG4gICAgaWYgKHNlb0RhdGEuZXh0cmEpIHRoaXMuZ2VuZXJhdGVUYWdzKHNlb0RhdGEuZXh0cmEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudGl0bGUuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xyXG4gICAgICB7IHByb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiB0aXRsZSB9LFxyXG4gICAgICB7IG5hbWU6ICd0d2l0dGVyOnRpdGxlJywgY29udGVudDogdGl0bGUgfSxcclxuICAgICAgeyBuYW1lOiAndGl0bGUnLCBjb250ZW50OiB0aXRsZSB9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRLZXl3b3JkcyhrZXl3b3Jkczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBuYW1lOiAna2V5d29yZHMnLCBjb250ZW50OiBrZXl3b3JkcyB9XSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xyXG4gICAgICB7IG5hbWU6ICdkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRlc2NyaXB0aW9uIH0sXHJcbiAgICAgIHsgcHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRlc2NyaXB0aW9uIH0sXHJcbiAgICAgIHsgbmFtZTogJ3R3aXR0ZXI6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFt7IHByb3BlcnR5OiAnb2c6dXJsJywgY29udGVudDogdXJsIH1dKTtcclxuICAgIC8vIHNldCBjYW5vbmljYWwgbGlua1xyXG4gICAgY29uc3Qgb2xkRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICBgbGlua1tyZWw9J2Nhbm9uaWNhbCddYFxyXG4gICAgKTtcclxuICAgIGlmIChvbGRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxpbms6IEhUTUxMaW5rRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xyXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdjYW5vbmljYWwnKTtcclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcclxuICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUeXBlKHR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW3sgcHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogdHlwZSB9XSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0SW1hZ2UoaW1hZ2U6IHN0cmluZyB8IElTZW9JbWFnZSk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xyXG4gICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IGltYWdlIH0sXHJcbiAgICAgICAgeyBuYW1lOiAndHdpdHRlcjppbWFnZScsIGNvbnRlbnQ6IGltYWdlIH0sXHJcbiAgICAgICAgeyBwcm9wZXJ0eTogJ2ltYWdlJywgY29udGVudDogaW1hZ2UgfVxyXG4gICAgICBdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFtcclxuICAgICAgICB7IHByb3BlcnR5OiAnb2c6aW1hZ2UnLCBjb250ZW50OiBpbWFnZS51cmwgfSxcclxuICAgICAgICB7IG5hbWU6ICd0d2l0dGVyOmltYWdlJywgY29udGVudDogaW1hZ2UudXJsIH0sXHJcbiAgICAgICAgeyBwcm9wZXJ0eTogJ2ltYWdlJywgY29udGVudDogaW1hZ2UudXJsIH1cclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChpbWFnZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKSkge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFtcclxuICAgICAgICAgIHsgcHJvcGVydHk6ICdvZzppbWFnZTpzZWN1cmVfdXJsJywgY29udGVudDogaW1hZ2UudXJsIH1cclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW1hZ2UuYWx0KSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xyXG4gICAgICAgICAgeyBwcm9wZXJ0eTogJ3R3aXR0ZXI6aW1hZ2U6YWx0JywgY29udGVudDogaW1hZ2UuYWx0IH0sXHJcbiAgICAgICAgICB7IHByb3BlcnR5OiAnb2c6aW1hZ2U6YWx0JywgY29udGVudDogaW1hZ2UuYWx0IH1cclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW1hZ2UuaGVpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRhZ3MoW1xyXG4gICAgICAgICAgeyBwcm9wZXJ0eTogJ29nOmltYWdlOmhlaWdodCcsIGNvbnRlbnQ6IGltYWdlLmhlaWdodC50b1N0cmluZygpIH1cclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW1hZ2Uud2lkdGgpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlVGFncyhbXHJcbiAgICAgICAgICB7IHByb3BlcnR5OiAnb2c6aW1hZ2U6d2lkdGgnLCBjb250ZW50OiBpbWFnZS53aWR0aC50b1N0cmluZygpIH1cclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW1hZ2Uud2lkdGgpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlVGFncyhbXHJcbiAgICAgICAgICB7IHByb3BlcnR5OiAnb2c6aW1hZ2U6dHlwZScsIGNvbnRlbnQ6IGAke2ltYWdlLm1pbWVUeXBlfWAgfVxyXG4gICAgICAgIF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VHdpdHRlcih0d2l0dGVyRGF0YTogSVNlb1R3aXR0ZXIpOiB2b2lkIHtcclxuICAgIGlmICh0d2l0dGVyRGF0YS5zaXRlKSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFt7IG5hbWU6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiB0d2l0dGVyRGF0YS5zaXRlIH1dKTtcclxuICAgIH1cclxuICAgIGlmICh0d2l0dGVyRGF0YS5jcmVhdG9yKSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFtcclxuICAgICAgICB7IG5hbWU6ICd0d2l0dGVyOmNyZWF0b3InLCBjb250ZW50OiB0d2l0dGVyRGF0YS5jcmVhdG9yIH1cclxuICAgICAgXSk7XHJcbiAgICB9XHJcbiAgICBpZiAodHdpdHRlckRhdGEuY2FyZCkge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlVGFncyhbeyBuYW1lOiAndHdpdHRlcjpjYXJkJywgY29udGVudDogdHdpdHRlckRhdGEuY2FyZCB9XSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRGYkFwcElkKElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFt7IHByb3BlcnR5OiAnZmI6YXBwX2lkJywgY29udGVudDogSWQgfV0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNpdGVOYW1lKHNpdGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWdzKFt7IHByb3BlcnR5OiAnb2c6c2l0ZV9uYW1lJywgY29udGVudDogc2l0ZU5hbWUgfV0pO1xyXG4gIH1cclxufVxyXG4iXX0=