UNPKG

ngx-seo

Version:

`ngx-seo` is a library to help generate and inject proper JSON-LD objects and Meta tags that allow for social sharing into server-side generated Angular applications using Universal.

381 lines (370 loc) 12.2 kB
import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { BEFORE_APP_SERIALIZED } from '@angular/platform-server'; import { Inject, Injectable, Optional, PLATFORM_ID, NgModule, defineInjectable, inject } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class JsonLdService { /** * @param {?} platformId * @param {?} doc */ constructor(platformId, doc) { this.platformId = platformId; this.doc = doc; this.jsonLd = {}; } /** * @param {?} type * @param {?} rawData * @return {?} */ setData(type, rawData) { this.jsonLd = this.getObject(type, rawData); this.injectBrowser(); } /** * @param {?} type * @param {?=} rawData * @return {?} */ getObject(type, rawData) { /** @type {?} */ let object = { '@context': 'http://schema.org', '@type': type, }; if (rawData) { object = Object.assign({}, object, rawData); } return object; } /** * @return {?} */ toJson() { return JSON.stringify(this.jsonLd); } /** * @private * @return {?} */ injectBrowser() { if (this.platformId && isPlatformBrowser(this.platformId)) { /** @type {?} */ let ldJsonScriptTag = this.doc.head.querySelector(`script[type='application/ld+json']`); if (ldJsonScriptTag) { ldJsonScriptTag.textContent = this.toJson(); } else { ldJsonScriptTag = this.doc.createElement('script'); ldJsonScriptTag.setAttribute('type', 'application/ld+json'); ldJsonScriptTag.textContent = this.toJson(); this.doc.head.appendChild(ldJsonScriptTag); } } } } JsonLdService.decorators = [ { type: Injectable } ]; /** @nocollapse */ JsonLdService.ctorParameters = () => [ { type: Object, decorators: [{ type: Optional }, { type: Inject, args: [PLATFORM_ID,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class BrowserJsonLdModule { } BrowserJsonLdModule.decorators = [ { type: NgModule, args: [{ providers: [ JsonLdService, ], },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param {?} doc * @param {?} jsonLdService * @return {?} */ function serializeJsonLdFactory(doc, jsonLdService) { /** @type {?} */ const serializeAndInject = (/** * @return {?} */ function () { /** @type {?} */ const script = doc.createElement('script'); script.setAttribute('type', 'application/ld+json'); script.textContent = jsonLdService.toJson(); doc.head.appendChild(script); }); return serializeAndInject; } class ServerJsonLdModule { } ServerJsonLdModule.decorators = [ { type: NgModule, args: [{ providers: [ JsonLdService, { provide: BEFORE_APP_SERIALIZED, useFactory: serializeJsonLdFactory, deps: [DOCUMENT, JsonLdService], multi: true, }, ], },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class SeoSocialShareService { /** * @param {?} metaService * @param {?} titleService */ constructor(metaService, titleService) { this.metaService = metaService; this.titleService = titleService; } /** * @param {?} data * @return {?} */ setData(data) { this.setTitle(data.title); this.setMetaDescription(data.description); this.setUrl(data.url); this.setImage(data.image); this.setPublished(data.published); this.setModified(data.modified); this.setAuthor(data.author); this.setSection(data.section); this.setType(data.type); } /** * @param {?=} newSection * @return {?} */ setSection(newSection) { if (newSection && newSection.length) { this.metaService.updateTag({ name: 'article:section', content: newSection }); } else { this.metaService.removeTag(`name='article:section'`); } } /** * @param {?=} site * @return {?} */ setTwitterSiteCreator(site) { if (site && site.length) { this.metaService.updateTag({ name: 'twitter:site', content: site }); this.metaService.updateTag({ name: 'twitter:creator', content: site }); } else { this.metaService.removeTag(`name='twitter:site'`); this.metaService.removeTag(`name='twitter:creator'`); } } /** * @param {?=} card * @return {?} */ setTwitterCard(card) { if (card && card.length) { this.metaService.updateTag({ name: 'twitter:card', content: card }); } else { this.metaService.removeTag(`name='twitter:card'`); } } /** * @param {?=} appId * @return {?} */ setFbAppId(appId) { if (appId && appId.length) { this.metaService.updateTag({ property: 'fb:app_id', content: appId }); } else { this.metaService.removeTag(`property='fb:app_id'`); } } /** * @private * @param {?=} title * @return {?} */ setTitle(title = '') { this.titleService.setTitle(title); if (title && title.length) { this.metaService.updateTag({ name: 'twitter:title', content: title }); this.metaService.updateTag({ name: 'twitter:image:alt', content: title }); this.metaService.updateTag({ property: 'og:image:alt', content: title }); this.metaService.updateTag({ property: 'og:title', content: title }); this.metaService.updateTag({ name: 'title', content: title }); } else { this.metaService.removeTag(`name='twitter:title'`); this.metaService.removeTag(`name='twitter:image:alt'`); this.metaService.removeTag(`property='og:image:alt'`); this.metaService.removeTag(`property='og:title'`); this.metaService.removeTag(`name='title'`); } } /** * @private * @param {?=} type * @return {?} */ setType(type) { if (type && type.length) { this.metaService.updateTag({ property: 'og:type', content: type }); } else { this.metaService.removeTag(`property='og:type'`); } } /** * @private * @param {?=} description * @return {?} */ setMetaDescription(description) { if (description && description.length) { this.metaService.updateTag({ name: 'twitter:description', content: description }); this.metaService.updateTag({ property: 'og:description', content: description }); this.metaService.updateTag({ name: 'description', content: description }); } else { this.metaService.removeTag(`name='twitter:description'`); this.metaService.removeTag(`property='og:description'`); this.metaService.removeTag(`name='description'`); } } /** * @private * @param {?=} image * @return {?} */ setImage(image) { if (image && image.length) { this.metaService.updateTag({ name: 'twitter:image', content: image }); this.metaService.updateTag({ property: 'og:image', content: image }); this.metaService.updateTag({ property: 'og:image:height', content: '630' }); } else { this.metaService.removeTag(`name='twitter:image'`); this.metaService.removeTag(`property='og:image'`); this.metaService.removeTag(`property='og:image:height'`); } } /** * @private * @param {?=} url * @return {?} */ setUrl(url) { if (url && url.length) { this.metaService.updateTag({ property: 'og:url', content: url }); } else { this.metaService.removeTag(`property='og:url'`); } } /** * @private * @param {?=} publishedDateString * @return {?} */ setPublished(publishedDateString) { if (publishedDateString) { /** @type {?} */ const publishedDate = new Date(publishedDateString); this.metaService.updateTag({ name: 'article:published_time', content: publishedDate.toISOString() }); this.metaService.updateTag({ name: 'published_date', content: publishedDate.toISOString() }); } else { this.metaService.removeTag(`name='article:published_time'`); this.metaService.removeTag(`name='publication_date'`); } } /** * @private * @param {?=} modifiedDateString * @return {?} */ setModified(modifiedDateString) { if (modifiedDateString) { /** @type {?} */ const modifiedDate = new Date(modifiedDateString); this.metaService.updateTag({ name: 'article:modified_time', content: modifiedDate.toISOString() }); this.metaService.updateTag({ name: 'og:updated_time', content: modifiedDate.toISOString() }); } else { this.metaService.removeTag(`name='article:modified_time'`); this.metaService.removeTag(`name='og:updated_time'`); } } /** * @private * @param {?=} author * @return {?} */ setAuthor(author) { if (author && author.length) { this.metaService.updateTag({ name: 'article:author', content: author }); this.metaService.updateTag({ name: 'author', content: author }); } else { this.metaService.removeTag(`name='article:author'`); this.metaService.removeTag(`name='author'`); } } } SeoSocialShareService.decorators = [ { type: Injectable, args: [{ providedIn: 'root', },] } ]; /** @nocollapse */ SeoSocialShareService.ctorParameters = () => [ { type: Meta }, { type: Title } ]; /** @nocollapse */ SeoSocialShareService.ngInjectableDef = defineInjectable({ factory: function SeoSocialShareService_Factory() { return new SeoSocialShareService(inject(Meta), inject(Title)); }, token: SeoSocialShareService, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { JsonLdService, ServerJsonLdModule, BrowserJsonLdModule, SeoSocialShareService, serializeJsonLdFactory as ɵa }; //# sourceMappingURL=ngx-seo.js.map