UNPKG

angular-svg-icon

Version:

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

207 lines 17 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 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==