@tanem/svg-injector 10.1.34 → 10.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,28 +13,22 @@ var isLocal = function isLocal() {
13
13
 
14
14
  var makeAjaxRequest = function makeAjaxRequest(url, httpRequestWithCredentials, callback) {
15
15
  var httpRequest = new XMLHttpRequest();
16
-
17
16
  httpRequest.onreadystatechange = function () {
18
17
  try {
19
18
  if (!/\.svg/i.test(url) && httpRequest.readyState === 2) {
20
19
  var contentType = httpRequest.getResponseHeader('Content-Type');
21
-
22
20
  if (!contentType) {
23
21
  throw new Error('Content type not found');
24
22
  }
25
-
26
23
  var type = parse(contentType).type;
27
-
28
24
  if (!(type === 'image/svg+xml' || type === 'text/plain')) {
29
25
  throw new Error("Invalid content type: ".concat(type));
30
26
  }
31
27
  }
32
-
33
28
  if (httpRequest.readyState === 4) {
34
29
  if (httpRequest.status === 404 || httpRequest.responseXML === null) {
35
30
  throw new Error(isLocal() ? 'Note: SVG injection ajax calls do not work locally without ' + 'adjusting security settings in your browser. Or consider ' + 'using a local webserver.' : 'Unable to load SVG file: ' + url);
36
31
  }
37
-
38
32
  if (httpRequest.status === 200 || isLocal() && httpRequest.status === 0) {
39
33
  callback(null, httpRequest);
40
34
  } else {
@@ -43,7 +37,6 @@ var makeAjaxRequest = function makeAjaxRequest(url, httpRequestWithCredentials,
43
37
  }
44
38
  } catch (error) {
45
39
  httpRequest.abort();
46
-
47
40
  if (error instanceof Error) {
48
41
  callback(error, httpRequest);
49
42
  } else {
@@ -51,14 +44,11 @@ var makeAjaxRequest = function makeAjaxRequest(url, httpRequestWithCredentials,
51
44
  }
52
45
  }
53
46
  };
54
-
55
47
  httpRequest.open('GET', url);
56
48
  httpRequest.withCredentials = httpRequestWithCredentials;
57
-
58
49
  if (httpRequest.overrideMimeType) {
59
50
  httpRequest.overrideMimeType('text/xml');
60
51
  }
61
-
62
52
  httpRequest.send();
63
53
  };
64
54
 
@@ -73,22 +63,18 @@ var processRequestQueue = function processRequestQueue(url) {
73
63
  if (Array.isArray(requestQueue[url])) {
74
64
  var cacheValue = cache.get(url);
75
65
  var callback = requestQueue[url][i];
76
-
77
66
  if (cacheValue instanceof SVGSVGElement) {
78
67
  callback(null, cloneSvg(cacheValue));
79
68
  }
80
-
81
69
  if (cacheValue instanceof Error) {
82
70
  callback(cacheValue);
83
71
  }
84
-
85
72
  if (i === requestQueue[url].length - 1) {
86
73
  delete requestQueue[url];
87
74
  }
88
75
  }
89
76
  }, 0);
90
77
  };
91
-
92
78
  for (var i = 0, len = requestQueue[url].length; i < len; i++) {
93
79
  _loop_1(i);
94
80
  }
@@ -97,18 +83,15 @@ var processRequestQueue = function processRequestQueue(url) {
97
83
  var loadSvgCached = function loadSvgCached(url, httpRequestWithCredentials, callback) {
98
84
  if (cache.has(url)) {
99
85
  var cacheValue = cache.get(url);
100
-
101
86
  if (cacheValue === undefined) {
102
87
  queueRequest(url, callback);
103
88
  return;
104
89
  }
105
-
106
90
  if (cacheValue instanceof SVGSVGElement) {
107
91
  callback(null, cloneSvg(cacheValue));
108
92
  return;
109
93
  }
110
94
  }
111
-
112
95
  cache.set(url, undefined);
113
96
  queueRequest(url, callback);
114
97
  makeAjaxRequest(url, httpRequestWithCredentials, function (error, httpRequest) {
@@ -117,7 +100,6 @@ var loadSvgCached = function loadSvgCached(url, httpRequestWithCredentials, call
117
100
  } else if (httpRequest.responseXML instanceof Document && httpRequest.responseXML.documentElement && httpRequest.responseXML.documentElement instanceof SVGSVGElement) {
118
101
  cache.set(url, httpRequest.responseXML.documentElement);
119
102
  }
120
-
121
103
  processRequestQueue(url);
122
104
  });
123
105
  };
@@ -133,7 +115,6 @@ var loadSvgUncached = function loadSvgUncached(url, httpRequestWithCredentials,
133
115
  };
134
116
 
135
117
  var idCounter = 0;
136
-
137
118
  var uniqueId = function uniqueId() {
138
119
  return ++idCounter;
139
120
  };
@@ -142,21 +123,17 @@ var injectedElements = [];
142
123
  var ranScripts = {};
143
124
  var svgNamespace = 'http://www.w3.org/2000/svg';
144
125
  var xlinkNamespace = 'http://www.w3.org/1999/xlink';
145
-
146
126
  var injectElement = function injectElement(el, evalScripts, renumerateIRIElements, cacheRequests, httpRequestWithCredentials, beforeEach, callback) {
147
127
  var elUrl = el.getAttribute('data-src') || el.getAttribute('src');
148
-
149
128
  if (!elUrl) {
150
129
  callback(new Error('Invalid data-src or src attribute'));
151
130
  return;
152
131
  }
153
-
154
132
  if (injectedElements.indexOf(el) !== -1) {
155
133
  injectedElements.splice(injectedElements.indexOf(el), 1);
156
134
  el = null;
157
135
  return;
158
136
  }
159
-
160
137
  injectedElements.push(el);
161
138
  el.setAttribute('src', '');
162
139
  var loadSvg = cacheRequests ? loadSvgCached : loadSvgUncached;
@@ -167,39 +144,28 @@ var injectElement = function injectElement(el, evalScripts, renumerateIRIElement
167
144
  callback(error);
168
145
  return;
169
146
  }
170
-
171
147
  var elId = el.getAttribute('id');
172
-
173
148
  if (elId) {
174
149
  svg.setAttribute('id', elId);
175
150
  }
176
-
177
151
  var elTitle = el.getAttribute('title');
178
-
179
152
  if (elTitle) {
180
153
  svg.setAttribute('title', elTitle);
181
154
  }
182
-
183
155
  var elWidth = el.getAttribute('width');
184
-
185
156
  if (elWidth) {
186
157
  svg.setAttribute('width', elWidth);
187
158
  }
188
-
189
159
  var elHeight = el.getAttribute('height');
190
-
191
160
  if (elHeight) {
192
161
  svg.setAttribute('height', elHeight);
193
162
  }
194
-
195
163
  var mergedClasses = Array.from(new Set(__spreadArray(__spreadArray(__spreadArray([], (svg.getAttribute('class') || '').split(' '), true), ['injected-svg'], false), (el.getAttribute('class') || '').split(' '), true))).join(' ').trim();
196
164
  svg.setAttribute('class', mergedClasses);
197
165
  var elStyle = el.getAttribute('style');
198
-
199
166
  if (elStyle) {
200
167
  svg.setAttribute('style', elStyle);
201
168
  }
202
-
203
169
  svg.setAttribute('data-src', elUrl);
204
170
  var elData = [].filter.call(el.attributes, function (at) {
205
171
  return /^data-\w[\w-]*$/.test(at.name);
@@ -209,7 +175,6 @@ var injectElement = function injectElement(el, evalScripts, renumerateIRIElement
209
175
  svg.setAttribute(dataAttr.name, dataAttr.value);
210
176
  }
211
177
  });
212
-
213
178
  if (renumerateIRIElements) {
214
179
  var iriElementsAndProperties_1 = {
215
180
  clipPath: ['clip-path'],
@@ -232,76 +197,59 @@ var injectElement = function injectElement(el, evalScripts, renumerateIRIElement
232
197
  element_1 = key;
233
198
  properties_1 = iriElementsAndProperties_1[key];
234
199
  elements_1 = svg.querySelectorAll(element_1 + '[id]');
235
-
236
200
  var _loop_1 = function _loop_1(a, elementsLen) {
237
201
  currentId_1 = elements_1[a].id;
238
202
  newId_1 = currentId_1 + '-' + uniqueId();
239
203
  var referencingElements;
240
204
  Array.prototype.forEach.call(properties_1, function (property) {
241
205
  referencingElements = svg.querySelectorAll('[' + property + '*="' + currentId_1 + '"]');
242
-
243
206
  for (var b = 0, referencingElementLen = referencingElements.length; b < referencingElementLen; b++) {
244
207
  var attrValue = referencingElements[b].getAttribute(property);
245
-
246
208
  if (attrValue && !attrValue.match(new RegExp('url\\("?#' + currentId_1 + '"?\\)'))) {
247
209
  continue;
248
210
  }
249
-
250
211
  referencingElements[b].setAttribute(property, 'url(#' + newId_1 + ')');
251
212
  }
252
213
  });
253
214
  var allLinks = svg.querySelectorAll('[*|href]');
254
215
  var links = [];
255
-
256
216
  for (var c = 0, allLinksLen = allLinks.length; c < allLinksLen; c++) {
257
217
  var href = allLinks[c].getAttributeNS(xlinkNamespace, 'href');
258
-
259
218
  if (href && href.toString() === '#' + elements_1[a].id) {
260
219
  links.push(allLinks[c]);
261
220
  }
262
221
  }
263
-
264
222
  for (var d = 0, linksLen = links.length; d < linksLen; d++) {
265
223
  links[d].setAttributeNS(xlinkNamespace, 'href', '#' + newId_1);
266
224
  }
267
-
268
225
  elements_1[a].id = newId_1;
269
226
  };
270
-
271
227
  for (var a = 0, elementsLen = elements_1.length; a < elementsLen; a++) {
272
228
  _loop_1(a);
273
229
  }
274
230
  });
275
231
  }
276
-
277
232
  svg.removeAttribute('xmlns:a');
278
233
  var scripts = svg.querySelectorAll('script');
279
234
  var scriptsToEval = [];
280
235
  var script;
281
236
  var scriptType;
282
-
283
237
  for (var i = 0, scriptsLen = scripts.length; i < scriptsLen; i++) {
284
238
  scriptType = scripts[i].getAttribute('type');
285
-
286
239
  if (!scriptType || scriptType === 'application/ecmascript' || scriptType === 'application/javascript' || scriptType === 'text/javascript') {
287
240
  script = scripts[i].innerText || scripts[i].textContent;
288
-
289
241
  if (script) {
290
242
  scriptsToEval.push(script);
291
243
  }
292
-
293
244
  svg.removeChild(scripts[i]);
294
245
  }
295
246
  }
296
-
297
247
  if (scriptsToEval.length > 0 && (evalScripts === 'always' || evalScripts === 'once' && !ranScripts[elUrl])) {
298
248
  for (var l = 0, scriptsToEvalLen = scriptsToEval.length; l < scriptsToEvalLen; l++) {
299
249
  new Function(scriptsToEval[l])(window);
300
250
  }
301
-
302
251
  ranScripts[elUrl] = true;
303
252
  }
304
-
305
253
  var styleTags = svg.querySelectorAll('style');
306
254
  Array.prototype.forEach.call(styleTags, function (styleTag) {
307
255
  styleTag.textContent += '';
@@ -309,14 +257,12 @@ var injectElement = function injectElement(el, evalScripts, renumerateIRIElement
309
257
  svg.setAttribute('xmlns', svgNamespace);
310
258
  svg.setAttribute('xmlns:xlink', xlinkNamespace);
311
259
  beforeEach(svg);
312
-
313
260
  if (!el.parentNode) {
314
261
  injectedElements.splice(injectedElements.indexOf(el), 1);
315
262
  el = null;
316
263
  callback(new Error('Parent node is null'));
317
264
  return;
318
265
  }
319
-
320
266
  el.parentNode.replaceChild(svg, el);
321
267
  injectedElements.splice(injectedElements.indexOf(el), 1);
322
268
  el = null;
@@ -326,34 +272,31 @@ var injectElement = function injectElement(el, evalScripts, renumerateIRIElement
326
272
 
327
273
  var SVGInjector = function SVGInjector(elements, _a) {
328
274
  var _b = _a === void 0 ? {} : _a,
329
- _c = _b.afterAll,
330
- afterAll = _c === void 0 ? function () {
331
- return undefined;
332
- } : _c,
333
- _d = _b.afterEach,
334
- afterEach = _d === void 0 ? function () {
335
- return undefined;
336
- } : _d,
337
- _e = _b.beforeEach,
338
- beforeEach = _e === void 0 ? function () {
339
- return undefined;
340
- } : _e,
341
- _f = _b.cacheRequests,
342
- cacheRequests = _f === void 0 ? true : _f,
343
- _g = _b.evalScripts,
344
- evalScripts = _g === void 0 ? 'never' : _g,
345
- _h = _b.httpRequestWithCredentials,
346
- httpRequestWithCredentials = _h === void 0 ? false : _h,
347
- _j = _b.renumerateIRIElements,
348
- renumerateIRIElements = _j === void 0 ? true : _j;
349
-
275
+ _c = _b.afterAll,
276
+ afterAll = _c === void 0 ? function () {
277
+ return undefined;
278
+ } : _c,
279
+ _d = _b.afterEach,
280
+ afterEach = _d === void 0 ? function () {
281
+ return undefined;
282
+ } : _d,
283
+ _e = _b.beforeEach,
284
+ beforeEach = _e === void 0 ? function () {
285
+ return undefined;
286
+ } : _e,
287
+ _f = _b.cacheRequests,
288
+ cacheRequests = _f === void 0 ? true : _f,
289
+ _g = _b.evalScripts,
290
+ evalScripts = _g === void 0 ? 'never' : _g,
291
+ _h = _b.httpRequestWithCredentials,
292
+ httpRequestWithCredentials = _h === void 0 ? false : _h,
293
+ _j = _b.renumerateIRIElements,
294
+ renumerateIRIElements = _j === void 0 ? true : _j;
350
295
  if (elements && 'length' in elements) {
351
296
  var elementsLoaded_1 = 0;
352
-
353
297
  for (var i = 0, j = elements.length; i < j; i++) {
354
298
  injectElement(elements[i], evalScripts, renumerateIRIElements, cacheRequests, httpRequestWithCredentials, beforeEach, function (error, svg) {
355
299
  afterEach(error, svg);
356
-
357
300
  if (elements && 'length' in elements && elements.length === ++elementsLoaded_1) {
358
301
  afterAll(elementsLoaded_1);
359
302
  }
@@ -1 +1 @@
1
- {"version":3,"file":"svg-injector.esm.js","sources":["../src/cache.ts","../src/clone-svg.ts","../src/is-local.ts","../src/make-ajax-request.ts","../src/request-queue.ts","../src/load-svg-cached.ts","../src/load-svg-uncached.ts","../src/unique-id.ts","../src/inject-element.ts","../src/svg-injector.ts"],"sourcesContent":["const cache = new Map<string, SVGSVGElement | Error | undefined>()\n\nexport default cache\n","const cloneSvg = (sourceSvg: SVGSVGElement) =>\n sourceSvg.cloneNode(true) as SVGSVGElement\n\nexport default cloneSvg\n","const isLocal = () => window.location.protocol === 'file:'\n\nexport default isLocal\n","import { parse as parseContentType } from 'content-type'\nimport isLocal from './is-local'\n\nconst makeAjaxRequest = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: (error: Error | null, httpRequest: XMLHttpRequest) => void\n) => {\n const httpRequest = new XMLHttpRequest()\n\n httpRequest.onreadystatechange = () => {\n try {\n if (!/\\.svg/i.test(url) && httpRequest.readyState === 2) {\n const contentType = httpRequest.getResponseHeader('Content-Type')\n if (!contentType) {\n throw new Error('Content type not found')\n }\n\n const { type } = parseContentType(contentType)\n if (!(type === 'image/svg+xml' || type === 'text/plain')) {\n throw new Error(`Invalid content type: ${type}`)\n }\n }\n\n if (httpRequest.readyState === 4) {\n if (httpRequest.status === 404 || httpRequest.responseXML === null) {\n throw new Error(\n isLocal()\n ? 'Note: SVG injection ajax calls do not work locally without ' +\n 'adjusting security settings in your browser. Or consider ' +\n 'using a local webserver.'\n : 'Unable to load SVG file: ' + url\n )\n }\n\n if (\n httpRequest.status === 200 ||\n (isLocal() && httpRequest.status === 0)\n ) {\n callback(null, httpRequest)\n } else {\n throw new Error(\n 'There was a problem injecting the SVG: ' +\n httpRequest.status +\n ' ' +\n httpRequest.statusText\n )\n }\n }\n } catch (error) {\n httpRequest.abort()\n if (error instanceof Error) {\n callback(error, httpRequest)\n } else {\n throw error\n }\n }\n }\n\n httpRequest.open('GET', url)\n\n httpRequest.withCredentials = httpRequestWithCredentials\n\n /* istanbul ignore else */\n if (httpRequest.overrideMimeType) {\n httpRequest.overrideMimeType('text/xml')\n }\n\n httpRequest.send()\n}\n\nexport default makeAjaxRequest\n","import cache from './cache'\nimport cloneSvg from './clone-svg'\nimport { Errback } from './types'\n\nlet requestQueue: { [key: string]: Errback[] } = {}\n\nexport const clear = () => {\n requestQueue = {}\n}\n\nexport const queueRequest = (url: string, callback: Errback) => {\n requestQueue[url] = requestQueue[url] || []\n requestQueue[url].push(callback)\n}\n\nexport const processRequestQueue = (url: string) => {\n for (let i = 0, len = requestQueue[url].length; i < len; i++) {\n // Make these calls async so we avoid blocking the page/renderer.\n setTimeout(() => {\n /* istanbul ignore else */\n if (Array.isArray(requestQueue[url])) {\n const cacheValue = cache.get(url)\n const callback = requestQueue[url][i]\n\n /* istanbul ignore else */\n if (cacheValue instanceof SVGSVGElement) {\n callback(null, cloneSvg(cacheValue))\n }\n\n /* istanbul ignore else */\n if (cacheValue instanceof Error) {\n callback(cacheValue)\n }\n\n /* istanbul ignore else */\n if (i === requestQueue[url].length - 1) {\n delete requestQueue[url]\n }\n }\n }, 0)\n }\n}\n","import cache from './cache'\nimport cloneSvg from './clone-svg'\nimport makeAjaxRequest from './make-ajax-request'\nimport { processRequestQueue, queueRequest } from './request-queue'\nimport { Errback } from './types'\n\nconst loadSvgCached = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: Errback\n) => {\n if (cache.has(url)) {\n const cacheValue = cache.get(url)\n\n if (cacheValue === undefined) {\n queueRequest(url, callback)\n return\n }\n\n /* istanbul ignore else */\n if (cacheValue instanceof SVGSVGElement) {\n callback(null, cloneSvg(cacheValue))\n return\n }\n\n // Errors are always refetched.\n }\n\n // Seed the cache to indicate we are loading this URL.\n cache.set(url, undefined)\n queueRequest(url, callback)\n\n makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => {\n /* istanbul ignore else */\n if (error) {\n cache.set(url, error)\n } else if (\n httpRequest.responseXML instanceof Document &&\n httpRequest.responseXML.documentElement &&\n httpRequest.responseXML.documentElement instanceof SVGSVGElement\n ) {\n cache.set(url, httpRequest.responseXML.documentElement)\n }\n processRequestQueue(url)\n })\n}\n\nexport default loadSvgCached\n","import makeAjaxRequest from './make-ajax-request'\nimport { Errback } from './types'\n\nconst loadSvgUncached = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: Errback\n) => {\n makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => {\n /* istanbul ignore else */\n if (error) {\n callback(error)\n } else if (\n httpRequest.responseXML instanceof Document &&\n httpRequest.responseXML.documentElement &&\n httpRequest.responseXML.documentElement instanceof SVGSVGElement\n ) {\n callback(null, httpRequest.responseXML.documentElement)\n }\n })\n}\n\nexport default loadSvgUncached\n","let idCounter = 0\nconst uniqueId = () => ++idCounter\nexport default uniqueId\n","import loadSvgCached from './load-svg-cached'\nimport loadSvgUncached from './load-svg-uncached'\nimport { BeforeEach, Errback, EvalScripts } from './types'\nimport uniqueId from './unique-id'\n\ntype ElementType = Element | HTMLElement | null\n\nconst injectedElements: ElementType[] = []\nconst ranScripts: { [key: string]: boolean } = {}\nconst svgNamespace = 'http://www.w3.org/2000/svg'\nconst xlinkNamespace = 'http://www.w3.org/1999/xlink'\n\nconst injectElement = (\n el: NonNullable<ElementType>,\n evalScripts: EvalScripts,\n renumerateIRIElements: boolean,\n cacheRequests: boolean,\n httpRequestWithCredentials: boolean,\n beforeEach: BeforeEach,\n callback: Errback\n) => {\n const elUrl = el.getAttribute('data-src') || el.getAttribute('src')\n\n /* istanbul ignore else */\n if (!elUrl) {\n callback(new Error('Invalid data-src or src attribute'))\n return\n }\n\n // Make sure we aren't already in the process of injecting this element to\n // avoid a race condition if multiple injections for the same element are run.\n // :NOTE: Using indexOf() only _after_ we check for SVG support and bail, so\n // no need for IE8 indexOf() polyfill.\n /* istanbul ignore else */\n if (injectedElements.indexOf(el) !== -1) {\n // TODO: Extract.\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n return\n }\n\n // Remember the request to inject this element, in case other injection calls\n // are also trying to replace this element before we finish.\n injectedElements.push(el)\n\n // Try to avoid loading the orginal image src if possible.\n el.setAttribute('src', '')\n\n const loadSvg = cacheRequests ? loadSvgCached : loadSvgUncached\n\n loadSvg(elUrl, httpRequestWithCredentials, (error, svg) => {\n /* istanbul ignore else */\n if (!svg) {\n // TODO: Extract.\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n callback(error)\n return\n }\n\n const elId = el.getAttribute('id')\n /* istanbul ignore else */\n if (elId) {\n svg.setAttribute('id', elId)\n }\n\n const elTitle = el.getAttribute('title')\n /* istanbul ignore else */\n if (elTitle) {\n svg.setAttribute('title', elTitle)\n }\n\n const elWidth = el.getAttribute('width')\n /* istanbul ignore else */\n if (elWidth) {\n svg.setAttribute('width', elWidth)\n }\n\n const elHeight = el.getAttribute('height')\n /* istanbul ignore else */\n if (elHeight) {\n svg.setAttribute('height', elHeight)\n }\n\n const mergedClasses = Array.from(\n new Set([\n ...(svg.getAttribute('class') || '').split(' '),\n 'injected-svg',\n ...(el.getAttribute('class') || '').split(' '),\n ])\n )\n .join(' ')\n .trim()\n svg.setAttribute('class', mergedClasses)\n\n const elStyle = el.getAttribute('style')\n /* istanbul ignore else */\n if (elStyle) {\n svg.setAttribute('style', elStyle)\n }\n\n svg.setAttribute('data-src', elUrl)\n\n // Copy all the data elements to the svg.\n const elData = [].filter.call(el.attributes, (at: Attr) => {\n return /^data-\\w[\\w-]*$/.test(at.name)\n })\n\n Array.prototype.forEach.call(elData, (dataAttr: Attr) => {\n /* istanbul ignore else */\n if (dataAttr.name && dataAttr.value) {\n svg.setAttribute(dataAttr.name, dataAttr.value)\n }\n })\n\n /* istanbul ignore else */\n if (renumerateIRIElements) {\n // Make sure any internally referenced clipPath ids and their clip-path\n // references are unique.\n //\n // This addresses the issue of having multiple instances of the same SVG\n // on a page and only the first clipPath id is referenced.\n //\n // Browsers often shortcut the SVG Spec and don't use clipPaths contained\n // in parent elements that are hidden, so if you hide the first SVG\n // instance on the page, then all other instances lose their clipping.\n // Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=376027\n\n // Handle all defs elements that have iri capable attributes as defined by\n // w3c: http://www.w3.org/TR/SVG/linking.html#processingIRI. Mapping IRI\n // addressable elements to the properties that can reference them.\n const iriElementsAndProperties: { [key: string]: string[] } = {\n clipPath: ['clip-path'],\n 'color-profile': ['color-profile'],\n cursor: ['cursor'],\n filter: ['filter'],\n linearGradient: ['fill', 'stroke'],\n marker: ['marker', 'marker-start', 'marker-mid', 'marker-end'],\n mask: ['mask'],\n path: [],\n pattern: ['fill', 'stroke'],\n radialGradient: ['fill', 'stroke'],\n }\n\n let element\n let elements\n let properties\n let currentId: string\n let newId: string\n\n Object.keys(iriElementsAndProperties).forEach((key) => {\n element = key\n properties = iriElementsAndProperties[key]\n\n elements = svg.querySelectorAll(element + '[id]')\n for (let a = 0, elementsLen = elements.length; a < elementsLen; a++) {\n currentId = elements[a].id\n newId = currentId + '-' + uniqueId()\n\n // All of the properties that can reference this element type.\n let referencingElements\n Array.prototype.forEach.call(properties, (property: string) => {\n // :NOTE: using a substring match attr selector here to deal with IE\n // \"adding extra quotes in url() attrs\".\n referencingElements = svg.querySelectorAll(\n '[' + property + '*=\"' + currentId + '\"]'\n )\n for (\n let b = 0, referencingElementLen = referencingElements.length;\n b < referencingElementLen;\n b++\n ) {\n const attrValue: string | null =\n referencingElements[b].getAttribute(property)\n if (\n attrValue &&\n !attrValue.match(new RegExp('url\\\\(\"?#' + currentId + '\"?\\\\)'))\n ) {\n continue\n }\n referencingElements[b].setAttribute(\n property,\n 'url(#' + newId + ')'\n )\n }\n })\n\n const allLinks = svg.querySelectorAll('[*|href]')\n const links = []\n for (let c = 0, allLinksLen = allLinks.length; c < allLinksLen; c++) {\n const href = allLinks[c].getAttributeNS(xlinkNamespace, 'href')\n /* istanbul ignore else */\n if (href && href.toString() === '#' + elements[a].id) {\n links.push(allLinks[c])\n }\n }\n for (let d = 0, linksLen = links.length; d < linksLen; d++) {\n links[d].setAttributeNS(xlinkNamespace, 'href', '#' + newId)\n }\n\n elements[a].id = newId\n }\n })\n }\n\n // Remove any unwanted/invalid namespaces that might have been added by SVG\n // editing tools.\n svg.removeAttribute('xmlns:a')\n\n // Post page load injected SVGs don't automatically have their script\n // elements run, so we'll need to make that happen, if requested.\n\n // Find then prune the scripts.\n const scripts = svg.querySelectorAll('script')\n const scriptsToEval: string[] = []\n let script\n let scriptType\n\n for (let i = 0, scriptsLen = scripts.length; i < scriptsLen; i++) {\n scriptType = scripts[i].getAttribute('type')\n\n // Only process javascript types. SVG defaults to 'application/ecmascript'\n // for unset types.\n /* istanbul ignore else */\n if (\n !scriptType ||\n scriptType === 'application/ecmascript' ||\n scriptType === 'application/javascript' ||\n scriptType === 'text/javascript'\n ) {\n // innerText for IE, textContent for other browsers.\n script = scripts[i].innerText || scripts[i].textContent\n\n // Stash.\n /* istanbul ignore else */\n if (script) {\n scriptsToEval.push(script)\n }\n\n // Tidy up and remove the script element since we don't need it anymore.\n svg.removeChild(scripts[i])\n }\n }\n\n // Run/Eval the scripts if needed.\n /* istanbul ignore else */\n if (\n scriptsToEval.length > 0 &&\n (evalScripts === 'always' ||\n (evalScripts === 'once' && !ranScripts[elUrl]))\n ) {\n for (\n let l = 0, scriptsToEvalLen = scriptsToEval.length;\n l < scriptsToEvalLen;\n l++\n ) {\n // :NOTE: Yup, this is a form of eval, but it is being used to eval code\n // the caller has explictely asked to be loaded, and the code is in a\n // caller defined SVG file... not raw user input.\n //\n // Also, the code is evaluated in a closure and not in the global scope.\n // If you need to put something in global scope, use 'window'.\n new Function(scriptsToEval[l])(window)\n }\n\n // Remember we already ran scripts for this svg.\n ranScripts[elUrl] = true\n }\n\n // :WORKAROUND: IE doesn't evaluate <style> tags in SVGs that are\n // dynamically added to the page. This trick will trigger IE to read and use\n // any existing SVG <style> tags.\n //\n // Reference: https://github.com/iconic/SVGInjector/issues/23.\n const styleTags = svg.querySelectorAll('style')\n Array.prototype.forEach.call(styleTags, (styleTag: HTMLStyleElement) => {\n styleTag.textContent += ''\n })\n\n svg.setAttribute('xmlns', svgNamespace)\n svg.setAttribute('xmlns:xlink', xlinkNamespace)\n\n beforeEach(svg)\n\n if (!el.parentNode) {\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n callback(new Error('Parent node is null'))\n return\n }\n\n // Replace the image with the svg.\n el.parentNode.replaceChild(svg, el)\n\n // Now that we no longer need it, drop references to the original element so\n // it can be GC'd.\n // TODO: Extract\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n\n callback(null, svg)\n })\n}\n\nexport default injectElement\n","import injectElement from './inject-element'\nimport { AfterAll, BeforeEach, Errback, EvalScripts } from './types'\n\ntype Elements = HTMLCollectionOf<Element> | NodeListOf<Element> | Element | null\n\ninterface OptionalArgs {\n afterAll?: AfterAll\n afterEach?: Errback\n beforeEach?: BeforeEach\n cacheRequests?: boolean\n evalScripts?: EvalScripts\n httpRequestWithCredentials?: boolean\n renumerateIRIElements?: boolean\n}\n\nconst SVGInjector = (\n elements: Elements,\n {\n afterAll = () => undefined,\n afterEach = () => undefined,\n beforeEach = () => undefined,\n cacheRequests = true,\n evalScripts = 'never',\n httpRequestWithCredentials = false,\n renumerateIRIElements = true,\n }: OptionalArgs = {}\n) => {\n if (elements && 'length' in elements) {\n let elementsLoaded = 0\n for (let i = 0, j = elements.length; i < j; i++) {\n injectElement(\n elements[i],\n evalScripts,\n renumerateIRIElements,\n cacheRequests,\n httpRequestWithCredentials,\n beforeEach,\n (error, svg) => {\n afterEach(error, svg)\n if (\n elements &&\n 'length' in elements &&\n elements.length === ++elementsLoaded\n ) {\n afterAll(elementsLoaded)\n }\n }\n )\n }\n } else if (elements) {\n injectElement(\n elements,\n evalScripts,\n renumerateIRIElements,\n cacheRequests,\n httpRequestWithCredentials,\n beforeEach,\n (error, svg) => {\n afterEach(error, svg)\n afterAll(1)\n elements = null\n }\n )\n } else {\n afterAll(0)\n }\n}\n\nexport default SVGInjector\n"],"names":["cache","Map","cloneSvg","sourceSvg","cloneNode","isLocal","location","protocol","makeAjaxRequest","callback","httpRequest","onreadystatechange","test","url","readyState","contentType","Error","parseContentType","type","status","responseXML","statusText","error","abort","requestQueue","queueRequest","push","len","setTimeout","cacheValue","get","i","SVGSVGElement","length","httpRequestWithCredentials","has","undefined","set","loadSvgUncached","Document","idCounter","uniqueId","injectedElements","ranScripts","svgNamespace","xlinkNamespace","el","renumerateIRIElements","beforeEach","elUrl","getAttribute","indexOf","splice","cacheRequests","loadSvgCached","loadSvg","svg","elId","setAttribute","elTitle","elWidth","elHeight","mergedClasses","Array","from","split","join","trim","elStyle","elData","filter","call","attributes","at","name","prototype","forEach","dataAttr","value","iriElementsAndProperties_1","clipPath","linearGradient","marker","pattern","element_1","elements_1","properties_1","currentId_1","newId_1","Object","keys","key","querySelectorAll","a","elementsLen","id","property","referencingElements","SVGInjector","elements","_a","_b","_c","afterAll","_d","_e","_f","_g","evalScripts","_h","_j"],"mappings":"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"}
1
+ {"version":3,"file":"svg-injector.esm.js","sources":["../src/cache.ts","../src/clone-svg.ts","../src/is-local.ts","../src/make-ajax-request.ts","../src/request-queue.ts","../src/load-svg-cached.ts","../src/load-svg-uncached.ts","../src/unique-id.ts","../src/inject-element.ts","../src/svg-injector.ts"],"sourcesContent":["const cache = new Map<string, SVGSVGElement | Error | undefined>()\n\nexport default cache\n","const cloneSvg = (sourceSvg: SVGSVGElement) =>\n sourceSvg.cloneNode(true) as SVGSVGElement\n\nexport default cloneSvg\n","const isLocal = () => window.location.protocol === 'file:'\n\nexport default isLocal\n","import { parse as parseContentType } from 'content-type'\nimport isLocal from './is-local'\n\nconst makeAjaxRequest = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: (error: Error | null, httpRequest: XMLHttpRequest) => void\n) => {\n const httpRequest = new XMLHttpRequest()\n\n httpRequest.onreadystatechange = () => {\n try {\n if (!/\\.svg/i.test(url) && httpRequest.readyState === 2) {\n const contentType = httpRequest.getResponseHeader('Content-Type')\n if (!contentType) {\n throw new Error('Content type not found')\n }\n\n const { type } = parseContentType(contentType)\n if (!(type === 'image/svg+xml' || type === 'text/plain')) {\n throw new Error(`Invalid content type: ${type}`)\n }\n }\n\n if (httpRequest.readyState === 4) {\n if (httpRequest.status === 404 || httpRequest.responseXML === null) {\n throw new Error(\n isLocal()\n ? 'Note: SVG injection ajax calls do not work locally without ' +\n 'adjusting security settings in your browser. Or consider ' +\n 'using a local webserver.'\n : 'Unable to load SVG file: ' + url\n )\n }\n\n if (\n httpRequest.status === 200 ||\n (isLocal() && httpRequest.status === 0)\n ) {\n callback(null, httpRequest)\n } else {\n throw new Error(\n 'There was a problem injecting the SVG: ' +\n httpRequest.status +\n ' ' +\n httpRequest.statusText\n )\n }\n }\n } catch (error) {\n httpRequest.abort()\n if (error instanceof Error) {\n callback(error, httpRequest)\n } else {\n throw error\n }\n }\n }\n\n httpRequest.open('GET', url)\n\n httpRequest.withCredentials = httpRequestWithCredentials\n\n /* istanbul ignore else */\n if (httpRequest.overrideMimeType) {\n httpRequest.overrideMimeType('text/xml')\n }\n\n httpRequest.send()\n}\n\nexport default makeAjaxRequest\n","import cache from './cache'\nimport cloneSvg from './clone-svg'\nimport { Errback } from './types'\n\nlet requestQueue: { [key: string]: Errback[] } = {}\n\nexport const clear = () => {\n requestQueue = {}\n}\n\nexport const queueRequest = (url: string, callback: Errback) => {\n requestQueue[url] = requestQueue[url] || []\n requestQueue[url].push(callback)\n}\n\nexport const processRequestQueue = (url: string) => {\n for (let i = 0, len = requestQueue[url].length; i < len; i++) {\n // Make these calls async so we avoid blocking the page/renderer.\n setTimeout(() => {\n /* istanbul ignore else */\n if (Array.isArray(requestQueue[url])) {\n const cacheValue = cache.get(url)\n const callback = requestQueue[url][i]\n\n /* istanbul ignore else */\n if (cacheValue instanceof SVGSVGElement) {\n callback(null, cloneSvg(cacheValue))\n }\n\n /* istanbul ignore else */\n if (cacheValue instanceof Error) {\n callback(cacheValue)\n }\n\n /* istanbul ignore else */\n if (i === requestQueue[url].length - 1) {\n delete requestQueue[url]\n }\n }\n }, 0)\n }\n}\n","import cache from './cache'\nimport cloneSvg from './clone-svg'\nimport makeAjaxRequest from './make-ajax-request'\nimport { processRequestQueue, queueRequest } from './request-queue'\nimport { Errback } from './types'\n\nconst loadSvgCached = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: Errback\n) => {\n if (cache.has(url)) {\n const cacheValue = cache.get(url)\n\n if (cacheValue === undefined) {\n queueRequest(url, callback)\n return\n }\n\n /* istanbul ignore else */\n if (cacheValue instanceof SVGSVGElement) {\n callback(null, cloneSvg(cacheValue))\n return\n }\n\n // Errors are always refetched.\n }\n\n // Seed the cache to indicate we are loading this URL.\n cache.set(url, undefined)\n queueRequest(url, callback)\n\n makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => {\n /* istanbul ignore else */\n if (error) {\n cache.set(url, error)\n } else if (\n httpRequest.responseXML instanceof Document &&\n httpRequest.responseXML.documentElement &&\n httpRequest.responseXML.documentElement instanceof SVGSVGElement\n ) {\n cache.set(url, httpRequest.responseXML.documentElement)\n }\n processRequestQueue(url)\n })\n}\n\nexport default loadSvgCached\n","import makeAjaxRequest from './make-ajax-request'\nimport { Errback } from './types'\n\nconst loadSvgUncached = (\n url: string,\n httpRequestWithCredentials: boolean,\n callback: Errback\n) => {\n makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => {\n /* istanbul ignore else */\n if (error) {\n callback(error)\n } else if (\n httpRequest.responseXML instanceof Document &&\n httpRequest.responseXML.documentElement &&\n httpRequest.responseXML.documentElement instanceof SVGSVGElement\n ) {\n callback(null, httpRequest.responseXML.documentElement)\n }\n })\n}\n\nexport default loadSvgUncached\n","let idCounter = 0\nconst uniqueId = () => ++idCounter\nexport default uniqueId\n","import loadSvgCached from './load-svg-cached'\nimport loadSvgUncached from './load-svg-uncached'\nimport { BeforeEach, Errback, EvalScripts } from './types'\nimport uniqueId from './unique-id'\n\ntype ElementType = Element | HTMLElement | null\n\nconst injectedElements: ElementType[] = []\nconst ranScripts: { [key: string]: boolean } = {}\nconst svgNamespace = 'http://www.w3.org/2000/svg'\nconst xlinkNamespace = 'http://www.w3.org/1999/xlink'\n\nconst injectElement = (\n el: NonNullable<ElementType>,\n evalScripts: EvalScripts,\n renumerateIRIElements: boolean,\n cacheRequests: boolean,\n httpRequestWithCredentials: boolean,\n beforeEach: BeforeEach,\n callback: Errback\n) => {\n const elUrl = el.getAttribute('data-src') || el.getAttribute('src')\n\n /* istanbul ignore else */\n if (!elUrl) {\n callback(new Error('Invalid data-src or src attribute'))\n return\n }\n\n // Make sure we aren't already in the process of injecting this element to\n // avoid a race condition if multiple injections for the same element are run.\n // :NOTE: Using indexOf() only _after_ we check for SVG support and bail, so\n // no need for IE8 indexOf() polyfill.\n /* istanbul ignore else */\n if (injectedElements.indexOf(el) !== -1) {\n // TODO: Extract.\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n return\n }\n\n // Remember the request to inject this element, in case other injection calls\n // are also trying to replace this element before we finish.\n injectedElements.push(el)\n\n // Try to avoid loading the orginal image src if possible.\n el.setAttribute('src', '')\n\n const loadSvg = cacheRequests ? loadSvgCached : loadSvgUncached\n\n loadSvg(elUrl, httpRequestWithCredentials, (error, svg) => {\n /* istanbul ignore else */\n if (!svg) {\n // TODO: Extract.\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n callback(error)\n return\n }\n\n const elId = el.getAttribute('id')\n /* istanbul ignore else */\n if (elId) {\n svg.setAttribute('id', elId)\n }\n\n const elTitle = el.getAttribute('title')\n /* istanbul ignore else */\n if (elTitle) {\n svg.setAttribute('title', elTitle)\n }\n\n const elWidth = el.getAttribute('width')\n /* istanbul ignore else */\n if (elWidth) {\n svg.setAttribute('width', elWidth)\n }\n\n const elHeight = el.getAttribute('height')\n /* istanbul ignore else */\n if (elHeight) {\n svg.setAttribute('height', elHeight)\n }\n\n const mergedClasses = Array.from(\n new Set([\n ...(svg.getAttribute('class') || '').split(' '),\n 'injected-svg',\n ...(el.getAttribute('class') || '').split(' '),\n ])\n )\n .join(' ')\n .trim()\n svg.setAttribute('class', mergedClasses)\n\n const elStyle = el.getAttribute('style')\n /* istanbul ignore else */\n if (elStyle) {\n svg.setAttribute('style', elStyle)\n }\n\n svg.setAttribute('data-src', elUrl)\n\n // Copy all the data elements to the svg.\n const elData = [].filter.call(el.attributes, (at: Attr) => {\n return /^data-\\w[\\w-]*$/.test(at.name)\n })\n\n Array.prototype.forEach.call(elData, (dataAttr: Attr) => {\n /* istanbul ignore else */\n if (dataAttr.name && dataAttr.value) {\n svg.setAttribute(dataAttr.name, dataAttr.value)\n }\n })\n\n /* istanbul ignore else */\n if (renumerateIRIElements) {\n // Make sure any internally referenced clipPath ids and their clip-path\n // references are unique.\n //\n // This addresses the issue of having multiple instances of the same SVG\n // on a page and only the first clipPath id is referenced.\n //\n // Browsers often shortcut the SVG Spec and don't use clipPaths contained\n // in parent elements that are hidden, so if you hide the first SVG\n // instance on the page, then all other instances lose their clipping.\n // Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=376027\n\n // Handle all defs elements that have iri capable attributes as defined by\n // w3c: http://www.w3.org/TR/SVG/linking.html#processingIRI. Mapping IRI\n // addressable elements to the properties that can reference them.\n const iriElementsAndProperties: { [key: string]: string[] } = {\n clipPath: ['clip-path'],\n 'color-profile': ['color-profile'],\n cursor: ['cursor'],\n filter: ['filter'],\n linearGradient: ['fill', 'stroke'],\n marker: ['marker', 'marker-start', 'marker-mid', 'marker-end'],\n mask: ['mask'],\n path: [],\n pattern: ['fill', 'stroke'],\n radialGradient: ['fill', 'stroke'],\n }\n\n let element\n let elements\n let properties\n let currentId: string\n let newId: string\n\n Object.keys(iriElementsAndProperties).forEach((key) => {\n element = key\n properties = iriElementsAndProperties[key]\n\n elements = svg.querySelectorAll(element + '[id]')\n for (let a = 0, elementsLen = elements.length; a < elementsLen; a++) {\n currentId = elements[a].id\n newId = currentId + '-' + uniqueId()\n\n // All of the properties that can reference this element type.\n let referencingElements\n Array.prototype.forEach.call(properties, (property: string) => {\n // :NOTE: using a substring match attr selector here to deal with IE\n // \"adding extra quotes in url() attrs\".\n referencingElements = svg.querySelectorAll(\n '[' + property + '*=\"' + currentId + '\"]'\n )\n for (\n let b = 0, referencingElementLen = referencingElements.length;\n b < referencingElementLen;\n b++\n ) {\n const attrValue: string | null =\n referencingElements[b].getAttribute(property)\n if (\n attrValue &&\n !attrValue.match(new RegExp('url\\\\(\"?#' + currentId + '\"?\\\\)'))\n ) {\n continue\n }\n referencingElements[b].setAttribute(\n property,\n 'url(#' + newId + ')'\n )\n }\n })\n\n const allLinks = svg.querySelectorAll('[*|href]')\n const links = []\n for (let c = 0, allLinksLen = allLinks.length; c < allLinksLen; c++) {\n const href = allLinks[c].getAttributeNS(xlinkNamespace, 'href')\n /* istanbul ignore else */\n if (href && href.toString() === '#' + elements[a].id) {\n links.push(allLinks[c])\n }\n }\n for (let d = 0, linksLen = links.length; d < linksLen; d++) {\n links[d].setAttributeNS(xlinkNamespace, 'href', '#' + newId)\n }\n\n elements[a].id = newId\n }\n })\n }\n\n // Remove any unwanted/invalid namespaces that might have been added by SVG\n // editing tools.\n svg.removeAttribute('xmlns:a')\n\n // Post page load injected SVGs don't automatically have their script\n // elements run, so we'll need to make that happen, if requested.\n\n // Find then prune the scripts.\n const scripts = svg.querySelectorAll('script')\n const scriptsToEval: string[] = []\n let script\n let scriptType\n\n for (let i = 0, scriptsLen = scripts.length; i < scriptsLen; i++) {\n scriptType = scripts[i].getAttribute('type')\n\n // Only process javascript types. SVG defaults to 'application/ecmascript'\n // for unset types.\n /* istanbul ignore else */\n if (\n !scriptType ||\n scriptType === 'application/ecmascript' ||\n scriptType === 'application/javascript' ||\n scriptType === 'text/javascript'\n ) {\n // innerText for IE, textContent for other browsers.\n script = scripts[i].innerText || scripts[i].textContent\n\n // Stash.\n /* istanbul ignore else */\n if (script) {\n scriptsToEval.push(script)\n }\n\n // Tidy up and remove the script element since we don't need it anymore.\n svg.removeChild(scripts[i])\n }\n }\n\n // Run/Eval the scripts if needed.\n /* istanbul ignore else */\n if (\n scriptsToEval.length > 0 &&\n (evalScripts === 'always' ||\n (evalScripts === 'once' && !ranScripts[elUrl]))\n ) {\n for (\n let l = 0, scriptsToEvalLen = scriptsToEval.length;\n l < scriptsToEvalLen;\n l++\n ) {\n // :NOTE: Yup, this is a form of eval, but it is being used to eval code\n // the caller has explictely asked to be loaded, and the code is in a\n // caller defined SVG file... not raw user input.\n //\n // Also, the code is evaluated in a closure and not in the global scope.\n // If you need to put something in global scope, use 'window'.\n new Function(scriptsToEval[l])(window)\n }\n\n // Remember we already ran scripts for this svg.\n ranScripts[elUrl] = true\n }\n\n // :WORKAROUND: IE doesn't evaluate <style> tags in SVGs that are\n // dynamically added to the page. This trick will trigger IE to read and use\n // any existing SVG <style> tags.\n //\n // Reference: https://github.com/iconic/SVGInjector/issues/23.\n const styleTags = svg.querySelectorAll('style')\n Array.prototype.forEach.call(styleTags, (styleTag: HTMLStyleElement) => {\n styleTag.textContent += ''\n })\n\n svg.setAttribute('xmlns', svgNamespace)\n svg.setAttribute('xmlns:xlink', xlinkNamespace)\n\n beforeEach(svg)\n\n if (!el.parentNode) {\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n callback(new Error('Parent node is null'))\n return\n }\n\n // Replace the image with the svg.\n el.parentNode.replaceChild(svg, el)\n\n // Now that we no longer need it, drop references to the original element so\n // it can be GC'd.\n // TODO: Extract\n injectedElements.splice(injectedElements.indexOf(el), 1)\n ;(el as ElementType) = null\n\n callback(null, svg)\n })\n}\n\nexport default injectElement\n","import injectElement from './inject-element'\nimport { AfterAll, BeforeEach, Errback, EvalScripts } from './types'\n\ntype Elements = HTMLCollectionOf<Element> | NodeListOf<Element> | Element | null\n\ninterface OptionalArgs {\n afterAll?: AfterAll\n afterEach?: Errback\n beforeEach?: BeforeEach\n cacheRequests?: boolean\n evalScripts?: EvalScripts\n httpRequestWithCredentials?: boolean\n renumerateIRIElements?: boolean\n}\n\nconst SVGInjector = (\n elements: Elements,\n {\n afterAll = () => undefined,\n afterEach = () => undefined,\n beforeEach = () => undefined,\n cacheRequests = true,\n evalScripts = 'never',\n httpRequestWithCredentials = false,\n renumerateIRIElements = true,\n }: OptionalArgs = {}\n) => {\n if (elements && 'length' in elements) {\n let elementsLoaded = 0\n for (let i = 0, j = elements.length; i < j; i++) {\n injectElement(\n elements[i],\n evalScripts,\n renumerateIRIElements,\n cacheRequests,\n httpRequestWithCredentials,\n beforeEach,\n (error, svg) => {\n afterEach(error, svg)\n if (\n elements &&\n 'length' in elements &&\n elements.length === ++elementsLoaded\n ) {\n afterAll(elementsLoaded)\n }\n }\n )\n }\n } else if (elements) {\n injectElement(\n elements,\n evalScripts,\n renumerateIRIElements,\n cacheRequests,\n httpRequestWithCredentials,\n beforeEach,\n (error, svg) => {\n afterEach(error, svg)\n afterAll(1)\n elements = null\n }\n )\n } else {\n afterAll(0)\n }\n}\n\nexport default SVGInjector\n"],"names":["cache","Map","cloneSvg","sourceSvg","cloneNode","isLocal","location","protocol","makeAjaxRequest","callback","httpRequest","onreadystatechange","test","url","readyState","contentType","Error","parseContentType","type","status","responseXML","statusText","error","abort","requestQueue","queueRequest","push","len","setTimeout","cacheValue","get","i","SVGSVGElement","length","httpRequestWithCredentials","has","undefined","set","loadSvgUncached","Document","idCounter","uniqueId","injectedElements","ranScripts","svgNamespace","xlinkNamespace","el","renumerateIRIElements","beforeEach","elUrl","getAttribute","indexOf","splice","cacheRequests","loadSvgCached","loadSvg","svg","elId","setAttribute","elTitle","elWidth","elHeight","mergedClasses","Array","from","split","join","trim","elStyle","elData","filter","call","attributes","at","name","prototype","forEach","dataAttr","value","iriElementsAndProperties_1","clipPath","linearGradient","marker","pattern","element_1","elements_1","properties_1","currentId_1","newId_1","Object","keys","key","querySelectorAll","a","elementsLen","id","property","referencingElements","SVGInjector","elements","_a","_b","_c","afterAll","_f","_g","evalScripts","_h"],"mappings":"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"}