= () => { type: T }\n>(\n type: T,\n createHandler?: (\n actionCallback: (\n payload?: P,\n meta?: M\n ) => PayloadMetaAction\n ) => AC\n): AC {\n // validation is already done in action function\n\n const actionCreator: AC =\n createHandler == null\n ? ((() => action(type)) as AC)\n : createHandler(action.bind(null, type) as Parameters<\n typeof createHandler\n >[0]);\n\n return Object.assign(actionCreator, {\n getType: () => type,\n // redux-actions compatibility\n toString: () => type,\n });\n}\n","import { TypeConstant, ActionCreatorBuilder } from '../type-helpers';\nimport {\n checkIsEmpty,\n throwIsEmpty,\n checkInvalidActionType,\n throwInvalidActionType,\n} from '../utils/validation';\nimport { createCustomAction } from './create-custom-action';\n\n/** @private */\nexport type ActionBuilderMap<\n TType extends TypeConstant,\n TActionProps extends any,\n TPayloadArg extends any = undefined,\n TMetaArg extends any = undefined\n> = [TMetaArg] extends [undefined]\n ? [TPayloadArg] extends [undefined]\n ? () => { type: TType } & TActionProps\n : (payload: TPayloadArg) => { type: TType } & TActionProps\n : (payload: TPayloadArg, meta: TMetaArg) => { type: TType } & TActionProps;\n\nexport interface ActionBuilder {\n (): ActionCreatorBuilder;\n map(\n fn: (payload: P, meta: M) => R\n ): ActionBuilderMap;\n}\n\n/**\n * @description create an action-creator of a given function that contains hidden \"type\" metadata\n */\nexport function createStandardAction(\n type: T\n): ActionBuilder {\n if (checkIsEmpty(type)) {\n throwIsEmpty(1);\n }\n\n if (checkInvalidActionType(type)) {\n throwInvalidActionType(1);\n }\n\n function constructor(): ActionCreatorBuilder {\n return createCustomAction(type, _type => (payload: P, meta: M) => ({\n type: _type,\n payload,\n meta,\n })) as ActionCreatorBuilder;\n }\n\n function map(\n fn: (payload: P, meta: M) => R\n ): ActionBuilderMap {\n return createCustomAction(type, _type => (payload: P, meta: M) =>\n Object.assign(fn(payload, meta), { type: _type })\n ) as ActionBuilderMap;\n }\n\n return Object.assign(constructor, { map });\n}\n","import {\n TypeConstant,\n ActionCreatorBuilder,\n ActionBuilder,\n} from './type-helpers';\nimport { createAction } from './create-action';\n\nexport function throwInvalidAsyncActionArgument(argPosition: number): never {\n throw new Error(\n `Argument ${argPosition} is invalid, it should be an action type of \"string | symbol\" or a tuple of \"[string | symbol, Function, Function?]\"`\n );\n}\n\ntype AsyncActionHandler<\n TType extends TypeConstant,\n TArgs extends any[],\n TPayloadMeta\n> = [TArgs] extends [never]\n ? ActionCreatorBuilder<\n TType,\n unknown extends TPayloadMeta\n ? any\n : [TPayloadMeta] extends [[infer T, any]]\n ? T\n : TPayloadMeta,\n unknown extends TPayloadMeta\n ? undefined\n : [TPayloadMeta] extends [[any, infer T]]\n ? T\n : undefined\n >\n : (\n ...args: TArgs\n ) => ActionBuilder<\n TType,\n [TPayloadMeta] extends [[infer T, any]] ? T : TPayloadMeta,\n [TPayloadMeta] extends [[any, infer T]] ? T : undefined\n >;\n\ninterface AsyncAction<\n TType1 extends TypeConstant,\n TPayload1 extends any,\n TMeta1 extends any,\n TArgs1 extends any[],\n TType2 extends TypeConstant,\n TPayload2 extends any,\n TMeta2 extends any,\n TArgs2 extends any[],\n TType3 extends TypeConstant,\n TPayload3 extends any,\n TMeta3 extends any,\n TArgs3 extends any[],\n TType4 extends TypeConstant,\n TPayload4 extends any,\n TMeta4 extends any,\n TArgs4 extends any[]\n> {\n // tslint:disable-next-line: callable-types\n <\n TPayloadMeta1 extends\n | TPayload1\n | [TPayload1, TMeta1] = TMeta1 extends undefined\n ? TPayload1\n : [TPayload1, TMeta1],\n TPayloadMeta2 extends\n | TPayload2\n | [TPayload2, TMeta2] = TMeta2 extends undefined\n ? TPayload2\n : [TPayload2, TMeta2],\n TPayloadMeta3 extends\n | TPayload3\n | [TPayload3, TMeta3] = TMeta3 extends undefined\n ? TPayload3\n : [TPayload3, TMeta3],\n TPayloadMeta4 extends\n | TPayload4\n | [TPayload4, TMeta4] = TMeta3 extends undefined\n ? TPayload4\n : [TPayload4, TMeta4]\n >(): [TType4] extends [never]\n ? {\n request: AsyncActionHandler;\n success: AsyncActionHandler;\n failure: AsyncActionHandler;\n }\n : {\n request: AsyncActionHandler;\n success: AsyncActionHandler;\n failure: AsyncActionHandler;\n cancel: AsyncActionHandler;\n };\n}\n\nexport function createAsyncAction<\n TType1 extends TypeConstant,\n TType2 extends TypeConstant,\n TType3 extends TypeConstant,\n TType4 extends TypeConstant = never\n>(\n requestArg: TType1,\n successArg: TType2,\n failureArg: TType3,\n cancelArg?: TType4\n): AsyncAction<\n TType1,\n unknown,\n unknown,\n never,\n TType2,\n unknown,\n unknown,\n never,\n TType3,\n unknown,\n unknown,\n never,\n TType4,\n unknown,\n unknown,\n never\n>;\n\nexport function createAsyncAction<\n TType1 extends TypeConstant,\n TType2 extends TypeConstant,\n TType3 extends TypeConstant,\n TType4 extends TypeConstant = never,\n TPayloadCreator1 extends\n | ((...args: TArgs1) => TPayload1)\n | undefined = undefined,\n TPayloadCreator2 extends\n | ((...args: TArgs2) => TPayload2)\n | undefined = undefined,\n TPayloadCreator3 extends\n | ((...args: TArgs3) => TPayload3)\n | undefined = undefined,\n TPayloadCreator4 extends\n | ((...args: TArgs4) => TPayload4)\n | undefined = undefined,\n TMetaCreator1 extends ((...args: TArgs1) => TMeta1) | undefined = undefined,\n TMetaCreator2 extends ((...args: TArgs2) => TMeta2) | undefined = undefined,\n TMetaCreator3 extends ((...args: TArgs3) => TMeta3) | undefined = undefined,\n TMetaCreator4 extends ((...args: TArgs4) => TMeta4) | undefined = undefined,\n TPayload1 extends any = TPayloadCreator1 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta1 extends any = TMetaCreator1 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload2 extends any = TPayloadCreator2 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta2 extends any = TMetaCreator2 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload3 extends any = TPayloadCreator3 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta3 extends any = TMetaCreator3 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload4 extends any = TPayloadCreator4 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta4 extends any = TMetaCreator4 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TArgs1 extends any[] = TPayloadCreator1 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator1 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs2 extends any[] = TPayloadCreator2 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator2 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs3 extends any[] = TPayloadCreator3 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator3 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs4 extends any[] = TPayloadCreator4 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator4 extends ((...args: infer T) => any)\n ? T\n : never\n>(\n requestArg:\n | TType1\n | [TType1, TPayloadCreator1]\n | [TType1, TPayloadCreator1, TMetaCreator1],\n successArg:\n | TType2\n | [TType2, TPayloadCreator2]\n | [TType2, TPayloadCreator2, TMetaCreator2],\n failureArg:\n | TType3\n | [TType3, TPayloadCreator3]\n | [TType3, TPayloadCreator3, TMetaCreator3],\n cancelArg?:\n | TType4\n | [TType4, TPayloadCreator4]\n | [TType4, TPayloadCreator4, TMetaCreator4]\n): AsyncAction<\n TType1,\n TPayload1,\n TMeta1,\n TArgs1,\n TType2,\n TPayload2,\n TMeta2,\n TArgs2,\n TType3,\n TPayload3,\n TMeta3,\n TArgs3,\n TType4,\n TPayload4,\n TMeta4,\n TArgs4\n>;\n\n/**\n * @description create an async action-creator object that contains `request`, `success` and `failure` actions as props\n */\nexport function createAsyncAction<\n TType1 extends TypeConstant,\n TType2 extends TypeConstant,\n TType3 extends TypeConstant,\n TType4 extends TypeConstant = never,\n TPayloadCreator1 extends\n | ((...args: TArgs1) => TPayload1)\n | undefined = undefined,\n TPayloadCreator2 extends\n | ((...args: TArgs2) => TPayload2)\n | undefined = undefined,\n TPayloadCreator3 extends\n | ((...args: TArgs3) => TPayload3)\n | undefined = undefined,\n TPayloadCreator4 extends\n | ((...args: TArgs4) => TPayload4)\n | undefined = undefined,\n TMetaCreator1 extends ((...args: TArgs1) => TMeta1) | undefined = undefined,\n TMetaCreator2 extends ((...args: TArgs2) => TMeta2) | undefined = undefined,\n TMetaCreator3 extends ((...args: TArgs3) => TMeta3) | undefined = undefined,\n TMetaCreator4 extends ((...args: TArgs4) => TMeta4) | undefined = undefined,\n TPayload1 extends any = TPayloadCreator1 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta1 extends any = TMetaCreator1 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload2 extends any = TPayloadCreator2 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta2 extends any = TMetaCreator2 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload3 extends any = TPayloadCreator3 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta3 extends any = TMetaCreator3 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TPayload4 extends any = TPayloadCreator4 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TMeta4 extends any = TMetaCreator4 extends ((...args: any[]) => infer T)\n ? T\n : undefined,\n TArgs1 extends any[] = TPayloadCreator1 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator1 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs2 extends any[] = TPayloadCreator2 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator2 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs3 extends any[] = TPayloadCreator3 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator3 extends ((...args: infer T) => any)\n ? T\n : never,\n TArgs4 extends any[] = TPayloadCreator4 extends ((...args: infer T) => any)\n ? T\n : TMetaCreator4 extends ((...args: infer T) => any)\n ? T\n : never\n>(\n requestArg:\n | TType1\n | [TType1, TPayloadCreator1]\n | [TType1, TPayloadCreator1, TMetaCreator1],\n successArg:\n | TType2\n | [TType2, TPayloadCreator2]\n | [TType2, TPayloadCreator2, TMetaCreator2],\n failureArg:\n | TType3\n | [TType3, TPayloadCreator3]\n | [TType3, TPayloadCreator3, TMetaCreator3],\n cancelArg?:\n | TType4\n | [TType4, TPayloadCreator4]\n | [TType4, TPayloadCreator4, TMetaCreator4]\n): AsyncAction<\n TType1,\n TPayload1,\n TMeta1,\n TArgs1,\n TType2,\n TPayload2,\n TMeta2,\n TArgs2,\n TType3,\n TPayload3,\n TMeta3,\n TArgs3,\n TType4,\n TPayload4,\n TMeta4,\n TArgs4\n> {\n const constructor = (<\n TP1 = undefined,\n TM1 = undefined,\n TP2 = undefined,\n TM2 = undefined,\n TP3 = undefined,\n TM3 = undefined,\n TP4 = undefined,\n TM4 = undefined\n >() => {\n const results = [requestArg, successArg, failureArg, cancelArg].map(\n (arg, index) => {\n if (Array.isArray(arg)) {\n return createAction(arg[0], arg[1] as any, arg[2] as any)();\n } else if (typeof arg === 'string' || typeof arg === 'symbol') {\n return createAction(arg as string)();\n } else if (index < 3) {\n throwInvalidAsyncActionArgument(index);\n }\n }\n );\n\n const [request, success, failure, cancel] = results;\n\n return {\n request,\n success,\n failure,\n cancel,\n };\n }) as AsyncAction<\n TType1,\n TPayload1,\n TMeta1,\n TArgs1,\n TType2,\n TPayload2,\n TMeta2,\n TArgs2,\n TType3,\n TPayload3,\n TMeta3,\n TArgs3,\n TType4,\n TPayload4,\n TMeta4,\n TArgs4\n >;\n\n return constructor;\n}\n","import { getType } from './get-type';\nimport {\n checkValidActionCreator,\n checkValidActionType,\n throwInvalidActionTypeOrActionCreator,\n} from './utils/validation';\nimport { Reducer, Action, Types } from './type-helpers';\n\ntype HandleActionChainApi<\n TState,\n TInputAction extends Action,\n TRootAction extends Action\n> = <\n TActionCreator extends (...args: any[]) => TInputAction,\n THandledAction extends ReturnType,\n TOutputAction extends Exclude\n>(\n singleOrMultipleCreatorsAndTypes: TActionCreator | TActionCreator[],\n reducer: (state: TState, action: THandledAction) => TState\n) => [TOutputAction] extends [Action]\n ? Reducer & {\n handlers: Record<\n Exclude['type'],\n (state: TState, action: TRootAction) => TState\n >;\n handleAction: HandleActionChainApi;\n }\n : Reducer & {\n handlers: Record<\n TRootAction['type'],\n (state: TState, action: TRootAction) => TState\n >;\n };\n\ntype HandleTypeChainApi<\n TState,\n TInputAction extends Action,\n TRootAction extends Action\n> = <\n TType extends TInputAction['type'],\n THandledAction extends Extract>,\n TOutputAction extends Exclude\n>(\n singleOrMultipleCreatorsAndTypes: TType | TType[],\n reducer: (state: TState, action: THandledAction) => TState\n) => [TOutputAction] extends [Action]\n ? Reducer & {\n handlers: Record<\n Exclude['type'],\n (state: TState, action: TRootAction) => TState\n >;\n handleType: HandleTypeChainApi;\n }\n : Reducer & {\n handlers: Record<\n TRootAction['type'],\n (state: TState, action: TRootAction) => TState\n >;\n };\n\ntype GetAction<\n TAction extends Action,\n TType extends TAction['type']\n> = TAction extends Action ? TAction : never;\n\ntype InitialHandler = {\n [P in TRootAction['type']]?: (\n state: TState,\n action: GetAction\n ) => TState;\n};\n\ntype RootAction = Types extends { RootAction: infer T } ? T : any;\n\nexport function createReducer(\n initialState: TState,\n initialHandlers: InitialHandler = {}\n) {\n const handlers: any = {\n ...initialHandlers,\n };\n\n const rootReducer: Reducer = (\n state = initialState,\n action: TRootAction\n ) => {\n if (handlers.hasOwnProperty(action.type)) {\n const reducer = handlers[action.type];\n if (typeof reducer !== 'function') {\n throw Error(\n `Reducer under \"${action.type}\" key is not a valid reducer`\n );\n }\n return reducer(state, action);\n } else {\n return state;\n }\n };\n\n const reducerHandler = ((\n singleOrMultipleCreatorsAndTypes: any,\n reducer: any\n ) => {\n const creatorsAndTypes = Array.isArray(singleOrMultipleCreatorsAndTypes)\n ? singleOrMultipleCreatorsAndTypes\n : [singleOrMultipleCreatorsAndTypes];\n\n const newHandlers: typeof handlers = {};\n\n creatorsAndTypes\n .map(\n (\n acOrType: TRootAction['type'] | ((...args: any[]) => TRootAction),\n index\n ) =>\n checkValidActionCreator(acOrType)\n ? getType(acOrType)\n : checkValidActionType(acOrType)\n ? acOrType\n : throwInvalidActionTypeOrActionCreator(index + 1)\n )\n .forEach(type => (newHandlers[type] = reducer));\n\n return createReducer(initialState, {\n ...handlers,\n ...newHandlers,\n });\n }) as\n | HandleActionChainApi\n | HandleTypeChainApi;\n\n const chainApi = Object.assign(rootReducer, {\n handlers: { ...handlers },\n handleAction: reducerHandler,\n handleType: reducerHandler,\n }) as Reducer &\n Readonly<{\n handlers: InitialHandler;\n handleAction: [unknown] extends [TRootAction]\n ? any\n : HandleActionChainApi;\n handleType: [unknown] extends [TRootAction]\n ? any\n : HandleTypeChainApi;\n }>;\n\n return chainApi;\n}\n","import { ActionCreatorTypeMetadata } from './type-helpers';\nimport {\n checkInvalidActionCreatorInArray,\n checkIsEmpty,\n throwIsEmpty,\n} from './utils/validation';\n\nexport type ActionCreator = ((\n ...args: any[]\n) => T) &\n ActionCreatorTypeMetadata;\n\n/**\n * @description (curried assert function) check if an action is the instance of given action-creator(s)\n * @description it works with discriminated union types\n */\nexport function isActionOf>(\n actionCreator: AC | AC[],\n action: { type: string }\n): action is ReturnType;\n\n/**\n * @description (curried assert function) check if an action is the instance of given action-creator(s)\n * @description it works with discriminated union types\n */\nexport function isActionOf>(\n actionCreator: AC | AC[]\n): (action: { type: string }) => action is ReturnType;\n\n/**\n * implementation\n */\nexport function isActionOf>(\n actionCreatorOrCreators: AC | AC[],\n action?: { type: string }\n) {\n if (checkIsEmpty(actionCreatorOrCreators)) {\n throwIsEmpty(1);\n }\n\n const actionCreators = Array.isArray(actionCreatorOrCreators)\n ? actionCreatorOrCreators\n : [actionCreatorOrCreators];\n\n actionCreators.forEach(checkInvalidActionCreatorInArray);\n\n const assertFn = (_action: { type: string }) =>\n actionCreators.some(\n actionCreator => _action.type === actionCreator.getType!()\n );\n\n // 1 arg case => return curried version\n if (action === undefined) {\n return assertFn;\n }\n // 2 args case => invoke assertFn and return the result\n return assertFn(action);\n}\n","import {\n checkInvalidActionTypeInArray,\n checkIsEmpty,\n throwIsEmpty,\n} from './utils/validation';\n/**\n * @description (curried assert function) check if action type is equal given type-constant\n * @description it works with discriminated union types\n */\nexport function isOfType(\n type: T | T[],\n action: A\n): action is A extends { type: T } ? A : never;\n\n/**\n * @description (curried assert function) check if action type is equal given type-constant\n * @description it works with discriminated union types\n */\nexport function isOfType(\n type: T | T[]\n): (\n action: A\n) => action is A extends { type: T } ? A : never;\n\n/**\n * implementation\n */\nexport function isOfType(\n actionTypeOrTypes: T | T[],\n action?: A\n) {\n if (checkIsEmpty(actionTypeOrTypes)) {\n throwIsEmpty(1);\n }\n\n const actionTypes = Array.isArray(actionTypeOrTypes)\n ? actionTypeOrTypes\n : [actionTypeOrTypes];\n\n actionTypes.forEach(checkInvalidActionTypeInArray);\n\n const assertFn = (_action: A) => actionTypes.includes(_action.type);\n\n // 1 arg case => return curried version\n if (action === undefined) {\n return assertFn;\n }\n // 2 args case => invoke assertFn and return the result\n return assertFn(action);\n}\n","const cloneSvg = (sourceSvg: HTMLElement | SVGSVGElement) =>\n sourceSvg.cloneNode(true) as Element\n\nexport default cloneSvg\n","const isLocal = () => window.location.protocol === 'file:'\n\nexport default isLocal\n","const svgCache = new Map<\n string,\n HTMLElement | SVGSVGElement | Error | undefined\n>()\n\nexport default svgCache\n","import cloneSvg from './clone-svg'\nimport svgCache from './svg-cache'\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 = svgCache.get(url)\n const callback = requestQueue[url][i]\n\n /* istanbul ignore else */\n if (\n cacheValue instanceof SVGSVGElement ||\n cacheValue instanceof HTMLElement\n ) {\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","let idCounter = 0\nconst uniqueId = () => ++idCounter\nexport default uniqueId\n","import loadSvg from './load-svg'\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,\n evalScripts: EvalScripts,\n renumerateIRIElements: boolean,\n beforeEach: BeforeEach,\n callback: Errback\n) => {\n const imgUrl = el.getAttribute('data-src') || el.getAttribute('src')\n\n /* istanbul ignore else */\n if (!imgUrl || !/\\.svg/i.test(imgUrl)) {\n callback(\n new Error(\n 'Attempted to inject a file with a non-svg extension: ' + imgUrl\n )\n )\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 loadSvg(imgUrl, (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 imgId = el.getAttribute('id')\n /* istanbul ignore else */\n if (imgId) {\n svg.setAttribute('id', imgId)\n }\n\n const imgTitle = el.getAttribute('title')\n /* istanbul ignore else */\n if (imgTitle) {\n svg.setAttribute('title', imgTitle)\n }\n\n const imgWidth = el.getAttribute('width')\n /* istanbul ignore else */\n if (imgWidth) {\n svg.setAttribute('width', imgWidth)\n }\n\n const imgHeight = el.getAttribute('height')\n /* istanbul ignore else */\n if (imgHeight) {\n svg.setAttribute('height', imgHeight)\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 imgStyle = el.getAttribute('style')\n /* istanbul ignore else */\n if (imgStyle) {\n svg.setAttribute('style', imgStyle)\n }\n\n svg.setAttribute('data-src', imgUrl)\n\n // Copy all the data elements to the svg.\n const imgData = [].filter.call(el.attributes, (at: Attr) => {\n return /^data-\\w[\\w-]*$/.test(at.name)\n })\n\n Array.prototype.forEach.call(imgData, (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 = referencingElements[\n b\n ].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[imgUrl]))\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[imgUrl] = true\n }\n\n // :WORKAROUND: IE doesn't evaluate