react-inlinesvg 4.0.3 → 4.0.4

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.
package/README.md CHANGED
@@ -69,7 +69,10 @@ A description for your SVG. It will override an existing `<desc>` tag.
69
69
  Custom options for the [request](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request).
70
70
 
71
71
  **innerRef** {React.Ref}
72
- Set a ref in SVGElement.
72
+ Set a ref in SVGElement.
73
+
74
+ >The SVG is processed and parsed so the ref won't be set on the initial render.
75
+ You can use the `onLoad` callback to get and use the ref instead.
73
76
 
74
77
  **loader** {node}
75
78
  A component to be shown while the SVG is loading.
package/dist/index.d.ts CHANGED
@@ -71,3 +71,4 @@ declare let cacheStore: CacheStore;
71
71
  declare function InlineSVG(props: Props): string | number | boolean | Iterable<React.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined;
72
72
 
73
73
  export { ErrorCallback, FetchError, LoadCallback, PlainObject, PreProcessorCallback, Props, State, Status, StorageItem, cacheStore, InlineSVG as default };
74
+ export = InlineSVG
package/dist/index.js CHANGED
@@ -64,7 +64,7 @@ function isSupportedEnvironment() {
64
64
  async function request(url, options) {
65
65
  const response = await fetch(url, options);
66
66
  const contentType = response.headers.get("content-type");
67
- const [fileType] = (contentType || "").split(/ ?; ?/);
67
+ const [fileType] = (contentType ?? "").split(/ ?; ?/);
68
68
  if (response.status > 299) {
69
69
  throw new Error("Not found");
70
70
  }
@@ -278,7 +278,7 @@ var ReactInlineSVG = class extends React.PureComponent {
278
278
  isCached: !!props.cacheRequests && cacheStore.isCached(props.src),
279
279
  status: STATUS.IDLE
280
280
  };
281
- this.hash = props.uniqueHash || randomString(8);
281
+ this.hash = props.uniqueHash ?? randomString(8);
282
282
  }
283
283
  componentDidMount() {
284
284
  this.isActive = true;
@@ -350,7 +350,7 @@ var ReactInlineSVG = class extends React.PureComponent {
350
350
  const svg = this.updateSVGAttributes(node);
351
351
  if (description) {
352
352
  const originalDesc = svg.querySelector("desc");
353
- if (originalDesc && originalDesc.parentNode) {
353
+ if (originalDesc?.parentNode) {
354
354
  originalDesc.parentNode.removeChild(originalDesc);
355
355
  }
356
356
  const descElement = document.createElementNS("http://www.w3.org/2000/svg", "desc");
@@ -359,7 +359,7 @@ var ReactInlineSVG = class extends React.PureComponent {
359
359
  }
360
360
  if (typeof title !== "undefined") {
361
361
  const originalTitle = svg.querySelector("title");
362
- if (originalTitle && originalTitle.parentNode) {
362
+ if (originalTitle?.parentNode) {
363
363
  originalTitle.parentNode.removeChild(originalTitle);
364
364
  }
365
365
  if (title) {
@@ -384,7 +384,7 @@ var ReactInlineSVG = class extends React.PureComponent {
384
384
  },
385
385
  async () => {
386
386
  const { cacheRequests, fetchOptions, src } = this.props;
387
- const dataURI = src.match(/^data:image\/svg[^,]*?(;base64)?,(.*)/u);
387
+ const dataURI = /^data:image\/svg[^,]*?(;base64)?,(.*)/u.exec(src);
388
388
  let inlineSrc;
389
389
  if (dataURI) {
390
390
  inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);
@@ -426,11 +426,11 @@ var ReactInlineSVG = class extends React.PureComponent {
426
426
  return node;
427
427
  }
428
428
  [...node.children].forEach((d) => {
429
- if (d.attributes && d.attributes.length) {
429
+ if (d.attributes?.length) {
430
430
  const attributes = Object.values(d.attributes).map((a) => {
431
431
  const attribute = a;
432
- const match = a.value.match(/url\((.*?)\)/);
433
- if (match && match[1]) {
432
+ const match = /url\((.*?)\)/.exec(a.value);
433
+ if (match?.[1]) {
434
434
  attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);
435
435
  }
436
436
  return attribute;
@@ -509,4 +509,10 @@ function InlineSVG(props) {
509
509
  0 && (module.exports = {
510
510
  cacheStore
511
511
  });
512
- //# sourceMappingURL=index.js.map
512
+ //# sourceMappingURL=index.js.map
513
+ // fix-cjs-exports
514
+ if (module.exports.default) {
515
+ Object.assign(module.exports.default, module.exports);
516
+ module.exports = module.exports.default;
517
+ delete module.exports.default;
518
+ }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/helpers.ts","../src/cache.ts"],"sourcesContent":["import * as React from 'react';\nimport convert from 'react-from-dom';\n\nimport CacheStore from './cache';\nimport { STATUS } from './config';\nimport { canUseDOM, isSupportedEnvironment, omit, randomString, request } from './helpers';\nimport { FetchError, Props, State, Status } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let cacheStore: CacheStore;\n\nclass ReactInlineSVG extends React.PureComponent<Props, State> {\n private readonly hash: string;\n private isActive = false;\n private isInitialized = false;\n\n public static defaultProps = {\n cacheRequests: true,\n uniquifyIDs: false,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n content: '',\n element: null,\n isCached: !!props.cacheRequests && cacheStore.isCached(props.src),\n status: STATUS.IDLE,\n };\n\n this.hash = props.uniqueHash || randomString(8);\n }\n\n public componentDidMount(): void {\n this.isActive = true;\n\n if (!canUseDOM() || this.isInitialized) {\n return;\n }\n\n const { status } = this.state;\n const { src } = this.props;\n\n try {\n /* istanbul ignore else */\n if (status === STATUS.IDLE) {\n /* istanbul ignore else */\n if (!isSupportedEnvironment()) {\n throw new Error('Browser does not support SVG');\n }\n\n /* istanbul ignore else */\n if (!src) {\n throw new Error('Missing src');\n }\n\n this.load();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n\n this.isInitialized = true;\n }\n\n public componentDidUpdate(previousProps: Props, previousState: State): void {\n if (!canUseDOM()) {\n return;\n }\n\n const { isCached, status } = this.state;\n const { onLoad, src } = this.props;\n\n if (previousState.status !== STATUS.READY && status === STATUS.READY) {\n /* istanbul ignore else */\n if (onLoad) {\n onLoad(src, isCached);\n }\n }\n\n if (previousProps.src !== src) {\n if (!src) {\n this.handleError(new Error('Missing src'));\n\n return;\n }\n\n this.load();\n }\n }\n\n public componentWillUnmount(): void {\n this.isActive = false;\n }\n\n private fetchContent = async () => {\n const { fetchOptions, src } = this.props;\n\n const content: string = await request(src, fetchOptions);\n\n this.handleLoad(content);\n };\n\n private getElement() {\n try {\n const node = this.getNode() as Node;\n const element = convert(node);\n\n if (!element || !React.isValidElement(element)) {\n throw new Error('Could not convert the src to a React element');\n }\n\n this.setState({\n element,\n status: STATUS.READY,\n });\n } catch (error: any) {\n this.handleError(new Error(error.message));\n }\n }\n\n private getNode() {\n const { description, title } = this.props;\n\n try {\n const svgText = this.processSVG();\n const node = convert(svgText, { nodeOnly: true });\n\n if (!node || !(node instanceof SVGSVGElement)) {\n throw new Error('Could not convert the src to a DOM Node');\n }\n\n const svg = this.updateSVGAttributes(node);\n\n if (description) {\n const originalDesc = svg.querySelector('desc');\n\n if (originalDesc && originalDesc.parentNode) {\n originalDesc.parentNode.removeChild(originalDesc);\n }\n\n const descElement = document.createElementNS('http://www.w3.org/2000/svg', 'desc');\n\n descElement.innerHTML = description;\n svg.prepend(descElement);\n }\n\n if (typeof title !== 'undefined') {\n const originalTitle = svg.querySelector('title');\n\n if (originalTitle && originalTitle.parentNode) {\n originalTitle.parentNode.removeChild(originalTitle);\n }\n\n if (title) {\n const titleElement = document.createElementNS('http://www.w3.org/2000/svg', 'title');\n\n titleElement.innerHTML = title;\n svg.prepend(titleElement);\n }\n }\n\n return svg;\n } catch (error: any) {\n return this.handleError(error);\n }\n }\n\n private handleError = (error: Error | FetchError) => {\n const { onError } = this.props;\n const status =\n error.message === 'Browser does not support SVG' ? STATUS.UNSUPPORTED : STATUS.FAILED;\n\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState({ status }, () => {\n /* istanbul ignore else */\n if (typeof onError === 'function') {\n onError(error);\n }\n });\n }\n };\n\n private handleLoad = (content: string, hasCache = false) => {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content,\n isCached: hasCache,\n status: STATUS.LOADED,\n },\n this.getElement,\n );\n }\n };\n\n private load() {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content: '',\n element: null,\n isCached: false,\n status: STATUS.LOADING,\n },\n async () => {\n const { cacheRequests, fetchOptions, src } = this.props;\n\n const dataURI = src.match(/^data:image\\/svg[^,]*?(;base64)?,(.*)/u);\n let inlineSrc;\n\n if (dataURI) {\n inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);\n } else if (src.includes('<svg')) {\n inlineSrc = src;\n }\n\n if (inlineSrc) {\n this.handleLoad(inlineSrc);\n\n return;\n }\n\n try {\n if (cacheRequests) {\n const content = await cacheStore.get(src, fetchOptions);\n\n this.handleLoad(content, true);\n } else {\n await this.fetchContent();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n },\n );\n }\n }\n\n private processSVG() {\n const { content } = this.state;\n const { preProcessor } = this.props;\n\n if (preProcessor) {\n return preProcessor(content);\n }\n\n return content;\n }\n\n private updateSVGAttributes(node: SVGSVGElement): SVGSVGElement {\n const { baseURL = '', uniquifyIDs } = this.props;\n const replaceableAttributes = ['id', 'href', 'xlink:href', 'xlink:role', 'xlink:arcrole'];\n const linkAttributes = ['href', 'xlink:href'];\n const isDataValue = (name: string, value: string) =>\n linkAttributes.includes(name) && (value ? !value.includes('#') : false);\n\n if (!uniquifyIDs) {\n return node;\n }\n\n [...node.children].forEach(d => {\n if (d.attributes && d.attributes.length) {\n const attributes = Object.values(d.attributes).map(a => {\n const attribute = a;\n const match = a.value.match(/url\\((.*?)\\)/);\n\n if (match && match[1]) {\n attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);\n }\n\n return attribute;\n });\n\n replaceableAttributes.forEach(r => {\n const attribute = attributes.find(a => a.name === r);\n\n if (attribute && !isDataValue(r, attribute.value)) {\n attribute.value = `${attribute.value}__${this.hash}`;\n }\n });\n }\n\n if (d.children.length) {\n return this.updateSVGAttributes(d as SVGSVGElement);\n }\n\n return d;\n });\n\n return node;\n }\n\n public render(): React.ReactNode {\n const { element, status } = this.state;\n const { children = null, innerRef, loader = null } = this.props;\n const elementProps = omit(\n this.props,\n 'baseURL',\n 'cacheRequests',\n 'children',\n 'description',\n 'fetchOptions',\n 'innerRef',\n 'loader',\n 'onError',\n 'onLoad',\n 'preProcessor',\n 'src',\n 'title',\n 'uniqueHash',\n 'uniquifyIDs',\n );\n\n if (!canUseDOM()) {\n return loader;\n }\n\n if (element) {\n return React.cloneElement(element as React.ReactElement, { ref: innerRef, ...elementProps });\n }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\n }\n}\n\nexport default function InlineSVG(props: Props) {\n if (!cacheStore) {\n cacheStore = new CacheStore();\n }\n\n const { loader } = props;\n const hasCallback = React.useRef(false);\n const [isReady, setReady] = React.useState(cacheStore.isReady);\n\n React.useEffect(() => {\n if (!hasCallback.current) {\n cacheStore.onReady(() => {\n setReady(true);\n });\n\n hasCallback.current = true;\n }\n }, []);\n\n if (!isReady) {\n return loader;\n }\n\n return <ReactInlineSVG {...props} />;\n}\n\nexport * from './types';\n","export const CACHE_NAME = 'react-inlinesvg';\nexport const CACHE_MAX_RETRIES = 10;\n\nexport const STATUS = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n FAILED: 'failed',\n READY: 'ready',\n UNSUPPORTED: 'unsupported',\n} as const;\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType || '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { CACHE_MAX_RETRIES, CACHE_NAME, STATUS } from './config';\nimport { canUseDOM, request, sleep } from './helpers';\nimport { StorageItem } from './types';\n\nexport default class CacheStore {\n private cacheApi: Cache | undefined;\n private readonly cacheStore: Map<string, StorageItem>;\n private readonly subscribers: Array<() => void> = [];\n public isReady = false;\n\n constructor() {\n this.cacheStore = new Map<string, StorageItem>();\n\n let cacheName = CACHE_NAME;\n let usePersistentCache = false;\n\n if (canUseDOM()) {\n cacheName = window.REACT_INLINESVG_CACHE_NAME ?? CACHE_NAME;\n usePersistentCache = !!window.REACT_INLINESVG_PERSISTENT_CACHE;\n }\n\n if (usePersistentCache) {\n caches.open(cacheName).then(cache => {\n this.cacheApi = cache;\n this.isReady = true;\n\n this.subscribers.forEach(callback => callback());\n });\n } else {\n this.isReady = true;\n }\n }\n\n public onReady(callback: () => void) {\n if (this.isReady) {\n callback();\n } else {\n this.subscribers.push(callback);\n }\n }\n\n public async get(url: string, fetchOptions?: RequestInit) {\n await (this.cacheApi\n ? this.fetchAndAddToPersistentCache(url, fetchOptions)\n : this.fetchAndAddToInternalCache(url, fetchOptions));\n\n return this.cacheStore.get(url)?.content ?? '';\n }\n\n public set(url: string, data: StorageItem) {\n this.cacheStore.set(url, data);\n }\n\n public isCached(url: string) {\n return this.cacheStore.get(url)?.status === STATUS.LOADED;\n }\n\n private async fetchAndAddToInternalCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToInternalCache(url, fetchOptions);\n });\n\n return;\n }\n\n if (!cache?.content) {\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n try {\n const content = await request(url, fetchOptions);\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n }\n\n private async fetchAndAddToPersistentCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADED) {\n return;\n }\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToPersistentCache(url, fetchOptions);\n });\n\n return;\n }\n\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n const data = await this.cacheApi?.match(url);\n\n if (data) {\n const content = await data.text();\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n\n return;\n }\n\n try {\n await this.cacheApi?.add(new Request(url, fetchOptions));\n\n const response = await this.cacheApi?.match(url);\n const content = (await response?.text()) ?? '';\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n\n private async handleLoading(url: string, callback: () => Promise<void>) {\n let retryCount = 0;\n\n // eslint-disable-next-line no-await-in-loop\n while (this.cacheStore.get(url)?.status === STATUS.LOADING && retryCount < CACHE_MAX_RETRIES) {\n // eslint-disable-next-line no-await-in-loop\n await sleep(0.1);\n retryCount += 1;\n }\n\n if (retryCount >= CACHE_MAX_RETRIES) {\n await callback();\n }\n }\n\n public keys(): Array<string> {\n return [...this.cacheStore.keys()];\n }\n\n public data(): Array<Record<string, StorageItem>> {\n return [...this.cacheStore.entries()].map(([key, value]) => ({ [key]: value }));\n }\n\n public async delete(url: string) {\n if (this.cacheApi) {\n await this.cacheApi.delete(url);\n }\n\n this.cacheStore.delete(url);\n }\n\n public async clear() {\n if (this.cacheApi) {\n const keys = await this.cacheApi.keys();\n\n for (const key of keys) {\n // eslint-disable-next-line no-await-in-loop\n await this.cacheApi.delete(key);\n }\n }\n\n this.cacheStore.clear();\n }\n}\n"],"mappings":"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","names":["convert"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/helpers.ts","../src/cache.ts"],"sourcesContent":["import * as React from 'react';\nimport convert from 'react-from-dom';\n\nimport CacheStore from './cache';\nimport { STATUS } from './config';\nimport { canUseDOM, isSupportedEnvironment, omit, randomString, request } from './helpers';\nimport { FetchError, Props, State, Status } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let cacheStore: CacheStore;\n\nclass ReactInlineSVG extends React.PureComponent<Props, State> {\n private readonly hash: string;\n private isActive = false;\n private isInitialized = false;\n\n public static defaultProps = {\n cacheRequests: true,\n uniquifyIDs: false,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n content: '',\n element: null,\n isCached: !!props.cacheRequests && cacheStore.isCached(props.src),\n status: STATUS.IDLE,\n };\n\n this.hash = props.uniqueHash ?? randomString(8);\n }\n\n public componentDidMount(): void {\n this.isActive = true;\n\n if (!canUseDOM() || this.isInitialized) {\n return;\n }\n\n const { status } = this.state;\n const { src } = this.props;\n\n try {\n /* istanbul ignore else */\n if (status === STATUS.IDLE) {\n /* istanbul ignore else */\n if (!isSupportedEnvironment()) {\n throw new Error('Browser does not support SVG');\n }\n\n /* istanbul ignore else */\n if (!src) {\n throw new Error('Missing src');\n }\n\n this.load();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n\n this.isInitialized = true;\n }\n\n public componentDidUpdate(previousProps: Props, previousState: State): void {\n if (!canUseDOM()) {\n return;\n }\n\n const { isCached, status } = this.state;\n const { onLoad, src } = this.props;\n\n if (previousState.status !== STATUS.READY && status === STATUS.READY) {\n /* istanbul ignore else */\n if (onLoad) {\n onLoad(src, isCached);\n }\n }\n\n if (previousProps.src !== src) {\n if (!src) {\n this.handleError(new Error('Missing src'));\n\n return;\n }\n\n this.load();\n }\n }\n\n public componentWillUnmount(): void {\n this.isActive = false;\n }\n\n private fetchContent = async () => {\n const { fetchOptions, src } = this.props;\n\n const content: string = await request(src, fetchOptions);\n\n this.handleLoad(content);\n };\n\n private getElement() {\n try {\n const node = this.getNode() as Node;\n const element = convert(node);\n\n if (!element || !React.isValidElement(element)) {\n throw new Error('Could not convert the src to a React element');\n }\n\n this.setState({\n element,\n status: STATUS.READY,\n });\n } catch (error: any) {\n this.handleError(new Error(error.message));\n }\n }\n\n private getNode() {\n const { description, title } = this.props;\n\n try {\n const svgText = this.processSVG();\n const node = convert(svgText, { nodeOnly: true });\n\n if (!node || !(node instanceof SVGSVGElement)) {\n throw new Error('Could not convert the src to a DOM Node');\n }\n\n const svg = this.updateSVGAttributes(node);\n\n if (description) {\n const originalDesc = svg.querySelector('desc');\n\n if (originalDesc?.parentNode) {\n originalDesc.parentNode.removeChild(originalDesc);\n }\n\n const descElement = document.createElementNS('http://www.w3.org/2000/svg', 'desc');\n\n descElement.innerHTML = description;\n svg.prepend(descElement);\n }\n\n if (typeof title !== 'undefined') {\n const originalTitle = svg.querySelector('title');\n\n if (originalTitle?.parentNode) {\n originalTitle.parentNode.removeChild(originalTitle);\n }\n\n if (title) {\n const titleElement = document.createElementNS('http://www.w3.org/2000/svg', 'title');\n\n titleElement.innerHTML = title;\n svg.prepend(titleElement);\n }\n }\n\n return svg;\n } catch (error: any) {\n return this.handleError(error);\n }\n }\n\n private handleError = (error: Error | FetchError) => {\n const { onError } = this.props;\n const status =\n error.message === 'Browser does not support SVG' ? STATUS.UNSUPPORTED : STATUS.FAILED;\n\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState({ status }, () => {\n /* istanbul ignore else */\n if (typeof onError === 'function') {\n onError(error);\n }\n });\n }\n };\n\n private handleLoad = (content: string, hasCache = false) => {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content,\n isCached: hasCache,\n status: STATUS.LOADED,\n },\n this.getElement,\n );\n }\n };\n\n private load() {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content: '',\n element: null,\n isCached: false,\n status: STATUS.LOADING,\n },\n async () => {\n const { cacheRequests, fetchOptions, src } = this.props;\n\n const dataURI = /^data:image\\/svg[^,]*?(;base64)?,(.*)/u.exec(src);\n let inlineSrc;\n\n if (dataURI) {\n inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);\n } else if (src.includes('<svg')) {\n inlineSrc = src;\n }\n\n if (inlineSrc) {\n this.handleLoad(inlineSrc);\n\n return;\n }\n\n try {\n if (cacheRequests) {\n const content = await cacheStore.get(src, fetchOptions);\n\n this.handleLoad(content, true);\n } else {\n await this.fetchContent();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n },\n );\n }\n }\n\n private processSVG() {\n const { content } = this.state;\n const { preProcessor } = this.props;\n\n if (preProcessor) {\n return preProcessor(content);\n }\n\n return content;\n }\n\n private updateSVGAttributes(node: SVGSVGElement): SVGSVGElement {\n const { baseURL = '', uniquifyIDs } = this.props;\n const replaceableAttributes = ['id', 'href', 'xlink:href', 'xlink:role', 'xlink:arcrole'];\n const linkAttributes = ['href', 'xlink:href'];\n const isDataValue = (name: string, value: string) =>\n linkAttributes.includes(name) && (value ? !value.includes('#') : false);\n\n if (!uniquifyIDs) {\n return node;\n }\n\n [...node.children].forEach(d => {\n if (d.attributes?.length) {\n const attributes = Object.values(d.attributes).map(a => {\n const attribute = a;\n const match = /url\\((.*?)\\)/.exec(a.value);\n\n if (match?.[1]) {\n attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);\n }\n\n return attribute;\n });\n\n replaceableAttributes.forEach(r => {\n const attribute = attributes.find(a => a.name === r);\n\n if (attribute && !isDataValue(r, attribute.value)) {\n attribute.value = `${attribute.value}__${this.hash}`;\n }\n });\n }\n\n if (d.children.length) {\n return this.updateSVGAttributes(d as SVGSVGElement);\n }\n\n return d;\n });\n\n return node;\n }\n\n public render(): React.ReactNode {\n const { element, status } = this.state;\n const { children = null, innerRef, loader = null } = this.props;\n const elementProps = omit(\n this.props,\n 'baseURL',\n 'cacheRequests',\n 'children',\n 'description',\n 'fetchOptions',\n 'innerRef',\n 'loader',\n 'onError',\n 'onLoad',\n 'preProcessor',\n 'src',\n 'title',\n 'uniqueHash',\n 'uniquifyIDs',\n );\n\n if (!canUseDOM()) {\n return loader;\n }\n\n if (element) {\n return React.cloneElement(element as React.ReactElement, { ref: innerRef, ...elementProps });\n }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\n }\n}\n\nexport default function InlineSVG(props: Props) {\n if (!cacheStore) {\n cacheStore = new CacheStore();\n }\n\n const { loader } = props;\n const hasCallback = React.useRef(false);\n const [isReady, setReady] = React.useState(cacheStore.isReady);\n\n React.useEffect(() => {\n if (!hasCallback.current) {\n cacheStore.onReady(() => {\n setReady(true);\n });\n\n hasCallback.current = true;\n }\n }, []);\n\n if (!isReady) {\n return loader;\n }\n\n return <ReactInlineSVG {...props} />;\n}\n\nexport * from './types';\n","export const CACHE_NAME = 'react-inlinesvg';\nexport const CACHE_MAX_RETRIES = 10;\n\nexport const STATUS = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n FAILED: 'failed',\n READY: 'ready',\n UNSUPPORTED: 'unsupported',\n} as const;\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType ?? '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { CACHE_MAX_RETRIES, CACHE_NAME, STATUS } from './config';\nimport { canUseDOM, request, sleep } from './helpers';\nimport { StorageItem } from './types';\n\nexport default class CacheStore {\n private cacheApi: Cache | undefined;\n private readonly cacheStore: Map<string, StorageItem>;\n private readonly subscribers: Array<() => void> = [];\n public isReady = false;\n\n constructor() {\n this.cacheStore = new Map<string, StorageItem>();\n\n let cacheName = CACHE_NAME;\n let usePersistentCache = false;\n\n if (canUseDOM()) {\n cacheName = window.REACT_INLINESVG_CACHE_NAME ?? CACHE_NAME;\n usePersistentCache = !!window.REACT_INLINESVG_PERSISTENT_CACHE;\n }\n\n if (usePersistentCache) {\n caches.open(cacheName).then(cache => {\n this.cacheApi = cache;\n this.isReady = true;\n\n this.subscribers.forEach(callback => callback());\n });\n } else {\n this.isReady = true;\n }\n }\n\n public onReady(callback: () => void) {\n if (this.isReady) {\n callback();\n } else {\n this.subscribers.push(callback);\n }\n }\n\n public async get(url: string, fetchOptions?: RequestInit) {\n await (this.cacheApi\n ? this.fetchAndAddToPersistentCache(url, fetchOptions)\n : this.fetchAndAddToInternalCache(url, fetchOptions));\n\n return this.cacheStore.get(url)?.content ?? '';\n }\n\n public set(url: string, data: StorageItem) {\n this.cacheStore.set(url, data);\n }\n\n public isCached(url: string) {\n return this.cacheStore.get(url)?.status === STATUS.LOADED;\n }\n\n private async fetchAndAddToInternalCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToInternalCache(url, fetchOptions);\n });\n\n return;\n }\n\n if (!cache?.content) {\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n try {\n const content = await request(url, fetchOptions);\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n }\n\n private async fetchAndAddToPersistentCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADED) {\n return;\n }\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToPersistentCache(url, fetchOptions);\n });\n\n return;\n }\n\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n const data = await this.cacheApi?.match(url);\n\n if (data) {\n const content = await data.text();\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n\n return;\n }\n\n try {\n await this.cacheApi?.add(new Request(url, fetchOptions));\n\n const response = await this.cacheApi?.match(url);\n const content = (await response?.text()) ?? '';\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n\n private async handleLoading(url: string, callback: () => Promise<void>) {\n let retryCount = 0;\n\n // eslint-disable-next-line no-await-in-loop\n while (this.cacheStore.get(url)?.status === STATUS.LOADING && retryCount < CACHE_MAX_RETRIES) {\n // eslint-disable-next-line no-await-in-loop\n await sleep(0.1);\n retryCount += 1;\n }\n\n if (retryCount >= CACHE_MAX_RETRIES) {\n await callback();\n }\n }\n\n public keys(): Array<string> {\n return [...this.cacheStore.keys()];\n }\n\n public data(): Array<Record<string, StorageItem>> {\n return [...this.cacheStore.entries()].map(([key, value]) => ({ [key]: value }));\n }\n\n public async delete(url: string) {\n if (this.cacheApi) {\n await this.cacheApi.delete(url);\n }\n\n this.cacheStore.delete(url);\n }\n\n public async clear() {\n if (this.cacheApi) {\n const keys = await this.cacheApi.keys();\n\n for (const key of keys) {\n // eslint-disable-next-line no-await-in-loop\n await this.cacheApi.delete(key);\n }\n }\n\n this.cacheStore.clear();\n }\n}\n"],"mappings":"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","names":["convert"]}
package/dist/index.mjs CHANGED
@@ -31,7 +31,7 @@ function isSupportedEnvironment() {
31
31
  async function request(url, options) {
32
32
  const response = await fetch(url, options);
33
33
  const contentType = response.headers.get("content-type");
34
- const [fileType] = (contentType || "").split(/ ?; ?/);
34
+ const [fileType] = (contentType ?? "").split(/ ?; ?/);
35
35
  if (response.status > 299) {
36
36
  throw new Error("Not found");
37
37
  }
@@ -245,7 +245,7 @@ var ReactInlineSVG = class extends React.PureComponent {
245
245
  isCached: !!props.cacheRequests && cacheStore.isCached(props.src),
246
246
  status: STATUS.IDLE
247
247
  };
248
- this.hash = props.uniqueHash || randomString(8);
248
+ this.hash = props.uniqueHash ?? randomString(8);
249
249
  }
250
250
  componentDidMount() {
251
251
  this.isActive = true;
@@ -317,7 +317,7 @@ var ReactInlineSVG = class extends React.PureComponent {
317
317
  const svg = this.updateSVGAttributes(node);
318
318
  if (description) {
319
319
  const originalDesc = svg.querySelector("desc");
320
- if (originalDesc && originalDesc.parentNode) {
320
+ if (originalDesc?.parentNode) {
321
321
  originalDesc.parentNode.removeChild(originalDesc);
322
322
  }
323
323
  const descElement = document.createElementNS("http://www.w3.org/2000/svg", "desc");
@@ -326,7 +326,7 @@ var ReactInlineSVG = class extends React.PureComponent {
326
326
  }
327
327
  if (typeof title !== "undefined") {
328
328
  const originalTitle = svg.querySelector("title");
329
- if (originalTitle && originalTitle.parentNode) {
329
+ if (originalTitle?.parentNode) {
330
330
  originalTitle.parentNode.removeChild(originalTitle);
331
331
  }
332
332
  if (title) {
@@ -351,7 +351,7 @@ var ReactInlineSVG = class extends React.PureComponent {
351
351
  },
352
352
  async () => {
353
353
  const { cacheRequests, fetchOptions, src } = this.props;
354
- const dataURI = src.match(/^data:image\/svg[^,]*?(;base64)?,(.*)/u);
354
+ const dataURI = /^data:image\/svg[^,]*?(;base64)?,(.*)/u.exec(src);
355
355
  let inlineSrc;
356
356
  if (dataURI) {
357
357
  inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);
@@ -393,11 +393,11 @@ var ReactInlineSVG = class extends React.PureComponent {
393
393
  return node;
394
394
  }
395
395
  [...node.children].forEach((d) => {
396
- if (d.attributes && d.attributes.length) {
396
+ if (d.attributes?.length) {
397
397
  const attributes = Object.values(d.attributes).map((a) => {
398
398
  const attribute = a;
399
- const match = a.value.match(/url\((.*?)\)/);
400
- if (match && match[1]) {
399
+ const match = /url\((.*?)\)/.exec(a.value);
400
+ if (match?.[1]) {
401
401
  attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);
402
402
  }
403
403
  return attribute;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/helpers.ts","../src/cache.ts"],"sourcesContent":["import * as React from 'react';\nimport convert from 'react-from-dom';\n\nimport CacheStore from './cache';\nimport { STATUS } from './config';\nimport { canUseDOM, isSupportedEnvironment, omit, randomString, request } from './helpers';\nimport { FetchError, Props, State, Status } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let cacheStore: CacheStore;\n\nclass ReactInlineSVG extends React.PureComponent<Props, State> {\n private readonly hash: string;\n private isActive = false;\n private isInitialized = false;\n\n public static defaultProps = {\n cacheRequests: true,\n uniquifyIDs: false,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n content: '',\n element: null,\n isCached: !!props.cacheRequests && cacheStore.isCached(props.src),\n status: STATUS.IDLE,\n };\n\n this.hash = props.uniqueHash || randomString(8);\n }\n\n public componentDidMount(): void {\n this.isActive = true;\n\n if (!canUseDOM() || this.isInitialized) {\n return;\n }\n\n const { status } = this.state;\n const { src } = this.props;\n\n try {\n /* istanbul ignore else */\n if (status === STATUS.IDLE) {\n /* istanbul ignore else */\n if (!isSupportedEnvironment()) {\n throw new Error('Browser does not support SVG');\n }\n\n /* istanbul ignore else */\n if (!src) {\n throw new Error('Missing src');\n }\n\n this.load();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n\n this.isInitialized = true;\n }\n\n public componentDidUpdate(previousProps: Props, previousState: State): void {\n if (!canUseDOM()) {\n return;\n }\n\n const { isCached, status } = this.state;\n const { onLoad, src } = this.props;\n\n if (previousState.status !== STATUS.READY && status === STATUS.READY) {\n /* istanbul ignore else */\n if (onLoad) {\n onLoad(src, isCached);\n }\n }\n\n if (previousProps.src !== src) {\n if (!src) {\n this.handleError(new Error('Missing src'));\n\n return;\n }\n\n this.load();\n }\n }\n\n public componentWillUnmount(): void {\n this.isActive = false;\n }\n\n private fetchContent = async () => {\n const { fetchOptions, src } = this.props;\n\n const content: string = await request(src, fetchOptions);\n\n this.handleLoad(content);\n };\n\n private getElement() {\n try {\n const node = this.getNode() as Node;\n const element = convert(node);\n\n if (!element || !React.isValidElement(element)) {\n throw new Error('Could not convert the src to a React element');\n }\n\n this.setState({\n element,\n status: STATUS.READY,\n });\n } catch (error: any) {\n this.handleError(new Error(error.message));\n }\n }\n\n private getNode() {\n const { description, title } = this.props;\n\n try {\n const svgText = this.processSVG();\n const node = convert(svgText, { nodeOnly: true });\n\n if (!node || !(node instanceof SVGSVGElement)) {\n throw new Error('Could not convert the src to a DOM Node');\n }\n\n const svg = this.updateSVGAttributes(node);\n\n if (description) {\n const originalDesc = svg.querySelector('desc');\n\n if (originalDesc && originalDesc.parentNode) {\n originalDesc.parentNode.removeChild(originalDesc);\n }\n\n const descElement = document.createElementNS('http://www.w3.org/2000/svg', 'desc');\n\n descElement.innerHTML = description;\n svg.prepend(descElement);\n }\n\n if (typeof title !== 'undefined') {\n const originalTitle = svg.querySelector('title');\n\n if (originalTitle && originalTitle.parentNode) {\n originalTitle.parentNode.removeChild(originalTitle);\n }\n\n if (title) {\n const titleElement = document.createElementNS('http://www.w3.org/2000/svg', 'title');\n\n titleElement.innerHTML = title;\n svg.prepend(titleElement);\n }\n }\n\n return svg;\n } catch (error: any) {\n return this.handleError(error);\n }\n }\n\n private handleError = (error: Error | FetchError) => {\n const { onError } = this.props;\n const status =\n error.message === 'Browser does not support SVG' ? STATUS.UNSUPPORTED : STATUS.FAILED;\n\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState({ status }, () => {\n /* istanbul ignore else */\n if (typeof onError === 'function') {\n onError(error);\n }\n });\n }\n };\n\n private handleLoad = (content: string, hasCache = false) => {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content,\n isCached: hasCache,\n status: STATUS.LOADED,\n },\n this.getElement,\n );\n }\n };\n\n private load() {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content: '',\n element: null,\n isCached: false,\n status: STATUS.LOADING,\n },\n async () => {\n const { cacheRequests, fetchOptions, src } = this.props;\n\n const dataURI = src.match(/^data:image\\/svg[^,]*?(;base64)?,(.*)/u);\n let inlineSrc;\n\n if (dataURI) {\n inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);\n } else if (src.includes('<svg')) {\n inlineSrc = src;\n }\n\n if (inlineSrc) {\n this.handleLoad(inlineSrc);\n\n return;\n }\n\n try {\n if (cacheRequests) {\n const content = await cacheStore.get(src, fetchOptions);\n\n this.handleLoad(content, true);\n } else {\n await this.fetchContent();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n },\n );\n }\n }\n\n private processSVG() {\n const { content } = this.state;\n const { preProcessor } = this.props;\n\n if (preProcessor) {\n return preProcessor(content);\n }\n\n return content;\n }\n\n private updateSVGAttributes(node: SVGSVGElement): SVGSVGElement {\n const { baseURL = '', uniquifyIDs } = this.props;\n const replaceableAttributes = ['id', 'href', 'xlink:href', 'xlink:role', 'xlink:arcrole'];\n const linkAttributes = ['href', 'xlink:href'];\n const isDataValue = (name: string, value: string) =>\n linkAttributes.includes(name) && (value ? !value.includes('#') : false);\n\n if (!uniquifyIDs) {\n return node;\n }\n\n [...node.children].forEach(d => {\n if (d.attributes && d.attributes.length) {\n const attributes = Object.values(d.attributes).map(a => {\n const attribute = a;\n const match = a.value.match(/url\\((.*?)\\)/);\n\n if (match && match[1]) {\n attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);\n }\n\n return attribute;\n });\n\n replaceableAttributes.forEach(r => {\n const attribute = attributes.find(a => a.name === r);\n\n if (attribute && !isDataValue(r, attribute.value)) {\n attribute.value = `${attribute.value}__${this.hash}`;\n }\n });\n }\n\n if (d.children.length) {\n return this.updateSVGAttributes(d as SVGSVGElement);\n }\n\n return d;\n });\n\n return node;\n }\n\n public render(): React.ReactNode {\n const { element, status } = this.state;\n const { children = null, innerRef, loader = null } = this.props;\n const elementProps = omit(\n this.props,\n 'baseURL',\n 'cacheRequests',\n 'children',\n 'description',\n 'fetchOptions',\n 'innerRef',\n 'loader',\n 'onError',\n 'onLoad',\n 'preProcessor',\n 'src',\n 'title',\n 'uniqueHash',\n 'uniquifyIDs',\n );\n\n if (!canUseDOM()) {\n return loader;\n }\n\n if (element) {\n return React.cloneElement(element as React.ReactElement, { ref: innerRef, ...elementProps });\n }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\n }\n}\n\nexport default function InlineSVG(props: Props) {\n if (!cacheStore) {\n cacheStore = new CacheStore();\n }\n\n const { loader } = props;\n const hasCallback = React.useRef(false);\n const [isReady, setReady] = React.useState(cacheStore.isReady);\n\n React.useEffect(() => {\n if (!hasCallback.current) {\n cacheStore.onReady(() => {\n setReady(true);\n });\n\n hasCallback.current = true;\n }\n }, []);\n\n if (!isReady) {\n return loader;\n }\n\n return <ReactInlineSVG {...props} />;\n}\n\nexport * from './types';\n","export const CACHE_NAME = 'react-inlinesvg';\nexport const CACHE_MAX_RETRIES = 10;\n\nexport const STATUS = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n FAILED: 'failed',\n READY: 'ready',\n UNSUPPORTED: 'unsupported',\n} as const;\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType || '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { CACHE_MAX_RETRIES, CACHE_NAME, STATUS } from './config';\nimport { canUseDOM, request, sleep } from './helpers';\nimport { StorageItem } from './types';\n\nexport default class CacheStore {\n private cacheApi: Cache | undefined;\n private readonly cacheStore: Map<string, StorageItem>;\n private readonly subscribers: Array<() => void> = [];\n public isReady = false;\n\n constructor() {\n this.cacheStore = new Map<string, StorageItem>();\n\n let cacheName = CACHE_NAME;\n let usePersistentCache = false;\n\n if (canUseDOM()) {\n cacheName = window.REACT_INLINESVG_CACHE_NAME ?? CACHE_NAME;\n usePersistentCache = !!window.REACT_INLINESVG_PERSISTENT_CACHE;\n }\n\n if (usePersistentCache) {\n caches.open(cacheName).then(cache => {\n this.cacheApi = cache;\n this.isReady = true;\n\n this.subscribers.forEach(callback => callback());\n });\n } else {\n this.isReady = true;\n }\n }\n\n public onReady(callback: () => void) {\n if (this.isReady) {\n callback();\n } else {\n this.subscribers.push(callback);\n }\n }\n\n public async get(url: string, fetchOptions?: RequestInit) {\n await (this.cacheApi\n ? this.fetchAndAddToPersistentCache(url, fetchOptions)\n : this.fetchAndAddToInternalCache(url, fetchOptions));\n\n return this.cacheStore.get(url)?.content ?? '';\n }\n\n public set(url: string, data: StorageItem) {\n this.cacheStore.set(url, data);\n }\n\n public isCached(url: string) {\n return this.cacheStore.get(url)?.status === STATUS.LOADED;\n }\n\n private async fetchAndAddToInternalCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToInternalCache(url, fetchOptions);\n });\n\n return;\n }\n\n if (!cache?.content) {\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n try {\n const content = await request(url, fetchOptions);\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n }\n\n private async fetchAndAddToPersistentCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADED) {\n return;\n }\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToPersistentCache(url, fetchOptions);\n });\n\n return;\n }\n\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n const data = await this.cacheApi?.match(url);\n\n if (data) {\n const content = await data.text();\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n\n return;\n }\n\n try {\n await this.cacheApi?.add(new Request(url, fetchOptions));\n\n const response = await this.cacheApi?.match(url);\n const content = (await response?.text()) ?? '';\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n\n private async handleLoading(url: string, callback: () => Promise<void>) {\n let retryCount = 0;\n\n // eslint-disable-next-line no-await-in-loop\n while (this.cacheStore.get(url)?.status === STATUS.LOADING && retryCount < CACHE_MAX_RETRIES) {\n // eslint-disable-next-line no-await-in-loop\n await sleep(0.1);\n retryCount += 1;\n }\n\n if (retryCount >= CACHE_MAX_RETRIES) {\n await callback();\n }\n }\n\n public keys(): Array<string> {\n return [...this.cacheStore.keys()];\n }\n\n public data(): Array<Record<string, StorageItem>> {\n return [...this.cacheStore.entries()].map(([key, value]) => ({ [key]: value }));\n }\n\n public async delete(url: string) {\n if (this.cacheApi) {\n await this.cacheApi.delete(url);\n }\n\n this.cacheStore.delete(url);\n }\n\n public async clear() {\n if (this.cacheApi) {\n const keys = await this.cacheApi.keys();\n\n for (const key of keys) {\n // eslint-disable-next-line no-await-in-loop\n await this.cacheApi.delete(key);\n }\n }\n\n this.cacheStore.clear();\n }\n}\n"],"mappings":";;;;;;;;AAAA,YAAY,WAAW;AACvB,OAAO,aAAa;;;ACDb,IAAM,aAAa;AACnB,IAAM,oBAAoB;AAE1B,IAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AACf;;;ACRO,SAAS,YAAqB;AACnC,SAAO,CAAC,EAAE,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,SAAS;AAChF;AAEO,SAAS,yBAAkC;AAChD,SAAO,kBAAkB,KAAK,OAAO,WAAW,eAAe,WAAW;AAC5E;AAEA,eAAsB,QAAQ,KAAa,SAAuB;AAChE,QAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AACzC,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAM,CAAC,QAAQ,KAAK,eAAe,IAAI,MAAM,OAAO;AAEpD,MAAI,SAAS,SAAS,KAAK;AACzB,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AAEA,MAAI,CAAC,CAAC,iBAAiB,YAAY,EAAE,KAAK,OAAK,SAAS,SAAS,CAAC,CAAC,GAAG;AACpE,UAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAAA,EACzD;AAEA,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,MAAM,UAAU,GAAG;AACjC,SAAO,IAAI,QAAQ,aAAW;AAC5B,eAAW,SAAS,UAAU,GAAI;AAAA,EACpC,CAAC;AACH;AAEO,SAAS,oBAA6B;AAE3C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,SAAS,cAAc,KAAK;AAExC,MAAI,YAAY;AAChB,QAAM,MAAM,IAAI;AAEhB,SAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB;AACvC;AAEA,SAAS,gBAAgB,WAAmB;AAC1C,SAAO,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU,MAAM,CAAC;AAC/D;AAEO,SAAS,aAAa,QAAwB;AACnD,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,YAAY,CAAC,GAAG,OAAO;AAE5D,MAAI,IAAI;AAER,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC3C,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAKO,SAAS,KACd,UACG,QACS;AACZ,QAAM,SAAc,CAAC;AAErB,aAAW,OAAO,OAAO;AAEvB,QAAI,CAAC,EAAE,eAAe,KAAK,OAAO,GAAG,GAAG;AACtC,UAAI,CAAC,OAAO,SAAS,GAAmB,GAAG;AACzC,eAAO,GAAG,IAAI,MAAM,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC/EA,IAAqB,aAArB,MAAgC;AAAA,EAM9B,cAAc;AALd,wBAAQ;AACR,wBAAiB;AACjB,wBAAiB,eAAiC,CAAC;AACnD,wBAAO,WAAU;AAGf,SAAK,aAAa,oBAAI,IAAyB;AAE/C,QAAI,YAAY;AAChB,QAAI,qBAAqB;AAEzB,QAAI,UAAU,GAAG;AACf,kBAAY,OAAO,8BAA8B;AACjD,2BAAqB,CAAC,CAAC,OAAO;AAAA,IAChC;AAEA,QAAI,oBAAoB;AACtB,aAAO,KAAK,SAAS,EAAE,KAAK,WAAS;AACnC,aAAK,WAAW;AAChB,aAAK,UAAU;AAEf,aAAK,YAAY,QAAQ,cAAY,SAAS,CAAC;AAAA,MACjD,CAAC;AAAA,IACH,OAAO;AACL,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEO,QAAQ,UAAsB;AACnC,QAAI,KAAK,SAAS;AAChB,eAAS;AAAA,IACX,OAAO;AACL,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAa,IAAI,KAAa,cAA4B;AACxD,WAAO,KAAK,WACR,KAAK,6BAA6B,KAAK,YAAY,IACnD,KAAK,2BAA2B,KAAK,YAAY;AAErD,WAAO,KAAK,WAAW,IAAI,GAAG,GAAG,WAAW;AAAA,EAC9C;AAAA,EAEO,IAAI,KAAa,MAAmB;AACzC,SAAK,WAAW,IAAI,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEO,SAAS,KAAa;AAC3B,WAAO,KAAK,WAAW,IAAI,GAAG,GAAG,WAAW,OAAO;AAAA,EACrD;AAAA,EAEA,MAAc,2BAA2B,KAAa,cAA4B;AAChF,UAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AAErC,QAAI,OAAO,WAAW,OAAO,SAAS;AACpC,YAAM,KAAK,cAAc,KAAK,YAAY;AACxC,aAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,KAAK,CAAC;AAC7D,cAAM,KAAK,2BAA2B,KAAK,YAAY;AAAA,MACzD,CAAC;AAED;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,WAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,QAAQ,CAAC;AAEhE,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,KAAK,YAAY;AAE/C,aAAK,WAAW,IAAI,KAAK,EAAE,SAAS,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC7D,SAAS,OAAY;AACnB,aAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,OAAO,CAAC;AAC/D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,6BAA6B,KAAa,cAA4B;AAClF,UAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AAErC,QAAI,OAAO,WAAW,OAAO,QAAQ;AACnC;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,OAAO,SAAS;AACpC,YAAM,KAAK,cAAc,KAAK,YAAY;AACxC,aAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,KAAK,CAAC;AAC7D,cAAM,KAAK,6BAA6B,KAAK,YAAY;AAAA,MAC3D,CAAC;AAED;AAAA,IACF;AAEA,SAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,QAAQ,CAAC;AAEhE,UAAM,OAAO,MAAM,KAAK,UAAU,MAAM,GAAG;AAE3C,QAAI,MAAM;AACR,YAAM,UAAU,MAAM,KAAK,KAAK;AAEhC,WAAK,WAAW,IAAI,KAAK,EAAE,SAAS,QAAQ,OAAO,OAAO,CAAC;AAE3D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,UAAU,IAAI,IAAI,QAAQ,KAAK,YAAY,CAAC;AAEvD,YAAM,WAAW,MAAM,KAAK,UAAU,MAAM,GAAG;AAC/C,YAAM,UAAW,MAAM,UAAU,KAAK,KAAM;AAE5C,WAAK,WAAW,IAAI,KAAK,EAAE,SAAS,QAAQ,OAAO,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAY;AACnB,WAAK,WAAW,IAAI,KAAK,EAAE,SAAS,IAAI,QAAQ,OAAO,OAAO,CAAC;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,KAAa,UAA+B;AACtE,QAAI,aAAa;AAGjB,WAAO,KAAK,WAAW,IAAI,GAAG,GAAG,WAAW,OAAO,WAAW,aAAa,mBAAmB;AAE5F,YAAM,MAAM,GAAG;AACf,oBAAc;AAAA,IAChB;AAEA,QAAI,cAAc,mBAAmB;AACnC,YAAM,SAAS;AAAA,IACjB;AAAA,EACF;AAAA,EAEO,OAAsB;AAC3B,WAAO,CAAC,GAAG,KAAK,WAAW,KAAK,CAAC;AAAA,EACnC;AAAA,EAEO,OAA2C;AAChD,WAAO,CAAC,GAAG,KAAK,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE;AAAA,EAChF;AAAA,EAEA,MAAa,OAAO,KAAa;AAC/B,QAAI,KAAK,UAAU;AACjB,YAAM,KAAK,SAAS,OAAO,GAAG;AAAA,IAChC;AAEA,SAAK,WAAW,OAAO,GAAG;AAAA,EAC5B;AAAA,EAEA,MAAa,QAAQ;AACnB,QAAI,KAAK,UAAU;AACjB,YAAM,OAAO,MAAM,KAAK,SAAS,KAAK;AAEtC,iBAAW,OAAO,MAAM;AAEtB,cAAM,KAAK,SAAS,OAAO,GAAG;AAAA,MAChC;AAAA,IACF;AAEA,SAAK,WAAW,MAAM;AAAA,EACxB;AACF;;;AH8LS;AA5VF,IAAI;AAEX,IAAM,iBAAN,cAAmC,oBAA4B;AAAA,EAU7D,YAAY,OAAc;AACxB,UAAM,KAAK;AAVb,wBAAiB;AACjB,wBAAQ,YAAW;AACnB,wBAAQ,iBAAgB;AAkFxB,wBAAQ,gBAAe,YAAY;AACjC,YAAM,EAAE,cAAc,IAAI,IAAI,KAAK;AAEnC,YAAM,UAAkB,MAAM,QAAQ,KAAK,YAAY;AAEvD,WAAK,WAAW,OAAO;AAAA,IACzB;AAmEA,wBAAQ,eAAc,CAAC,UAA8B;AACnD,YAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,YAAM,SACJ,MAAM,YAAY,iCAAiC,OAAO,cAAc,OAAO;AAGjF,UAAI,KAAK,UAAU;AACjB,aAAK,SAAS,EAAE,OAAO,GAAG,MAAM;AAE9B,cAAI,OAAO,YAAY,YAAY;AACjC,oBAAQ,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,wBAAQ,cAAa,CAAC,SAAiB,WAAW,UAAU;AAE1D,UAAI,KAAK,UAAU;AACjB,aAAK;AAAA,UACH;AAAA,YACE;AAAA,YACA,UAAU;AAAA,YACV,QAAQ,OAAO;AAAA,UACjB;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AA7KE,SAAK,QAAQ;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU,CAAC,CAAC,MAAM,iBAAiB,WAAW,SAAS,MAAM,GAAG;AAAA,MAChE,QAAQ,OAAO;AAAA,IACjB;AAEA,SAAK,OAAO,MAAM,cAAc,aAAa,CAAC;AAAA,EAChD;AAAA,EAEO,oBAA0B;AAC/B,SAAK,WAAW;AAEhB,QAAI,CAAC,UAAU,KAAK,KAAK,eAAe;AACtC;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,EAAE,IAAI,IAAI,KAAK;AAErB,QAAI;AAEF,UAAI,WAAW,OAAO,MAAM;AAE1B,YAAI,CAAC,uBAAuB,GAAG;AAC7B,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAGA,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,MAAM,aAAa;AAAA,QAC/B;AAEA,aAAK,KAAK;AAAA,MACZ;AAAA,IACF,SAAS,OAAY;AACnB,WAAK,YAAY,KAAK;AAAA,IACxB;AAEA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEO,mBAAmB,eAAsB,eAA4B;AAC1E,QAAI,CAAC,UAAU,GAAG;AAChB;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,OAAO,IAAI,KAAK;AAClC,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK;AAE7B,QAAI,cAAc,WAAW,OAAO,SAAS,WAAW,OAAO,OAAO;AAEpE,UAAI,QAAQ;AACV,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ,KAAK;AAC7B,UAAI,CAAC,KAAK;AACR,aAAK,YAAY,IAAI,MAAM,aAAa,CAAC;AAEzC;AAAA,MACF;AAEA,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEO,uBAA6B;AAClC,SAAK,WAAW;AAAA,EAClB;AAAA,EAUQ,aAAa;AACnB,QAAI;AACF,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,UAAU,QAAQ,IAAI;AAE5B,UAAI,CAAC,WAAW,CAAO,qBAAe,OAAO,GAAG;AAC9C,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAEA,WAAK,SAAS;AAAA,QACZ;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAY;AACnB,WAAK,YAAY,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,UAAU;AAChB,UAAM,EAAE,aAAa,MAAM,IAAI,KAAK;AAEpC,QAAI;AACF,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,OAAO,QAAQ,SAAS,EAAE,UAAU,KAAK,CAAC;AAEhD,UAAI,CAAC,QAAQ,EAAE,gBAAgB,gBAAgB;AAC7C,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAEA,YAAM,MAAM,KAAK,oBAAoB,IAAI;AAEzC,UAAI,aAAa;AACf,cAAM,eAAe,IAAI,cAAc,MAAM;AAE7C,YAAI,gBAAgB,aAAa,YAAY;AAC3C,uBAAa,WAAW,YAAY,YAAY;AAAA,QAClD;AAEA,cAAM,cAAc,SAAS,gBAAgB,8BAA8B,MAAM;AAEjF,oBAAY,YAAY;AACxB,YAAI,QAAQ,WAAW;AAAA,MACzB;AAEA,UAAI,OAAO,UAAU,aAAa;AAChC,cAAM,gBAAgB,IAAI,cAAc,OAAO;AAE/C,YAAI,iBAAiB,cAAc,YAAY;AAC7C,wBAAc,WAAW,YAAY,aAAa;AAAA,QACpD;AAEA,YAAI,OAAO;AACT,gBAAM,eAAe,SAAS,gBAAgB,8BAA8B,OAAO;AAEnF,uBAAa,YAAY;AACzB,cAAI,QAAQ,YAAY;AAAA,QAC1B;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,aAAO,KAAK,YAAY,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAgCQ,OAAO;AAEb,QAAI,KAAK,UAAU;AACjB,WAAK;AAAA,QACH;AAAA,UACE,SAAS;AAAA,UACT,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,QACjB;AAAA,QACA,YAAY;AACV,gBAAM,EAAE,eAAe,cAAc,IAAI,IAAI,KAAK;AAElD,gBAAM,UAAU,IAAI,MAAM,wCAAwC;AAClE,cAAI;AAEJ,cAAI,SAAS;AACX,wBAAY,QAAQ,CAAC,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,IAAI,mBAAmB,QAAQ,CAAC,CAAC;AAAA,UAClF,WAAW,IAAI,SAAS,MAAM,GAAG;AAC/B,wBAAY;AAAA,UACd;AAEA,cAAI,WAAW;AACb,iBAAK,WAAW,SAAS;AAEzB;AAAA,UACF;AAEA,cAAI;AACF,gBAAI,eAAe;AACjB,oBAAM,UAAU,MAAM,WAAW,IAAI,KAAK,YAAY;AAEtD,mBAAK,WAAW,SAAS,IAAI;AAAA,YAC/B,OAAO;AACL,oBAAM,KAAK,aAAa;AAAA,YAC1B;AAAA,UACF,SAAS,OAAY;AACnB,iBAAK,YAAY,KAAK;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,aAAa,IAAI,KAAK;AAE9B,QAAI,cAAc;AAChB,aAAO,aAAa,OAAO;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,MAAoC;AAC9D,UAAM,EAAE,UAAU,IAAI,YAAY,IAAI,KAAK;AAC3C,UAAM,wBAAwB,CAAC,MAAM,QAAQ,cAAc,cAAc,eAAe;AACxF,UAAM,iBAAiB,CAAC,QAAQ,YAAY;AAC5C,UAAM,cAAc,CAAC,MAAc,UACjC,eAAe,SAAS,IAAI,MAAM,QAAQ,CAAC,MAAM,SAAS,GAAG,IAAI;AAEnE,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,KAAC,GAAG,KAAK,QAAQ,EAAE,QAAQ,OAAK;AAC9B,UAAI,EAAE,cAAc,EAAE,WAAW,QAAQ;AACvC,cAAM,aAAa,OAAO,OAAO,EAAE,UAAU,EAAE,IAAI,OAAK;AACtD,gBAAM,YAAY;AAClB,gBAAM,QAAQ,EAAE,MAAM,MAAM,cAAc;AAE1C,cAAI,SAAS,MAAM,CAAC,GAAG;AACrB,sBAAU,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,OAAO,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,GAAG;AAAA,UACxF;AAEA,iBAAO;AAAA,QACT,CAAC;AAED,8BAAsB,QAAQ,OAAK;AACjC,gBAAM,YAAY,WAAW,KAAK,OAAK,EAAE,SAAS,CAAC;AAEnD,cAAI,aAAa,CAAC,YAAY,GAAG,UAAU,KAAK,GAAG;AACjD,sBAAU,QAAQ,GAAG,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,EAAE,SAAS,QAAQ;AACrB,eAAO,KAAK,oBAAoB,CAAkB;AAAA,MACpD;AAEA,aAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEO,SAA0B;AAC/B,UAAM,EAAE,SAAS,OAAO,IAAI,KAAK;AACjC,UAAM,EAAE,WAAW,MAAM,UAAU,SAAS,KAAK,IAAI,KAAK;AAC1D,UAAM,eAAe;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,GAAG;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,SAAS;AACX,aAAa,mBAAa,SAA+B,EAAE,KAAK,UAAU,GAAG,aAAa,CAAC;AAAA,IAC7F;AAEA,QAAK,CAAC,OAAO,aAAa,OAAO,MAAM,EAAe,SAAS,MAAM,GAAG;AACtE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;AA5TE,cALI,gBAKU,gBAAe;AAAA,EAC3B,eAAe;AAAA,EACf,aAAa;AACf;AA2Ta,SAAR,UAA2B,OAAc;AAC9C,MAAI,CAAC,YAAY;AACf,iBAAa,IAAI,WAAW;AAAA,EAC9B;AAEA,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,cAAoB,aAAO,KAAK;AACtC,QAAM,CAAC,SAAS,QAAQ,IAAU,eAAS,WAAW,OAAO;AAE7D,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,YAAY,SAAS;AACxB,iBAAW,QAAQ,MAAM;AACvB,iBAAS,IAAI;AAAA,MACf,CAAC;AAED,kBAAY,UAAU;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,kBAAgB,GAAG,OAAO;AACpC;","names":[]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/helpers.ts","../src/cache.ts"],"sourcesContent":["import * as React from 'react';\nimport convert from 'react-from-dom';\n\nimport CacheStore from './cache';\nimport { STATUS } from './config';\nimport { canUseDOM, isSupportedEnvironment, omit, randomString, request } from './helpers';\nimport { FetchError, Props, State, Status } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let cacheStore: CacheStore;\n\nclass ReactInlineSVG extends React.PureComponent<Props, State> {\n private readonly hash: string;\n private isActive = false;\n private isInitialized = false;\n\n public static defaultProps = {\n cacheRequests: true,\n uniquifyIDs: false,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n content: '',\n element: null,\n isCached: !!props.cacheRequests && cacheStore.isCached(props.src),\n status: STATUS.IDLE,\n };\n\n this.hash = props.uniqueHash ?? randomString(8);\n }\n\n public componentDidMount(): void {\n this.isActive = true;\n\n if (!canUseDOM() || this.isInitialized) {\n return;\n }\n\n const { status } = this.state;\n const { src } = this.props;\n\n try {\n /* istanbul ignore else */\n if (status === STATUS.IDLE) {\n /* istanbul ignore else */\n if (!isSupportedEnvironment()) {\n throw new Error('Browser does not support SVG');\n }\n\n /* istanbul ignore else */\n if (!src) {\n throw new Error('Missing src');\n }\n\n this.load();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n\n this.isInitialized = true;\n }\n\n public componentDidUpdate(previousProps: Props, previousState: State): void {\n if (!canUseDOM()) {\n return;\n }\n\n const { isCached, status } = this.state;\n const { onLoad, src } = this.props;\n\n if (previousState.status !== STATUS.READY && status === STATUS.READY) {\n /* istanbul ignore else */\n if (onLoad) {\n onLoad(src, isCached);\n }\n }\n\n if (previousProps.src !== src) {\n if (!src) {\n this.handleError(new Error('Missing src'));\n\n return;\n }\n\n this.load();\n }\n }\n\n public componentWillUnmount(): void {\n this.isActive = false;\n }\n\n private fetchContent = async () => {\n const { fetchOptions, src } = this.props;\n\n const content: string = await request(src, fetchOptions);\n\n this.handleLoad(content);\n };\n\n private getElement() {\n try {\n const node = this.getNode() as Node;\n const element = convert(node);\n\n if (!element || !React.isValidElement(element)) {\n throw new Error('Could not convert the src to a React element');\n }\n\n this.setState({\n element,\n status: STATUS.READY,\n });\n } catch (error: any) {\n this.handleError(new Error(error.message));\n }\n }\n\n private getNode() {\n const { description, title } = this.props;\n\n try {\n const svgText = this.processSVG();\n const node = convert(svgText, { nodeOnly: true });\n\n if (!node || !(node instanceof SVGSVGElement)) {\n throw new Error('Could not convert the src to a DOM Node');\n }\n\n const svg = this.updateSVGAttributes(node);\n\n if (description) {\n const originalDesc = svg.querySelector('desc');\n\n if (originalDesc?.parentNode) {\n originalDesc.parentNode.removeChild(originalDesc);\n }\n\n const descElement = document.createElementNS('http://www.w3.org/2000/svg', 'desc');\n\n descElement.innerHTML = description;\n svg.prepend(descElement);\n }\n\n if (typeof title !== 'undefined') {\n const originalTitle = svg.querySelector('title');\n\n if (originalTitle?.parentNode) {\n originalTitle.parentNode.removeChild(originalTitle);\n }\n\n if (title) {\n const titleElement = document.createElementNS('http://www.w3.org/2000/svg', 'title');\n\n titleElement.innerHTML = title;\n svg.prepend(titleElement);\n }\n }\n\n return svg;\n } catch (error: any) {\n return this.handleError(error);\n }\n }\n\n private handleError = (error: Error | FetchError) => {\n const { onError } = this.props;\n const status =\n error.message === 'Browser does not support SVG' ? STATUS.UNSUPPORTED : STATUS.FAILED;\n\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState({ status }, () => {\n /* istanbul ignore else */\n if (typeof onError === 'function') {\n onError(error);\n }\n });\n }\n };\n\n private handleLoad = (content: string, hasCache = false) => {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content,\n isCached: hasCache,\n status: STATUS.LOADED,\n },\n this.getElement,\n );\n }\n };\n\n private load() {\n /* istanbul ignore else */\n if (this.isActive) {\n this.setState(\n {\n content: '',\n element: null,\n isCached: false,\n status: STATUS.LOADING,\n },\n async () => {\n const { cacheRequests, fetchOptions, src } = this.props;\n\n const dataURI = /^data:image\\/svg[^,]*?(;base64)?,(.*)/u.exec(src);\n let inlineSrc;\n\n if (dataURI) {\n inlineSrc = dataURI[1] ? window.atob(dataURI[2]) : decodeURIComponent(dataURI[2]);\n } else if (src.includes('<svg')) {\n inlineSrc = src;\n }\n\n if (inlineSrc) {\n this.handleLoad(inlineSrc);\n\n return;\n }\n\n try {\n if (cacheRequests) {\n const content = await cacheStore.get(src, fetchOptions);\n\n this.handleLoad(content, true);\n } else {\n await this.fetchContent();\n }\n } catch (error: any) {\n this.handleError(error);\n }\n },\n );\n }\n }\n\n private processSVG() {\n const { content } = this.state;\n const { preProcessor } = this.props;\n\n if (preProcessor) {\n return preProcessor(content);\n }\n\n return content;\n }\n\n private updateSVGAttributes(node: SVGSVGElement): SVGSVGElement {\n const { baseURL = '', uniquifyIDs } = this.props;\n const replaceableAttributes = ['id', 'href', 'xlink:href', 'xlink:role', 'xlink:arcrole'];\n const linkAttributes = ['href', 'xlink:href'];\n const isDataValue = (name: string, value: string) =>\n linkAttributes.includes(name) && (value ? !value.includes('#') : false);\n\n if (!uniquifyIDs) {\n return node;\n }\n\n [...node.children].forEach(d => {\n if (d.attributes?.length) {\n const attributes = Object.values(d.attributes).map(a => {\n const attribute = a;\n const match = /url\\((.*?)\\)/.exec(a.value);\n\n if (match?.[1]) {\n attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);\n }\n\n return attribute;\n });\n\n replaceableAttributes.forEach(r => {\n const attribute = attributes.find(a => a.name === r);\n\n if (attribute && !isDataValue(r, attribute.value)) {\n attribute.value = `${attribute.value}__${this.hash}`;\n }\n });\n }\n\n if (d.children.length) {\n return this.updateSVGAttributes(d as SVGSVGElement);\n }\n\n return d;\n });\n\n return node;\n }\n\n public render(): React.ReactNode {\n const { element, status } = this.state;\n const { children = null, innerRef, loader = null } = this.props;\n const elementProps = omit(\n this.props,\n 'baseURL',\n 'cacheRequests',\n 'children',\n 'description',\n 'fetchOptions',\n 'innerRef',\n 'loader',\n 'onError',\n 'onLoad',\n 'preProcessor',\n 'src',\n 'title',\n 'uniqueHash',\n 'uniquifyIDs',\n );\n\n if (!canUseDOM()) {\n return loader;\n }\n\n if (element) {\n return React.cloneElement(element as React.ReactElement, { ref: innerRef, ...elementProps });\n }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\n }\n}\n\nexport default function InlineSVG(props: Props) {\n if (!cacheStore) {\n cacheStore = new CacheStore();\n }\n\n const { loader } = props;\n const hasCallback = React.useRef(false);\n const [isReady, setReady] = React.useState(cacheStore.isReady);\n\n React.useEffect(() => {\n if (!hasCallback.current) {\n cacheStore.onReady(() => {\n setReady(true);\n });\n\n hasCallback.current = true;\n }\n }, []);\n\n if (!isReady) {\n return loader;\n }\n\n return <ReactInlineSVG {...props} />;\n}\n\nexport * from './types';\n","export const CACHE_NAME = 'react-inlinesvg';\nexport const CACHE_MAX_RETRIES = 10;\n\nexport const STATUS = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n FAILED: 'failed',\n READY: 'ready',\n UNSUPPORTED: 'unsupported',\n} as const;\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType ?? '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { CACHE_MAX_RETRIES, CACHE_NAME, STATUS } from './config';\nimport { canUseDOM, request, sleep } from './helpers';\nimport { StorageItem } from './types';\n\nexport default class CacheStore {\n private cacheApi: Cache | undefined;\n private readonly cacheStore: Map<string, StorageItem>;\n private readonly subscribers: Array<() => void> = [];\n public isReady = false;\n\n constructor() {\n this.cacheStore = new Map<string, StorageItem>();\n\n let cacheName = CACHE_NAME;\n let usePersistentCache = false;\n\n if (canUseDOM()) {\n cacheName = window.REACT_INLINESVG_CACHE_NAME ?? CACHE_NAME;\n usePersistentCache = !!window.REACT_INLINESVG_PERSISTENT_CACHE;\n }\n\n if (usePersistentCache) {\n caches.open(cacheName).then(cache => {\n this.cacheApi = cache;\n this.isReady = true;\n\n this.subscribers.forEach(callback => callback());\n });\n } else {\n this.isReady = true;\n }\n }\n\n public onReady(callback: () => void) {\n if (this.isReady) {\n callback();\n } else {\n this.subscribers.push(callback);\n }\n }\n\n public async get(url: string, fetchOptions?: RequestInit) {\n await (this.cacheApi\n ? this.fetchAndAddToPersistentCache(url, fetchOptions)\n : this.fetchAndAddToInternalCache(url, fetchOptions));\n\n return this.cacheStore.get(url)?.content ?? '';\n }\n\n public set(url: string, data: StorageItem) {\n this.cacheStore.set(url, data);\n }\n\n public isCached(url: string) {\n return this.cacheStore.get(url)?.status === STATUS.LOADED;\n }\n\n private async fetchAndAddToInternalCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToInternalCache(url, fetchOptions);\n });\n\n return;\n }\n\n if (!cache?.content) {\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n try {\n const content = await request(url, fetchOptions);\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n }\n\n private async fetchAndAddToPersistentCache(url: string, fetchOptions?: RequestInit) {\n const cache = this.cacheStore.get(url);\n\n if (cache?.status === STATUS.LOADED) {\n return;\n }\n\n if (cache?.status === STATUS.LOADING) {\n await this.handleLoading(url, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndAddToPersistentCache(url, fetchOptions);\n });\n\n return;\n }\n\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n const data = await this.cacheApi?.match(url);\n\n if (data) {\n const content = await data.text();\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n\n return;\n }\n\n try {\n await this.cacheApi?.add(new Request(url, fetchOptions));\n\n const response = await this.cacheApi?.match(url);\n const content = (await response?.text()) ?? '';\n\n this.cacheStore.set(url, { content, status: STATUS.LOADED });\n } catch (error: any) {\n this.cacheStore.set(url, { content: '', status: STATUS.FAILED });\n throw error;\n }\n }\n\n private async handleLoading(url: string, callback: () => Promise<void>) {\n let retryCount = 0;\n\n // eslint-disable-next-line no-await-in-loop\n while (this.cacheStore.get(url)?.status === STATUS.LOADING && retryCount < CACHE_MAX_RETRIES) {\n // eslint-disable-next-line no-await-in-loop\n await sleep(0.1);\n retryCount += 1;\n }\n\n if (retryCount >= CACHE_MAX_RETRIES) {\n await callback();\n }\n }\n\n public keys(): Array<string> {\n return [...this.cacheStore.keys()];\n }\n\n public data(): Array<Record<string, StorageItem>> {\n return [...this.cacheStore.entries()].map(([key, value]) => ({ [key]: value }));\n }\n\n public async delete(url: string) {\n if (this.cacheApi) {\n await this.cacheApi.delete(url);\n }\n\n this.cacheStore.delete(url);\n }\n\n public async clear() {\n if (this.cacheApi) {\n const keys = await this.cacheApi.keys();\n\n for (const key of keys) {\n // eslint-disable-next-line no-await-in-loop\n await this.cacheApi.delete(key);\n }\n }\n\n this.cacheStore.clear();\n }\n}\n"],"mappings":"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","names":[]}
@@ -7,3 +7,4 @@ interface Props {
7
7
  declare function CacheProvider({ children, name }: Props): JSX.Element;
8
8
 
9
9
  export { CacheProvider as default };
10
+ export = CacheProvider
package/dist/provider.js CHANGED
@@ -37,4 +37,10 @@ function CacheProvider({ children, name }) {
37
37
  }
38
38
  return children;
39
39
  }
40
- //# sourceMappingURL=provider.js.map
40
+ //# sourceMappingURL=provider.js.map
41
+ // fix-cjs-exports
42
+ if (module.exports.default) {
43
+ Object.assign(module.exports.default, module.exports);
44
+ module.exports = module.exports.default;
45
+ delete module.exports.default;
46
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/helpers.ts"],"sourcesContent":["import { JSX } from 'react';\n\nimport { canUseDOM } from './helpers';\n\ninterface Props {\n children: JSX.Element;\n name?: string;\n}\n\nexport default function CacheProvider({ children, name }: Props) {\n if (canUseDOM()) {\n window.REACT_INLINESVG_CACHE_NAME = name;\n window.REACT_INLINESVG_PERSISTENT_CACHE = true;\n }\n\n return children;\n}\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType || '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,YAAqB;AACnC,SAAO,CAAC,EAAE,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,SAAS;AAChF;;;ADKe,SAAR,cAA+B,EAAE,UAAU,KAAK,GAAU;AAC/D,MAAI,UAAU,GAAG;AACf,WAAO,6BAA6B;AACpC,WAAO,mCAAmC;AAAA,EAC5C;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/helpers.ts"],"sourcesContent":["import { JSX } from 'react';\n\nimport { canUseDOM } from './helpers';\n\ninterface Props {\n children: JSX.Element;\n name?: string;\n}\n\nexport default function CacheProvider({ children, name }: Props) {\n if (canUseDOM()) {\n window.REACT_INLINESVG_CACHE_NAME = name;\n window.REACT_INLINESVG_PERSISTENT_CACHE = true;\n }\n\n return children;\n}\n","import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType ?? '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,YAAqB;AACnC,SAAO,CAAC,EAAE,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,SAAS;AAChF;;;ADKe,SAAR,cAA+B,EAAE,UAAU,KAAK,GAAU;AAC/D,MAAI,UAAU,GAAG;AACf,WAAO,6BAA6B;AACpC,WAAO,mCAAmC;AAAA,EAC5C;AAEA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers.ts","../src/provider.tsx"],"sourcesContent":["import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType || '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { JSX } from 'react';\n\nimport { canUseDOM } from './helpers';\n\ninterface Props {\n children: JSX.Element;\n name?: string;\n}\n\nexport default function CacheProvider({ children, name }: Props) {\n if (canUseDOM()) {\n window.REACT_INLINESVG_CACHE_NAME = name;\n window.REACT_INLINESVG_PERSISTENT_CACHE = true;\n }\n\n return children;\n}\n"],"mappings":";AAEO,SAAS,YAAqB;AACnC,SAAO,CAAC,EAAE,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,SAAS;AAChF;;;ACKe,SAAR,cAA+B,EAAE,UAAU,KAAK,GAAU;AAC/D,MAAI,UAAU,GAAG;AACf,WAAO,6BAA6B;AACpC,WAAO,mCAAmC;AAAA,EAC5C;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/helpers.ts","../src/provider.tsx"],"sourcesContent":["import type { PlainObject } from './types';\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\n}\n\nexport async function request(url: string, options?: RequestInit) {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type');\n const [fileType] = (contentType ?? '').split(/ ?; ?/);\n\n if (response.status > 299) {\n throw new Error('Not found');\n }\n\n if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {\n throw new Error(`Content type isn't valid: ${fileType}`);\n }\n\n return response.text();\n}\n\nexport function sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n\nexport function supportsInlineSVG(): boolean {\n /* istanbul ignore next */\n if (!document) {\n return false;\n }\n\n const div = document.createElement('div');\n\n div.innerHTML = '<svg />';\n const svg = div.firstChild as SVGSVGElement;\n\n return !!svg && svg.namespaceURI === 'http://www.w3.org/2000/svg';\n}\n\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function randomString(length: number): string {\n const letters = 'abcdefghijklmnopqrstuvwxyz';\n const numbers = '1234567890';\n const charset = `${letters}${letters.toUpperCase()}${numbers}`;\n\n let R = '';\n\n for (let index = 0; index < length; index++) {\n R += randomCharacter(charset);\n }\n\n return R;\n}\n\n/**\n * Remove properties from an object\n */\nexport function omit<T extends PlainObject, K extends keyof T>(\n input: T,\n ...filter: K[]\n): Omit<T, K> {\n const output: any = {};\n\n for (const key in input) {\n /* istanbul ignore else */\n if ({}.hasOwnProperty.call(input, key)) {\n if (!filter.includes(key as unknown as K)) {\n output[key] = input[key];\n }\n }\n }\n\n return output as Omit<T, K>;\n}\n","import { JSX } from 'react';\n\nimport { canUseDOM } from './helpers';\n\ninterface Props {\n children: JSX.Element;\n name?: string;\n}\n\nexport default function CacheProvider({ children, name }: Props) {\n if (canUseDOM()) {\n window.REACT_INLINESVG_CACHE_NAME = name;\n window.REACT_INLINESVG_PERSISTENT_CACHE = true;\n }\n\n return children;\n}\n"],"mappings":";AAEO,SAAS,YAAqB;AACnC,SAAO,CAAC,EAAE,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,SAAS;AAChF;;;ACKe,SAAR,cAA+B,EAAE,UAAU,KAAK,GAAU;AAC/D,MAAI,UAAU,GAAG;AACf,WAAO,6BAA6B;AACpC,WAAO,mCAAmC;AAAA,EAC5C;AAEA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-inlinesvg",
3
- "version": "4.0.3",
3
+ "version": "4.0.4",
4
4
  "description": "An SVG loader for React",
5
5
  "author": "Gil Barbara <gilbarbara@gmail.com>",
6
6
  "contributors": [
@@ -54,27 +54,28 @@
54
54
  "react-from-dom": "^0.6.2"
55
55
  },
56
56
  "devDependencies": {
57
- "@gilbarbara/eslint-config": "^0.5.3",
58
- "@gilbarbara/helpers": "^0.8.4",
57
+ "@gilbarbara/eslint-config": "^0.5.4",
58
+ "@gilbarbara/helpers": "^0.8.6",
59
59
  "@gilbarbara/prettier-config": "^1.0.0",
60
60
  "@gilbarbara/tsconfig": "^0.2.3",
61
61
  "@size-limit/preset-small-lib": "^8.2.6",
62
- "@testing-library/jest-dom": "^6.1.2",
62
+ "@testing-library/jest-dom": "^6.1.3",
63
63
  "@testing-library/react": "^14.0.0",
64
64
  "@types/exenv": "^1.2.0",
65
- "@types/fetch-mock": "^7.3.5",
66
- "@types/jest": "^29.5.4",
67
- "@types/node": "^20.5.6",
68
- "@types/node-fetch": "^2.6.4",
69
- "@types/react": "^18.2.21",
65
+ "@types/fetch-mock": "^7.3.6",
66
+ "@types/jest": "^29.5.5",
67
+ "@types/node": "^20.6.2",
68
+ "@types/node-fetch": "^2.6.5",
69
+ "@types/react": "^18.2.22",
70
70
  "@types/react-dom": "^18.2.7",
71
71
  "browser-cache-mock": "^0.1.7",
72
72
  "cross-fetch": "^4.0.0",
73
- "del-cli": "^5.0.0",
73
+ "del-cli": "^5.1.0",
74
+ "fix-tsup-cjs": "^1.2.0",
74
75
  "http-server": "^14.1.1",
75
76
  "husky": "^8.0.3",
76
- "jest": "^29.6.4",
77
- "jest-environment-jsdom": "^29.6.4",
77
+ "jest": "^29.7.0",
78
+ "jest-environment-jsdom": "^29.7.0",
78
79
  "jest-extended": "^4.0.1",
79
80
  "jest-fetch-mock": "^3.0.3",
80
81
  "jest-serializer-html": "^7.1.0",
@@ -90,7 +91,7 @@
90
91
  "typescript": "^5.2.2"
91
92
  },
92
93
  "scripts": {
93
- "build": "pnpm run clean && tsup",
94
+ "build": "pnpm run clean && tsup && fix-tsup-cjs",
94
95
  "watch": "tsup --watch",
95
96
  "clean": "del dist/*",
96
97
  "start": "http-server test/__fixtures__ -p 1337 --cors",
package/src/helpers.ts CHANGED
@@ -11,7 +11,7 @@ export function isSupportedEnvironment(): boolean {
11
11
  export async function request(url: string, options?: RequestInit) {
12
12
  const response = await fetch(url, options);
13
13
  const contentType = response.headers.get('content-type');
14
- const [fileType] = (contentType || '').split(/ ?; ?/);
14
+ const [fileType] = (contentType ?? '').split(/ ?; ?/);
15
15
 
16
16
  if (response.status > 299) {
17
17
  throw new Error('Not found');
package/src/index.tsx CHANGED
@@ -29,7 +29,7 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
29
29
  status: STATUS.IDLE,
30
30
  };
31
31
 
32
- this.hash = props.uniqueHash || randomString(8);
32
+ this.hash = props.uniqueHash ?? randomString(8);
33
33
  }
34
34
 
35
35
  public componentDidMount(): void {
@@ -136,7 +136,7 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
136
136
  if (description) {
137
137
  const originalDesc = svg.querySelector('desc');
138
138
 
139
- if (originalDesc && originalDesc.parentNode) {
139
+ if (originalDesc?.parentNode) {
140
140
  originalDesc.parentNode.removeChild(originalDesc);
141
141
  }
142
142
 
@@ -149,7 +149,7 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
149
149
  if (typeof title !== 'undefined') {
150
150
  const originalTitle = svg.querySelector('title');
151
151
 
152
- if (originalTitle && originalTitle.parentNode) {
152
+ if (originalTitle?.parentNode) {
153
153
  originalTitle.parentNode.removeChild(originalTitle);
154
154
  }
155
155
 
@@ -210,7 +210,7 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
210
210
  async () => {
211
211
  const { cacheRequests, fetchOptions, src } = this.props;
212
212
 
213
- const dataURI = src.match(/^data:image\/svg[^,]*?(;base64)?,(.*)/u);
213
+ const dataURI = /^data:image\/svg[^,]*?(;base64)?,(.*)/u.exec(src);
214
214
  let inlineSrc;
215
215
 
216
216
  if (dataURI) {
@@ -264,12 +264,12 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
264
264
  }
265
265
 
266
266
  [...node.children].forEach(d => {
267
- if (d.attributes && d.attributes.length) {
267
+ if (d.attributes?.length) {
268
268
  const attributes = Object.values(d.attributes).map(a => {
269
269
  const attribute = a;
270
- const match = a.value.match(/url\((.*?)\)/);
270
+ const match = /url\((.*?)\)/.exec(a.value);
271
271
 
272
- if (match && match[1]) {
272
+ if (match?.[1]) {
273
273
  attribute.value = a.value.replace(match[0], `url(${baseURL}${match[1]}__${this.hash})`);
274
274
  }
275
275