angular-svg-icon
Version:
Angular 8 component for inlining SVGs allowing them to be easily styled with CSS.
207 lines • 17 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Inject, Injectable, InjectionToken, Optional, PLATFORM_ID, SkipSelf } from '@angular/core';
import { of as observableOf, throwError as observableThrowError } from 'rxjs';
import { catchError, finalize, map, share, tap } from 'rxjs/operators';
import { DOCUMENT } from '@angular/common';
import { SvgLoader } from './svg-loader';
/** @type {?} */
export var SERVER_URL = new InjectionToken('SERVER_URL');
var SvgIconRegistryService = /** @class */ (function () {
function SvgIconRegistryService(loader, platformId, serverUrl, _document) {
this.loader = loader;
this.platformId = platformId;
this.serverUrl = serverUrl;
this._document = _document;
this.iconsByUrl = new Map();
this.iconsLoadingByUrl = new Map();
this.document = this._document;
}
/** Add a SVG to the registry by passing a name and the SVG. */
/**
* Add a SVG to the registry by passing a name and the SVG.
* @param {?} name
* @param {?} data
* @return {?}
*/
SvgIconRegistryService.prototype.addSvg = /**
* Add a SVG to the registry by passing a name and the SVG.
* @param {?} name
* @param {?} data
* @return {?}
*/
function (name, data) {
if (!this.iconsByUrl.has(name)) {
/** @type {?} */
var div = this.document.createElement('DIV');
div.innerHTML = data;
/** @type {?} */
var svg = (/** @type {?} */ (div.querySelector('svg')));
this.iconsByUrl.set(name, svg);
}
};
/** Load a SVG to the registry from a URL. */
/**
* Load a SVG to the registry from a URL.
* @param {?} url
* @param {?=} name
* @return {?}
*/
SvgIconRegistryService.prototype.loadSvg = /**
* Load a SVG to the registry from a URL.
* @param {?} url
* @param {?=} name
* @return {?}
*/
function (url, name) {
var _this = this;
if (name === void 0) { name = url; }
// not sure if there should be a possibility to use name for server usage
// so overriding it for now if provided
// maybe should separate functionality for url and name use-cases
if (this.serverUrl && url.match(/^(http(s)?):/) === null) {
url = this.serverUrl + url;
name = url;
}
if (this.iconsByUrl.has(name)) {
return observableOf(this.iconsByUrl.get(name));
}
else if (this.iconsLoadingByUrl.has(name)) {
return this.iconsLoadingByUrl.get(name);
}
/** @type {?} */
var o = (/** @type {?} */ (this.loader.getSvg(url).pipe(map((/**
* @param {?} svg
* @return {?}
*/
function (svg) {
/** @type {?} */
var div = _this.document.createElement('DIV');
div.innerHTML = svg;
return (/** @type {?} */ (div.querySelector('svg')));
})), tap((/**
* @param {?} svg
* @return {?}
*/
function (svg) { return _this.iconsByUrl.set(name, svg); })), catchError((/**
* @param {?} err
* @return {?}
*/
function (err) {
console.error(err);
return observableThrowError(err);
})), finalize((/**
* @return {?}
*/
function () { return _this.iconsLoadingByUrl.delete(name); })), share())));
this.iconsLoadingByUrl.set(name, o);
return o;
};
/** Get loaded SVG from registry by name. (also works by url because of blended map) */
/**
* Get loaded SVG from registry by name. (also works by url because of blended map)
* @param {?} name
* @return {?}
*/
SvgIconRegistryService.prototype.getSvgByName = /**
* Get loaded SVG from registry by name. (also works by url because of blended map)
* @param {?} name
* @return {?}
*/
function (name) {
if (this.iconsByUrl.has(name)) {
return observableOf(this.iconsByUrl.get(name));
}
else if (this.iconsLoadingByUrl.has(name)) {
return this.iconsLoadingByUrl.get(name);
}
return observableThrowError("No svg with name '" + name + "' has been loaded");
};
/** Remove a SVG from the registry by URL (or name). */
/**
* Remove a SVG from the registry by URL (or name).
* @param {?} url
* @return {?}
*/
SvgIconRegistryService.prototype.unloadSvg = /**
* Remove a SVG from the registry by URL (or name).
* @param {?} url
* @return {?}
*/
function (url) {
if (this.iconsByUrl.has(url)) {
this.iconsByUrl.delete(url);
}
};
SvgIconRegistryService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
SvgIconRegistryService.ctorParameters = function () { return [
{ type: SvgLoader },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [SERVER_URL,] }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
]; };
return SvgIconRegistryService;
}());
export { SvgIconRegistryService };
if (false) {
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype.document;
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype.iconsByUrl;
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype.iconsLoadingByUrl;
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype.loader;
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype.platformId;
/**
* @type {?}
* @protected
*/
SvgIconRegistryService.prototype.serverUrl;
/**
* @type {?}
* @private
*/
SvgIconRegistryService.prototype._document;
}
/**
* @param {?} parentRegistry
* @param {?} loader
* @param {?} platformId
* @param {?=} serverUrl
* @param {?=} document
* @return {?}
*/
export function SVG_ICON_REGISTRY_PROVIDER_FACTORY(parentRegistry, loader, platformId, serverUrl, document) {
return parentRegistry || new SvgIconRegistryService(loader, platformId, serverUrl, document);
}
/** @type {?} */
export var SVG_ICON_REGISTRY_PROVIDER = {
provide: SvgIconRegistryService,
deps: [[new Optional(), new SkipSelf(), SvgIconRegistryService], SvgLoader, [(/** @type {?} */ (PLATFORM_ID))],
[new Optional(), (/** @type {?} */ (SERVER_URL))], [new Optional(), (/** @type {?} */ (DOCUMENT))]
],
useFactory: SVG_ICON_REGISTRY_PROVIDER_FACTORY
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLWljb24tcmVnaXN0cnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItc3ZnLWljb24vIiwic291cmNlcyI6WyJsaWIvc3ZnLWljb24tcmVnaXN0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBHLE9BQU8sRUFBYyxFQUFFLElBQUksWUFBWSxFQUFFLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUV6QyxNQUFNLEtBQU8sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFTLFlBQVksQ0FBQztBQUVsRTtJQU9DLGdDQUNTLE1BQWlCLEVBQ0ksVUFBa0IsRUFDTCxTQUFpQixFQUNyQixTQUFjO1FBSDVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDSSxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBUDdDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUMzQyxzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztRQU9yRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVELCtEQUErRDs7Ozs7OztJQUMvRCx1Q0FBTTs7Ozs7O0lBQU4sVUFBTyxJQUFZLEVBQUUsSUFBWTtRQUNo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RUFBdUIsQ0FBQztRQUMvRyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsbUJBQUEsVUFBVSxFQUEwQixDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLG1CQUFBLFFBQVEsRUFBdUIsQ0FBQztLQUMxRztJQUNELFVBQVUsRUFBRSxrQ0FBa0M7Q0FDOUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCwgUExBVEZPUk1fSUQsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiwgdGhyb3dFcnJvciBhcyBvYnNlcnZhYmxlVGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIG1hcCwgc2hhcmUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFN2Z0xvYWRlciB9IGZyb20gJy4vc3ZnLWxvYWRlcic7XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfVVJMID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ1NFUlZFUl9VUkwnKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFN2Z0ljb25SZWdpc3RyeVNlcnZpY2Uge1xuXG5cdHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50O1xuXHRwcml2YXRlIGljb25zQnlVcmwgPSBuZXcgTWFwPHN0cmluZywgU1ZHRWxlbWVudD4oKTtcblx0cHJpdmF0ZSBpY29uc0xvYWRpbmdCeVVybCA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPFNWR0VsZW1lbnQ+PigpO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgbG9hZGVyOiBTdmdMb2FkZXIsXG5cdFx0QEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChTRVJWRVJfVVJMKSBwcm90ZWN0ZWQgc2VydmVyVXJsOiBzdHJpbmcsXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSkge1xuXHRcdHRoaXMuZG9jdW1lbnQgPSB0aGlzLl9kb2N1bWVudDtcblx0fVxuXG5cdC8qKiBBZGQgYSBTVkcgdG8gdGhlIHJlZ2lzdHJ5IGJ5IHBhc3NpbmcgYSBuYW1lIGFuZCB0aGUgU1ZHLiAqL1xuXHRhZGRTdmcobmFtZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpIHtcblx0XHRpZiAoIXRoaXMuaWNvbnNCeVVybC5oYXMobmFtZSkpIHtcblx0XHRcdGNvbnN0IGRpdiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gZGF0YTtcblx0XHRcdGNvbnN0IHN2ZyA9IGRpdi5xdWVyeVNlbGVjdG9yKCdzdmcnKSBhcyBTVkdFbGVtZW50O1xuXHRcdFx0dGhpcy5pY29uc0J5VXJsLnNldChuYW1lLCBzdmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBMb2FkIGEgU1ZHIHRvIHRoZSByZWdpc3RyeSBmcm9tIGEgVVJMLiAqL1xuXHRsb2FkU3ZnKHVybDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSB1cmwpOiBPYnNlcnZhYmxlPFNWR0VsZW1lbnQ+IHtcblxuXHRcdC8vIG5vdCBzdXJlIGlmIHRoZXJlIHNob3VsZCBiZSBhIHBvc3NpYmlsaXR5IHRvIHVzZSBuYW1lIGZvciBzZXJ2ZXIgdXNhZ2Vcblx0XHQvLyBzbyBvdmVycmlkaW5nIGl0IGZvciBub3cgaWYgcHJvdmlkZWRcblx0XHQvLyBtYXliZSBzaG91bGQgc2VwYXJhdGUgZnVuY3Rpb25hbGl0eSBmb3IgdXJsIGFuZCBuYW1lIHVzZS1jYXNlc1xuXHRcdGlmICh0aGlzLnNlcnZlclVybCAmJiB1cmwubWF0Y2goL14oaHR0cChzKT8pOi8pID09PSBudWxsKSB7XG5cdFx0XHR1cmwgPSB0aGlzLnNlcnZlclVybCArIHVybDtcblx0XHRcdG5hbWUgPSB1cmw7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaWNvbnNCeVVybC5oYXMobmFtZSkpIHtcblx0XHRcdHJldHVybiBvYnNlcnZhYmxlT2YodGhpcy5pY29uc0J5VXJsLmdldChuYW1lKSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmljb25zTG9hZGluZ0J5VXJsLmhhcyhuYW1lKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaWNvbnNMb2FkaW5nQnlVcmwuZ2V0KG5hbWUpO1xuXHRcdH1cblx0XHRjb25zdCBvID0gdGhpcy5sb2FkZXIuZ2V0U3ZnKHVybCkucGlwZShcblx0XHRcdG1hcChzdmcgPT4ge1xuXHRcdFx0XHRjb25zdCBkaXYgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXHRcdFx0XHRkaXYuaW5uZXJIVE1MID0gc3ZnO1xuXHRcdFx0XHRyZXR1cm4gZGl2LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIFNWR0VsZW1lbnQ7XG5cdFx0XHR9KSxcblx0XHRcdHRhcCAoc3ZnID0+IHRoaXMuaWNvbnNCeVVybC5zZXQobmFtZSwgc3ZnKSApLFxuXHRcdFx0Y2F0Y2hFcnJvcihlcnIgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGVycik7XG5cdFx0XHRcdHJldHVybiBvYnNlcnZhYmxlVGhyb3dFcnJvcihlcnIpO1xuXHRcdFx0fSksXG5cdFx0XHRmaW5hbGl6ZSgoKSA9PiB0aGlzLmljb25zTG9hZGluZ0J5VXJsLmRlbGV0ZShuYW1lKSApLFxuXHRcdFx0c2hhcmUoKVxuXHRcdCkgYXMgT2JzZXJ2YWJsZTxTVkdFbGVtZW50PjtcblxuXHRcdHRoaXMuaWNvbnNMb2FkaW5nQnlVcmwuc2V0KG5hbWUsIG8pO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0LyoqIEdldCBsb2FkZWQgU1ZHIGZyb20gcmVnaXN0cnkgYnkgbmFtZS4gKGFsc28gd29ya3MgYnkgdXJsIGJlY2F1c2Ugb2YgYmxlbmRlZCBtYXApICovXG5cdGdldFN2Z0J5TmFtZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNWR0VsZW1lbnQ+IHtcblx0XHRpZiAodGhpcy5pY29uc0J5VXJsLmhhcyhuYW1lKSkge1xuXHRcdFx0cmV0dXJuIG9ic2VydmFibGVPZih0aGlzLmljb25zQnlVcmwuZ2V0KG5hbWUpKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaWNvbnNMb2FkaW5nQnlVcmwuaGFzKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pY29uc0xvYWRpbmdCeVVybC5nZXQobmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBvYnNlcnZhYmxlVGhyb3dFcnJvcihgTm8gc3ZnIHdpdGggbmFtZSAnJHtuYW1lfScgaGFzIGJlZW4gbG9hZGVkYCk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIGEgU1ZHIGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IFVSTCAob3IgbmFtZSkuICovXG5cdHVubG9hZFN2Zyh1cmw6IHN0cmluZykge1xuXHRcdGlmICh0aGlzLmljb25zQnlVcmwuaGFzKHVybCkpIHtcblx0XHRcdHRoaXMuaWNvbnNCeVVybC5kZWxldGUodXJsKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNWR19JQ09OX1JFR0lTVFJZX1BST1ZJREVSX0ZBQ1RPUlkoXG5cdFx0cGFyZW50UmVnaXN0cnk6IFN2Z0ljb25SZWdpc3RyeVNlcnZpY2UsXG5cdFx0bG9hZGVyOiBTdmdMb2FkZXIsXG5cdFx0cGxhdGZvcm1JZDogb2JqZWN0LFxuXHRcdHNlcnZlclVybD86IHN0cmluZyxcblx0XHRkb2N1bWVudD86IGFueSkge1xuXHRyZXR1cm4gcGFyZW50UmVnaXN0cnkgfHwgbmV3IFN2Z0ljb25SZWdpc3RyeVNlcnZpY2UobG9hZGVyLCBwbGF0Zm9ybUlkLCAgc2VydmVyVXJsLCBkb2N1bWVudCk7XG59XG5cbmV4cG9ydCBjb25zdCBTVkdfSUNPTl9SRUdJU1RSWV9QUk9WSURFUiA9IHtcblx0cHJvdmlkZTogU3ZnSWNvblJlZ2lzdHJ5U2VydmljZSxcblx0ZGVwczogWyBbbmV3IE9wdGlvbmFsKCksIG5ldyBTa2lwU2VsZigpLCBTdmdJY29uUmVnaXN0cnlTZXJ2aWNlXSwgU3ZnTG9hZGVyLCBbUExBVEZPUk1fSUQgYXMgSW5qZWN0aW9uVG9rZW48YW55Pl0sXG5cdFx0XHRbbmV3IE9wdGlvbmFsKCksIFNFUlZFUl9VUkwgYXMgSW5qZWN0aW9uVG9rZW48c3RyaW5nPl0sIFtuZXcgT3B0aW9uYWwoKSwgRE9DVU1FTlQgYXMgSW5qZWN0aW9uVG9rZW48YW55Pl1cblx0XSxcblx0dXNlRmFjdG9yeTogU1ZHX0lDT05fUkVHSVNUUllfUFJPVklERVJfRkFDVE9SWVxufTtcbiJdfQ==