react-inlinesvg
Version:
An SVG loader for React
1 lines • 29.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/modules/helpers.ts","../src/modules/cache.ts","../src/modules/hooks.tsx","../src/modules/utils.ts"],"sourcesContent":["import React, {\n cloneElement,\n isValidElement,\n ReactElement,\n useCallback,\n useEffect,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport convert from 'react-from-dom';\n\nimport { STATUS } from './config';\nimport CacheStore from './modules/cache';\nimport { canUseDOM, isSupportedEnvironment, omit, randomString, request } from './modules/helpers';\nimport { usePrevious } from './modules/hooks';\nimport { getNode } from './modules/utils';\nimport { FetchError, Props, State, Status } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let cacheStore: CacheStore;\n\nfunction ReactInlineSVG(props: Props) {\n const {\n cacheRequests = true,\n children = null,\n description,\n fetchOptions,\n innerRef,\n loader = null,\n onError,\n onLoad,\n src,\n title,\n uniqueHash,\n } = props;\n const [state, setState] = useReducer(\n (previousState: State, nextState: Partial<State>) => ({\n ...previousState,\n ...nextState,\n }),\n {\n content: '',\n element: null,\n\n isCached: cacheRequests && cacheStore.isCached(props.src),\n status: STATUS.IDLE,\n },\n );\n const { content, element, isCached, status } = state;\n const previousProps = usePrevious(props);\n const previousState = usePrevious(state);\n\n const hash = useRef(uniqueHash ?? randomString(8));\n const isActive = useRef(false);\n const isInitialized = useRef(false);\n\n const handleError = useCallback(\n (error: Error | FetchError) => {\n if (isActive.current) {\n setState({\n status:\n error.message === 'Browser does not support SVG' ? STATUS.UNSUPPORTED : STATUS.FAILED,\n });\n\n onError?.(error);\n }\n },\n [onError],\n );\n\n const handleLoad = useCallback((loadedContent: string, hasCache = false) => {\n if (isActive.current) {\n setState({\n content: loadedContent,\n isCached: hasCache,\n status: STATUS.LOADED,\n });\n }\n }, []);\n\n const fetchContent = useCallback(async () => {\n const responseContent: string = await request(src, fetchOptions);\n\n handleLoad(responseContent);\n }, [fetchOptions, handleLoad, src]);\n\n const getElement = useCallback(() => {\n try {\n const node = getNode({ ...props, handleError, hash: hash.current, content }) as Node;\n const convertedElement = convert(node);\n\n if (!convertedElement || !isValidElement(convertedElement)) {\n throw new Error('Could not convert the src to a React element');\n }\n\n setState({\n element: convertedElement,\n status: STATUS.READY,\n });\n } catch (error: any) {\n handleError(error);\n }\n }, [content, handleError, props]);\n\n const getContent = useCallback(async () => {\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 handleLoad(inlineSrc);\n\n return;\n }\n\n try {\n if (cacheRequests) {\n const cachedContent = await cacheStore.get(src, fetchOptions);\n\n handleLoad(cachedContent, true);\n } else {\n await fetchContent();\n }\n } catch (error: any) {\n handleError(error);\n }\n }, [cacheRequests, fetchContent, fetchOptions, handleError, handleLoad, src]);\n\n const load = useCallback(async () => {\n if (isActive.current) {\n setState({\n content: '',\n element: null,\n isCached: false,\n status: STATUS.LOADING,\n });\n }\n }, []);\n\n // Run on mount\n useEffect(\n () => {\n isActive.current = true;\n\n if (!canUseDOM() || isInitialized.current) {\n return undefined;\n }\n\n try {\n if (status === STATUS.IDLE) {\n if (!isSupportedEnvironment()) {\n throw new Error('Browser does not support SVG');\n }\n\n if (!src) {\n throw new Error('Missing src');\n }\n\n load();\n }\n } catch (error: any) {\n handleError(error);\n }\n\n isInitialized.current = true;\n\n return () => {\n isActive.current = false;\n };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n // Handles `src` changes\n useEffect(() => {\n if (!canUseDOM() || !previousProps) {\n return;\n }\n\n if (previousProps.src !== src) {\n if (!src) {\n handleError(new Error('Missing src'));\n\n return;\n }\n\n load();\n }\n }, [handleError, load, previousProps, src]);\n\n // Handles content loading\n useEffect(() => {\n if (status === STATUS.LOADED) {\n getElement();\n }\n }, [status, getElement]);\n\n // Handles `title` and `description` changes\n useEffect(() => {\n if (!canUseDOM() || !previousProps || previousProps.src !== src) {\n return;\n }\n\n if (previousProps.title !== title || previousProps.description !== description) {\n getElement();\n }\n }, [description, getElement, previousProps, src, title]);\n\n // handle state\n useEffect(() => {\n if (!previousState) {\n return;\n }\n\n switch (status) {\n case STATUS.LOADING: {\n if (previousState.status !== STATUS.LOADING) {\n getContent();\n }\n\n break;\n }\n case STATUS.LOADED: {\n if (previousState.status !== STATUS.LOADED) {\n getElement();\n }\n\n break;\n }\n case STATUS.READY: {\n if (previousState.status !== STATUS.READY) {\n onLoad?.(src, isCached);\n }\n\n break;\n }\n }\n }, [getContent, getElement, isCached, onLoad, previousState, src, status]);\n\n const elementProps = omit(\n 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 cloneElement(element as ReactElement, {\n ref: innerRef,\n ...elementProps,\n });\n }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\n}\n\nexport default function InlineSVG(props: Props) {\n if (!cacheStore) {\n cacheStore = new CacheStore();\n }\n\n const { loader } = props;\n const [isReady, setReady] = useState(cacheStore.isReady);\n\n useEffect(() => {\n if (isReady) {\n return;\n }\n\n cacheStore.onReady(() => {\n setReady(true);\n });\n }, [isReady]);\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\nfunction randomCharacter(character: string) {\n return character[Math.floor(Math.random() * character.length)];\n}\n\nexport function canUseDOM(): boolean {\n return !!(typeof window !== 'undefined' && window.document?.createElement);\n}\n\nexport function isSupportedEnvironment(): boolean {\n return supportsInlineSVG() && typeof window !== 'undefined' && window !== null;\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 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\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\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 /* c8 ignore next 3 */\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","import { CACHE_MAX_RETRIES, CACHE_NAME, STATUS } from '../config';\nimport { StorageItem } from '../types';\n\nimport { canUseDOM, request, sleep } from './helpers';\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 && 'caches' in window;\n }\n\n if (usePersistentCache) {\n caches\n .open(cacheName)\n .then(cache => {\n this.cacheApi = cache;\n })\n .catch(error => {\n // eslint-disable-next-line no-console\n console.error(`Failed to open cache: ${error.message}`);\n this.cacheApi = undefined;\n })\n .finally(() => {\n this.isReady = true;\n // Copy to avoid mutation issues\n const callbacks = [...this.subscribers];\n\n // Clear array efficiently\n this.subscribers.length = 0;\n\n callbacks.forEach(callback => {\n try {\n callback();\n } catch (error: any) {\n // eslint-disable-next-line no-console\n console.error(`Error in CacheStore subscriber callback: ${error.message}`);\n }\n });\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 for (let retryCount = 0; retryCount < CACHE_MAX_RETRIES; retryCount++) {\n if (this.cacheStore.get(url)?.status !== STATUS.LOADING) {\n return;\n }\n\n // eslint-disable-next-line no-await-in-loop\n await sleep(0.1);\n }\n\n await callback();\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 await Promise.allSettled(keys.map(key => this.cacheApi!.delete(key)));\n }\n\n this.cacheStore.clear();\n }\n}\n","import { useEffect, useRef } from 'react';\n\nexport function usePrevious<T>(state: T): T | undefined {\n const ref = useRef<T>(undefined);\n\n useEffect(() => {\n ref.current = state;\n });\n\n return ref.current;\n}\n","import convert from 'react-from-dom';\n\nimport { Props, State } from '../types';\n\ninterface GetNodeOptions extends Props, Pick<State, 'content'> {\n handleError: (error: Error) => void;\n hash: string;\n}\n\ninterface UpdateSVGAttributesOptions extends Pick<Props, 'baseURL' | 'uniquifyIDs'> {\n hash: string;\n}\n\nexport function getNode(options: GetNodeOptions) {\n const {\n baseURL,\n content,\n description,\n handleError,\n hash,\n preProcessor,\n title,\n uniquifyIDs = false,\n } = options;\n\n try {\n const svgText = processSVG(content, preProcessor);\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 = updateSVGAttributes(node, { baseURL, hash, uniquifyIDs });\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 handleError(error);\n }\n}\n\nexport function processSVG(content: string, preProcessor?: Props['preProcessor']) {\n if (preProcessor) {\n return preProcessor(content);\n }\n\n return content;\n}\n\nexport function updateSVGAttributes(\n node: SVGSVGElement,\n options: UpdateSVGAttributesOptions,\n): SVGSVGElement {\n const { baseURL = '', hash, uniquifyIDs } = options;\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]}__${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}__${hash}`;\n }\n });\n }\n\n if (d.children.length) {\n return updateSVGAttributes(d as SVGSVGElement, options);\n }\n\n return d;\n });\n\n return node;\n}\n"],"mappings":"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","names":["useEffect","useRef","convert","previousState","useRef","convert","useEffect"]}