react-inlinesvg 4.0.4 → 4.0.5
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/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
- package/src/index.tsx +5 -1
package/dist/index.js
CHANGED
|
@@ -307,7 +307,7 @@ var ReactInlineSVG = class extends React.PureComponent {
|
|
|
307
307
|
return;
|
|
308
308
|
}
|
|
309
309
|
const { isCached, status } = this.state;
|
|
310
|
-
const { onLoad, src } = this.props;
|
|
310
|
+
const { description, onLoad, src, title } = this.props;
|
|
311
311
|
if (previousState.status !== STATUS.READY && status === STATUS.READY) {
|
|
312
312
|
if (onLoad) {
|
|
313
313
|
onLoad(src, isCached);
|
|
@@ -320,6 +320,9 @@ var ReactInlineSVG = class extends React.PureComponent {
|
|
|
320
320
|
}
|
|
321
321
|
this.load();
|
|
322
322
|
}
|
|
323
|
+
if (previousProps.title !== title || previousProps.description !== description) {
|
|
324
|
+
this.getElement();
|
|
325
|
+
}
|
|
323
326
|
}
|
|
324
327
|
componentWillUnmount() {
|
|
325
328
|
this.isActive = false;
|
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?.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"]}
|
|
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 { description, onLoad, src, title } = 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 if (previousProps.title !== title || previousProps.description !== description) {\n this.getElement();\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
|
@@ -274,7 +274,7 @@ var ReactInlineSVG = class extends React.PureComponent {
|
|
|
274
274
|
return;
|
|
275
275
|
}
|
|
276
276
|
const { isCached, status } = this.state;
|
|
277
|
-
const { onLoad, src } = this.props;
|
|
277
|
+
const { description, onLoad, src, title } = this.props;
|
|
278
278
|
if (previousState.status !== STATUS.READY && status === STATUS.READY) {
|
|
279
279
|
if (onLoad) {
|
|
280
280
|
onLoad(src, isCached);
|
|
@@ -287,6 +287,9 @@ var ReactInlineSVG = class extends React.PureComponent {
|
|
|
287
287
|
}
|
|
288
288
|
this.load();
|
|
289
289
|
}
|
|
290
|
+
if (previousProps.title !== title || previousProps.description !== description) {
|
|
291
|
+
this.getElement();
|
|
292
|
+
}
|
|
290
293
|
}
|
|
291
294
|
componentWillUnmount() {
|
|
292
295
|
this.isActive = false;
|
package/dist/index.mjs.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?.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":[]}
|
|
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 { description, onLoad, src, title } = 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 if (previousProps.title !== title || previousProps.description !== description) {\n this.getElement();\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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-inlinesvg",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.5",
|
|
4
4
|
"description": "An SVG loader for React",
|
|
5
5
|
"author": "Gil Barbara <gilbarbara@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -58,16 +58,16 @@
|
|
|
58
58
|
"@gilbarbara/helpers": "^0.8.6",
|
|
59
59
|
"@gilbarbara/prettier-config": "^1.0.0",
|
|
60
60
|
"@gilbarbara/tsconfig": "^0.2.3",
|
|
61
|
-
"@size-limit/preset-small-lib": "^
|
|
61
|
+
"@size-limit/preset-small-lib": "^9.0.0",
|
|
62
62
|
"@testing-library/jest-dom": "^6.1.3",
|
|
63
63
|
"@testing-library/react": "^14.0.0",
|
|
64
64
|
"@types/exenv": "^1.2.0",
|
|
65
65
|
"@types/fetch-mock": "^7.3.6",
|
|
66
66
|
"@types/jest": "^29.5.5",
|
|
67
|
-
"@types/node": "^20.
|
|
68
|
-
"@types/node-fetch": "^2.6.
|
|
69
|
-
"@types/react": "^18.2.
|
|
70
|
-
"@types/react-dom": "^18.2.
|
|
67
|
+
"@types/node": "^20.8.2",
|
|
68
|
+
"@types/node-fetch": "^2.6.6",
|
|
69
|
+
"@types/react": "^18.2.24",
|
|
70
|
+
"@types/react-dom": "^18.2.8",
|
|
71
71
|
"browser-cache-mock": "^0.1.7",
|
|
72
72
|
"cross-fetch": "^4.0.0",
|
|
73
73
|
"del-cli": "^5.1.0",
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"react": "^18.2.0",
|
|
84
84
|
"react-dom": "^18.2.0",
|
|
85
85
|
"repo-tools": "^0.2.2",
|
|
86
|
-
"size-limit": "^
|
|
87
|
-
"start-server-and-test": "^2.0.
|
|
86
|
+
"size-limit": "^9.0.0",
|
|
87
|
+
"start-server-and-test": "^2.0.1",
|
|
88
88
|
"ts-jest": "^29.1.1",
|
|
89
89
|
"ts-node": "^10.9.1",
|
|
90
90
|
"tsup": "^7.2.0",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"watch": "tsup --watch",
|
|
96
96
|
"clean": "del dist/*",
|
|
97
97
|
"start": "http-server test/__fixtures__ -p 1337 --cors",
|
|
98
|
-
"lint": "eslint
|
|
98
|
+
"lint": "eslint src test",
|
|
99
99
|
"test": "start-server-and-test start http://127.0.0.1:1337 test:coverage",
|
|
100
100
|
"test:coverage": "jest --coverage --bail",
|
|
101
101
|
"test:watch": "jest --watchAll --verbose",
|
package/src/index.tsx
CHANGED
|
@@ -70,7 +70,7 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
const { isCached, status } = this.state;
|
|
73
|
-
const { onLoad, src } = this.props;
|
|
73
|
+
const { description, onLoad, src, title } = this.props;
|
|
74
74
|
|
|
75
75
|
if (previousState.status !== STATUS.READY && status === STATUS.READY) {
|
|
76
76
|
/* istanbul ignore else */
|
|
@@ -88,6 +88,10 @@ class ReactInlineSVG extends React.PureComponent<Props, State> {
|
|
|
88
88
|
|
|
89
89
|
this.load();
|
|
90
90
|
}
|
|
91
|
+
|
|
92
|
+
if (previousProps.title !== title || previousProps.description !== description) {
|
|
93
|
+
this.getElement();
|
|
94
|
+
}
|
|
91
95
|
}
|
|
92
96
|
|
|
93
97
|
public componentWillUnmount(): void {
|