UNPKG

angular-svg-icon

Version:

Angular 8 component for inlining SVGs allowing them to be easily styled with CSS.

183 lines 15.6 kB
/** * @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 const SERVER_URL = new InjectionToken('SERVER_URL'); export class SvgIconRegistryService { /** * @param {?} loader * @param {?} platformId * @param {?} serverUrl * @param {?} _document */ constructor(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. * @param {?} name * @param {?} data * @return {?} */ addSvg(name, data) { if (!this.iconsByUrl.has(name)) { /** @type {?} */ const div = this.document.createElement('DIV'); div.innerHTML = data; /** @type {?} */ const svg = (/** @type {?} */ (div.querySelector('svg'))); this.iconsByUrl.set(name, svg); } } /** * Load a SVG to the registry from a URL. * @param {?} url * @param {?=} name * @return {?} */ loadSvg(url, 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 {?} */ const o = (/** @type {?} */ (this.loader.getSvg(url).pipe(map((/** * @param {?} svg * @return {?} */ svg => { /** @type {?} */ const div = this.document.createElement('DIV'); div.innerHTML = svg; return (/** @type {?} */ (div.querySelector('svg'))); })), tap((/** * @param {?} svg * @return {?} */ svg => this.iconsByUrl.set(name, svg))), catchError((/** * @param {?} err * @return {?} */ err => { console.error(err); return observableThrowError(err); })), finalize((/** * @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) * @param {?} name * @return {?} */ getSvgByName(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). * @param {?} url * @return {?} */ unloadSvg(url) { if (this.iconsByUrl.has(url)) { this.iconsByUrl.delete(url); } } } SvgIconRegistryService.decorators = [ { type: Injectable } ]; /** @nocollapse */ SvgIconRegistryService.ctorParameters = () => [ { 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,] }] } ]; 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 const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLWljb24tcmVnaXN0cnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItc3ZnLWljb24vIiwic291cmNlcyI6WyJsaWIvc3ZnLWljb24tcmVnaXN0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBHLE9BQU8sRUFBYyxFQUFFLElBQUksWUFBWSxFQUFFLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUV6QyxNQUFNLE9BQU8sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFTLFlBQVksQ0FBQztBQUdsRSxNQUFNLE9BQU8sc0JBQXNCOzs7Ozs7O0lBTWxDLFlBQ1MsTUFBaUIsRUFDSSxVQUFrQixFQUNMLFNBQWlCLEVBQ3JCLFNBQWM7UUFINUMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNJLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDTCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFQN0MsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQzNDLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO1FBT3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNoQyxDQUFDOzs7Ozs7O0lBR0QsTUFBTSxDQUFDLElBQVksRUFBRSxJQUFZO1FBQ2hD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ZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsLCBQTEFURk9STV9JRCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mLCB0aHJvd0Vycm9yIGFzIG9ic2VydmFibGVUaHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgbWFwLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ZnTG9hZGVyIH0gZnJvbSAnLi9zdmctbG9hZGVyJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignU0VSVkVSX1VSTCcpO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3ZnSWNvblJlZ2lzdHJ5U2VydmljZSB7XG5cblx0cHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cdHByaXZhdGUgaWNvbnNCeVVybCA9IG5ldyBNYXA8c3RyaW5nLCBTVkdFbGVtZW50PigpO1xuXHRwcml2YXRlIGljb25zTG9hZGluZ0J5VXJsID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8U1ZHRWxlbWVudD4+KCk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBsb2FkZXI6IFN2Z0xvYWRlcixcblx0XHRASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KFNFUlZFUl9VUkwpIHByb3RlY3RlZCBzZXJ2ZXJVcmw6IHN0cmluZyxcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55KSB7XG5cdFx0dGhpcy5kb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50O1xuXHR9XG5cblx0LyoqIEFkZCBhIFNWRyB0byB0aGUgcmVnaXN0cnkgYnkgcGFzc2luZyBhIG5hbWUgYW5kIHRoZSBTVkcuICovXG5cdGFkZFN2ZyhuYW1lOiBzdHJpbmcsIGRhdGE6IHN0cmluZykge1xuXHRcdGlmICghdGhpcy5pY29uc0J5VXJsLmhhcyhuYW1lKSkge1xuXHRcdFx0Y29uc3QgZGl2ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBkYXRhO1xuXHRcdFx0Y29uc3Qgc3ZnID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIFNWR0VsZW1lbnQ7XG5cdFx0XHR0aGlzLmljb25zQnlVcmwuc2V0KG5hbWUsIHN2Zyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIExvYWQgYSBTVkcgdG8gdGhlIHJlZ2lzdHJ5IGZyb20gYSBVUkwuICovXG5cdGxvYWRTdmcodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IHVybCk6IE9ic2VydmFibGU8U1ZHRWxlbWVudD4ge1xuXG5cdFx0Ly8gbm90IHN1cmUgaWYgdGhlcmUgc2hvdWxkIGJlIGEgcG9zc2liaWxpdHkgdG8gdXNlIG5hbWUgZm9yIHNlcnZlciB1c2FnZVxuXHRcdC8vIHNvIG92ZXJyaWRpbmcgaXQgZm9yIG5vdyBpZiBwcm92aWRlZFxuXHRcdC8vIG1heWJlIHNob3VsZCBzZXBhcmF0ZSBmdW5jdGlvbmFsaXR5IGZvciB1cmwgYW5kIG5hbWUgdXNlLWNhc2VzXG5cdFx0aWYgKHRoaXMuc2VydmVyVXJsICYmIHVybC5tYXRjaCgvXihodHRwKHMpPyk6LykgPT09IG51bGwpIHtcblx0XHRcdHVybCA9IHRoaXMuc2VydmVyVXJsICsgdXJsO1xuXHRcdFx0bmFtZSA9IHVybDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pY29uc0J5VXJsLmhhcyhuYW1lKSkge1xuXHRcdFx0cmV0dXJuIG9ic2VydmFibGVPZih0aGlzLmljb25zQnlVcmwuZ2V0KG5hbWUpKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaWNvbnNMb2FkaW5nQnlVcmwuaGFzKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pY29uc0xvYWRpbmdCeVVybC5nZXQobmFtZSk7XG5cdFx0fVxuXHRcdGNvbnN0IG8gPSB0aGlzLmxvYWRlci5nZXRTdmcodXJsKS5waXBlKFxuXHRcdFx0bWFwKHN2ZyA9PiB7XG5cdFx0XHRcdGNvbnN0IGRpdiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cdFx0XHRcdGRpdi5pbm5lckhUTUwgPSBzdmc7XG5cdFx0XHRcdHJldHVybiBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgYXMgU1ZHRWxlbWVudDtcblx0XHRcdH0pLFxuXHRcdFx0dGFwIChzdmcgPT4gdGhpcy5pY29uc0J5VXJsLnNldChuYW1lLCBzdmcpICksXG5cdFx0XHRjYXRjaEVycm9yKGVyciA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyKTtcblx0XHRcdFx0cmV0dXJuIG9ic2VydmFibGVUaHJvd0Vycm9yKGVycik7XG5cdFx0XHR9KSxcblx0XHRcdGZpbmFsaXplKCgpID0+IHRoaXMuaWNvbnNMb2FkaW5nQnlVcmwuZGVsZXRlKG5hbWUpICksXG5cdFx0XHRzaGFyZSgpXG5cdFx0KSBhcyBPYnNlcnZhYmxlPFNWR0VsZW1lbnQ+O1xuXG5cdFx0dGhpcy5pY29uc0xvYWRpbmdCeVVybC5zZXQobmFtZSwgbyk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHQvKiogR2V0IGxvYWRlZCBTVkcgZnJvbSByZWdpc3RyeSBieSBuYW1lLiAoYWxzbyB3b3JrcyBieSB1cmwgYmVjYXVzZSBvZiBibGVuZGVkIG1hcCkgKi9cblx0Z2V0U3ZnQnlOYW1lKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8U1ZHRWxlbWVudD4ge1xuXHRcdGlmICh0aGlzLmljb25zQnlVcmwuaGFzKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gb2JzZXJ2YWJsZU9mKHRoaXMuaWNvbnNCeVVybC5nZXQobmFtZSkpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pY29uc0xvYWRpbmdCeVVybC5oYXMobmFtZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLmljb25zTG9hZGluZ0J5VXJsLmdldChuYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9ic2VydmFibGVUaHJvd0Vycm9yKGBObyBzdmcgd2l0aCBuYW1lICcke25hbWV9JyBoYXMgYmVlbiBsb2FkZWRgKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgYSBTVkcgZnJvbSB0aGUgcmVnaXN0cnkgYnkgVVJMIChvciBuYW1lKS4gKi9cblx0dW5sb2FkU3ZnKHVybDogc3RyaW5nKSB7XG5cdFx0aWYgKHRoaXMuaWNvbnNCeVVybC5oYXModXJsKSkge1xuXHRcdFx0dGhpcy5pY29uc0J5VXJsLmRlbGV0ZSh1cmwpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gU1ZHX0lDT05fUkVHSVNUUllfUFJPVklERVJfRkFDVE9SWShcblx0XHRwYXJlbnRSZWdpc3RyeTogU3ZnSWNvblJlZ2lzdHJ5U2VydmljZSxcblx0XHRsb2FkZXI6IFN2Z0xvYWRlcixcblx0XHRwbGF0Zm9ybUlkOiBvYmplY3QsXG5cdFx0c2VydmVyVXJsPzogc3RyaW5nLFxuXHRcdGRvY3VtZW50PzogYW55KSB7XG5cdHJldHVybiBwYXJlbnRSZWdpc3RyeSB8fCBuZXcgU3ZnSWNvblJlZ2lzdHJ5U2VydmljZShsb2FkZXIsIHBsYXRmb3JtSWQsICBzZXJ2ZXJVcmwsIGRvY3VtZW50KTtcbn1cblxuZXhwb3J0IGNvbnN0IFNWR19JQ09OX1JFR0lTVFJZX1BST1ZJREVSID0ge1xuXHRwcm92aWRlOiBTdmdJY29uUmVnaXN0cnlTZXJ2aWNlLFxuXHRkZXBzOiBbIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIFN2Z0ljb25SZWdpc3RyeVNlcnZpY2VdLCBTdmdMb2FkZXIsIFtQTEFURk9STV9JRCBhcyBJbmplY3Rpb25Ub2tlbjxhbnk+XSxcblx0XHRcdFtuZXcgT3B0aW9uYWwoKSwgU0VSVkVSX1VSTCBhcyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+XSwgW25ldyBPcHRpb25hbCgpLCBET0NVTUVOVCBhcyBJbmplY3Rpb25Ub2tlbjxhbnk+XVxuXHRdLFxuXHR1c2VGYWN0b3J5OiBTVkdfSUNPTl9SRUdJU1RSWV9QUk9WSURFUl9GQUNUT1JZXG59O1xuIl19