@ngx-meta/core
Version:
Dynamic page title & meta tags utility for Angular (w/server-side rendering)
292 lines (284 loc) • 12.4 kB
JavaScript
import { ɵɵinject, ɵɵdefineInjectable, ɵsetClassMetadata, Injectable, ɵɵdefineNgModule, ɵɵdefineInjector, NgModule, Optional, SkipSelf } from '@angular/core';
import { Title, Meta } from '@angular/platform-browser';
import { of, from } from 'rxjs';
var PageTitlePositioning;
(function (PageTitlePositioning) {
PageTitlePositioning[PageTitlePositioning["AppendPageTitle"] = 0] = "AppendPageTitle";
PageTitlePositioning[PageTitlePositioning["PrependPageTitle"] = 10] = "PrependPageTitle";
})(PageTitlePositioning || (PageTitlePositioning = {}));
var MetaLoader = (function () {
function MetaLoader() {
}
return MetaLoader;
}());
var MetaStaticLoader = (function () {
function MetaStaticLoader(providedSettings) {
if (providedSettings === void 0) { providedSettings = {
pageTitlePositioning: PageTitlePositioning.PrependPageTitle,
defaults: {}
}; }
this.providedSettings = providedSettings;
}
Object.defineProperty(MetaStaticLoader.prototype, "settings", {
get: function () {
return this.providedSettings;
},
enumerable: true,
configurable: true
});
return MetaStaticLoader;
}());
var isPromise = function (obj) { return !!obj && typeof obj.then === 'function'; };
var isObservable = function (obj) { return !!obj && typeof obj.subscribe === 'function'; };
var MetaService = (function () {
function MetaService(loader, title, meta) {
this.loader = loader;
this.title = title;
this.meta = meta;
this.settings = loader.settings;
this.isMetaTagSet = {};
}
MetaService.prototype.setTitle = function (title, override) {
var _this = this;
if (override === void 0) { override = false; }
var title$ = title ? this.callback(title) : of('');
title$.subscribe(function (res) {
var fullTitle = '';
if (!res) {
var defaultTitle$ = _this.settings.defaults && _this.settings.defaults.title ? _this.callback(_this.settings.defaults.title) : of('');
defaultTitle$.subscribe(function (defaultTitle) {
if (!override && _this.settings.pageTitleSeparator && _this.settings.applicationName) {
_this.callback(_this.settings.applicationName).subscribe(function (applicationName) {
fullTitle = applicationName ? _this.getTitleWithPositioning(defaultTitle, applicationName) : defaultTitle;
_this.updateTitle(fullTitle);
});
}
else {
_this.updateTitle(defaultTitle);
}
});
}
else if (!override && _this.settings.pageTitleSeparator && _this.settings.applicationName) {
_this.callback(_this.settings.applicationName).subscribe(function (applicationName) {
fullTitle = applicationName ? _this.getTitleWithPositioning(res, applicationName) : res;
_this.updateTitle(fullTitle);
});
}
else {
_this.updateTitle(res);
}
});
};
MetaService.prototype.setTag = function (key, value) {
var _this = this;
if (key === 'title') {
throw new Error("Attempt to set " + key + " through \"setTag\": \"title\" is a reserved tag name. " + 'Please use `MetaService.setTitle` instead.');
}
var cur = value || (this.settings.defaults && this.settings.defaults[key] ? this.settings.defaults[key] : '');
var value$ = key !== 'og:locale' && key !== 'og:locale:alternate' ? this.callback(cur) : of(cur);
value$.subscribe(function (res) {
_this.updateTag(key, res);
});
};
MetaService.prototype.update = function (currentUrl, metaSettings) {
var _this = this;
if (!metaSettings) {
var fallbackTitle = this.settings.defaults
? this.settings.defaults.title || this.settings.applicationName
: this.settings.applicationName;
this.setTitle(fallbackTitle, true);
}
else {
if (metaSettings.disabled) {
this.update(currentUrl);
return;
}
this.setTitle(metaSettings.title, metaSettings.override);
Object.keys(metaSettings).forEach(function (key) {
var value = metaSettings[key];
if (key === 'title' || key === 'override') {
return;
}
else if (key === 'og:locale') {
value = value.replace(/-/g, '_');
}
else if (key === 'og:locale:alternate') {
var currentLocale = metaSettings['og:locale'];
_this.updateLocales(currentLocale, metaSettings[key]);
return;
}
_this.setTag(key, value);
});
}
if (this.settings.defaults) {
Object.keys(this.settings.defaults).forEach(function (key) {
var value = _this.settings.defaults[key];
if ((metaSettings && (key in _this.isMetaTagSet || key in metaSettings)) || key === 'title' || key === 'override') {
return;
}
else if (key === 'og:locale') {
value = value.replace(/-/g, '_');
}
else if (key === 'og:locale:alternate') {
var currentLocale = metaSettings ? metaSettings['og:locale'] : undefined;
_this.updateLocales(currentLocale, value);
return;
}
_this.setTag(key, value);
});
}
var baseUrl = this.settings.applicationUrl ? this.settings.applicationUrl : '/';
var url = ("" + baseUrl + currentUrl).replace(/(https?:\/\/)|(\/)+/g, '$1$2').replace(/\/$/g, '');
this.setTag('og:url', url ? url : '/');
};
MetaService.prototype.removeTag = function (key) {
this.meta.removeTag(key);
};
MetaService.prototype.callback = function (value) {
if (this.settings.callback) {
var value$ = this.settings.callback(value);
if (!isObservable(value$)) {
return isPromise(value$) ? from(value$) : of(value$);
}
return value$;
}
return of(value);
};
MetaService.prototype.getTitleWithPositioning = function (title, applicationName) {
switch (this.settings.pageTitlePositioning) {
case PageTitlePositioning.AppendPageTitle:
return applicationName + String(this.settings.pageTitleSeparator) + title;
case PageTitlePositioning.PrependPageTitle:
return title + String(this.settings.pageTitleSeparator) + applicationName;
default:
throw new Error("Invalid pageTitlePositioning specified [" + this.settings.pageTitlePositioning + "]!");
}
};
MetaService.prototype.updateTitle = function (title) {
this.title.setTitle(title);
this.meta.updateTag({
property: 'og:title',
content: title
});
};
MetaService.prototype.updateLocales = function (currentLocale, availableLocales) {
var _this = this;
var cur = currentLocale || (this.settings.defaults ? this.settings.defaults['og:locale'] : '');
if (cur && this.settings.defaults) {
this.settings.defaults['og:locale'] = cur.replace(/_/g, '-');
}
var elements = this.meta.getTags('property="og:locale:alternate"');
elements.forEach(function (element) {
_this.meta.removeTagElement(element);
});
if (cur && availableLocales) {
availableLocales.split(',').forEach(function (locale) {
if (cur.replace(/-/g, '_') !== locale.replace(/-/g, '_')) {
_this.meta.addTag({
property: 'og:locale:alternate',
content: locale.replace(/-/g, '_')
});
}
});
}
};
MetaService.prototype.updateTag = function (key, value) {
if (key.lastIndexOf('og:', 0) === 0) {
this.meta.updateTag({
property: key,
content: key === 'og:locale' ? value.replace(/-/g, '_') : value
});
}
else {
this.meta.updateTag({
name: key,
content: value
});
}
this.isMetaTagSet[key] = true;
if (key === 'description') {
this.meta.updateTag({
property: 'og:description',
content: value
});
}
else if (key === 'author') {
this.meta.updateTag({
property: 'og:author',
content: value
});
}
else if (key === 'publisher') {
this.meta.updateTag({
property: 'og:publisher',
content: value
});
}
else if (key === 'og:locale') {
var availableLocales = this.settings.defaults ? this.settings.defaults['og:locale:alternate'] : '';
this.updateLocales(value, availableLocales);
this.isMetaTagSet['og:locale:alternate'] = true;
}
else if (key === 'og:locale:alternate') {
var currentLocale = this.meta.getTag('property="og:locale"').content;
this.updateLocales(currentLocale, value);
this.isMetaTagSet['og:locale'] = true;
}
};
MetaService.ɵfac = function MetaService_Factory(t) { return new (t || MetaService)(ɵɵinject(MetaLoader), ɵɵinject(Title), ɵɵinject(Meta)); };
MetaService.ɵprov = ɵɵdefineInjectable({ token: MetaService, factory: MetaService.ɵfac });
return MetaService;
}());
(function () { ɵsetClassMetadata(MetaService, [{
type: Injectable
}], function () { return [{ type: MetaLoader }, { type: Title }, { type: Meta }]; }, null); })();
var MetaGuard = (function () {
function MetaGuard(meta) {
this.meta = meta;
}
MetaGuard.prototype.canActivate = function (route, state) {
var url = state.url;
var metaSettings = route.hasOwnProperty('data') ? route.data.meta : undefined;
this.meta.update(url, metaSettings);
return true;
};
MetaGuard.prototype.canActivateChild = function (route, state) {
return this.canActivate(route, state);
};
MetaGuard.ɵfac = function MetaGuard_Factory(t) { return new (t || MetaGuard)(ɵɵinject(MetaService)); };
MetaGuard.ɵprov = ɵɵdefineInjectable({ token: MetaGuard, factory: MetaGuard.ɵfac });
return MetaGuard;
}());
(function () { ɵsetClassMetadata(MetaGuard, [{
type: Injectable
}], function () { return [{ type: MetaService }]; }, null); })();
var metaFactory = function () { return new MetaStaticLoader(); };
var MetaModule = (function () {
function MetaModule(parentModule) {
if (parentModule) {
throw new Error('MetaModule already loaded; import in root module only.');
}
}
MetaModule.forRoot = function (configuredProvider) {
if (configuredProvider === void 0) { configuredProvider = {
provide: MetaLoader,
useFactory: metaFactory
}; }
return {
ngModule: MetaModule,
providers: [configuredProvider, MetaGuard, MetaService]
};
};
MetaModule.ɵmod = ɵɵdefineNgModule({ type: MetaModule });
MetaModule.ɵinj = ɵɵdefineInjector({ factory: function MetaModule_Factory(t) { return new (t || MetaModule)(ɵɵinject(MetaModule, 12)); } });
return MetaModule;
}());
(function () { ɵsetClassMetadata(MetaModule, [{
type: NgModule
}], function () { return [{ type: MetaModule, decorators: [{
type: Optional
}, {
type: SkipSelf
}] }]; }, null); })();
export { MetaGuard, MetaLoader, MetaModule, MetaService, MetaStaticLoader, PageTitlePositioning, metaFactory };
//# sourceMappingURL=ngx-meta-core.js.map