UNPKG

react-inlinesvg

Version:
1 lines 34.1 kB
{"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/modules/helpers.ts","../src/modules/cache.ts","../src/modules/useInlineSVG.ts","../src/modules/hooks.tsx","../src/modules/utils.ts","../src/provider.tsx"],"sourcesContent":["import { cloneElement, ReactElement, SVGProps } from 'react';\n\nimport { STATUS } from './config';\nimport CacheStore from './modules/cache';\nimport { canUseDOM, omit } from './modules/helpers';\nimport useInlineSVG from './modules/useInlineSVG';\nimport { useCacheStore } from './provider';\nimport { Props, Status } from './types';\n\nexport const cacheStore = new CacheStore();\n\nexport default function InlineSVG(props: Props) {\n const { children = null, innerRef, loader = null } = props;\n const contextStore = useCacheStore();\n const store = contextStore ?? cacheStore;\n\n const { element, status } = useInlineSVG(props, store);\n\n if (!canUseDOM()) {\n return loader;\n }\n\n if (element) {\n return cloneElement(element as ReactElement<SVGProps<SVGElement>>, {\n ref: innerRef,\n ...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 }\n\n if (([STATUS.UNSUPPORTED, STATUS.FAILED] as Status[]).includes(status)) {\n return children;\n }\n\n return loader;\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","function 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 Record<string, unknown>, 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 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 } from './helpers';\n\nexport interface CacheStoreOptions {\n name?: string;\n persistent?: boolean;\n}\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(options: CacheStoreOptions = {}) {\n const { name = CACHE_NAME, persistent = false } = options;\n\n this.cacheStore = new Map<string, StorageItem>();\n\n const usePersistentCache = persistent && canUseDOM() && 'caches' in window;\n\n if (usePersistentCache) {\n // eslint-disable-next-line promise/catch-or-return\n caches\n .open(name)\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): () => void {\n if (this.isReady) {\n callback();\n\n return () => {};\n }\n\n this.subscribers.push(callback);\n\n return () => {\n const index = this.subscribers.indexOf(callback);\n\n if (index >= 0) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n\n private waitForReady(): Promise<void> {\n if (this.isReady) {\n return Promise.resolve();\n }\n\n return new Promise(resolve => {\n this.onReady(resolve);\n });\n }\n\n public async get(url: string, fetchOptions?: RequestInit) {\n await this.fetchAndCache(url, fetchOptions);\n\n return this.cacheStore.get(url)?.content ?? '';\n }\n\n public getContent(url: string): string {\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 fetchAndCache(url: string, fetchOptions?: RequestInit) {\n if (!this.isReady) {\n await this.waitForReady();\n }\n\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, fetchOptions?.signal || undefined, async () => {\n this.cacheStore.set(url, { content: '', status: STATUS.IDLE });\n await this.fetchAndCache(url, fetchOptions);\n });\n\n return;\n }\n\n this.cacheStore.set(url, { content: '', status: STATUS.LOADING });\n\n try {\n const content = this.cacheApi\n ? await this.fetchFromPersistentCache(url, fetchOptions)\n : 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 private async fetchFromPersistentCache(url: string, fetchOptions?: RequestInit): Promise<string> {\n const data = await this.cacheApi?.match(url);\n\n if (data) {\n return data.text();\n }\n\n await this.cacheApi?.add(new Request(url, fetchOptions));\n\n const response = await this.cacheApi?.match(url);\n\n return (await response?.text()) ?? '';\n }\n\n private async handleLoading(\n url: string,\n signal: AbortSignal | undefined,\n callback: () => Promise<void>,\n ) {\n for (let retryCount = 0; retryCount < CACHE_MAX_RETRIES; retryCount++) {\n if (signal?.aborted) {\n throw signal.reason instanceof Error\n ? signal.reason\n : new DOMException('The operation was aborted.', 'AbortError');\n }\n\n if (this.cacheStore.get(url)?.status !== STATUS.LOADING) {\n return;\n }\n\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\nfunction sleep(seconds = 1) {\n return new Promise(resolve => {\n setTimeout(resolve, seconds * 1000);\n });\n}\n","import { isValidElement, useCallback, useEffect, useReducer, useRef } from 'react';\nimport convert from 'react-from-dom';\n\nimport { STATUS } from '../config';\nimport type { FetchError, Props, State } from '../types';\n\nimport type CacheStore from './cache';\nimport { canUseDOM, isSupportedEnvironment, randomString, request } from './helpers';\nimport { useMount, usePrevious } from './hooks';\nimport { getNode } from './utils';\n\nexport default function useInlineSVG(props: Props, cacheStore: CacheStore) {\n const {\n baseURL,\n cacheRequests = true,\n description,\n fetchOptions,\n onError,\n onLoad,\n preProcessor,\n src,\n title,\n uniqueHash,\n uniquifyIDs,\n } = props;\n\n const hash = useRef(uniqueHash ?? randomString(8));\n const fetchOptionsRef = useRef(fetchOptions);\n const onErrorRef = useRef(onError);\n const onLoadRef = useRef(onLoad);\n const preProcessorRef = useRef(preProcessor);\n\n fetchOptionsRef.current = fetchOptions;\n onErrorRef.current = onError;\n onLoadRef.current = onLoad;\n preProcessorRef.current = preProcessor;\n\n const [state, setState] = useReducer(\n (previousState: State, nextState: Partial<State>) => ({\n ...previousState,\n ...nextState,\n }),\n {\n content: '',\n element: null,\n isCached: false,\n status: STATUS.IDLE,\n },\n (initial): State => {\n const cached = cacheRequests && cacheStore.isCached(src);\n\n if (!cached) {\n return initial;\n }\n\n const cachedContent = cacheStore.getContent(src);\n\n try {\n const node = getNode({\n ...props,\n handleError: () => {},\n hash: hash.current,\n content: cachedContent,\n });\n\n if (!node) {\n return { ...initial, content: cachedContent, isCached: true, status: STATUS.LOADED };\n }\n\n const convertedElement = convert(node as Node);\n\n if (convertedElement && isValidElement(convertedElement)) {\n return {\n content: cachedContent,\n element: convertedElement,\n isCached: true,\n status: STATUS.READY,\n };\n }\n } catch {\n // Fall through to effect-driven flow\n }\n\n return {\n ...initial,\n content: cachedContent,\n isCached: true,\n status: STATUS.LOADED,\n };\n },\n );\n const { content, element, isCached, status } = state;\n const previousProps = usePrevious(props);\n const previousState = usePrevious(state);\n const isActive = useRef(false);\n const isInitialized = useRef(false);\n\n const handleError = useCallback((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 onErrorRef.current?.(error);\n }\n }, []);\n\n const getElement = useCallback(() => {\n try {\n const node = getNode({\n baseURL,\n content,\n description,\n handleError,\n hash: hash.current,\n preProcessor: preProcessorRef.current,\n src,\n title,\n uniquifyIDs,\n }) 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 }, [baseURL, content, description, handleError, src, title, uniquifyIDs]);\n\n // Mount\n useMount(() => {\n isActive.current = true;\n\n if (!canUseDOM() || isInitialized.current) {\n return undefined;\n }\n\n try {\n if (status === STATUS.READY) {\n onLoadRef.current?.(src, isCached);\n } else 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 setState({ content: '', element: null, isCached: false, status: STATUS.LOADING });\n }\n } catch (error: any) {\n handleError(error);\n }\n\n isInitialized.current = true;\n\n return () => {\n isActive.current = false;\n };\n });\n\n // 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 setState({ content: '', element: null, isCached: false, status: STATUS.LOADING });\n }\n }, [handleError, previousProps, src]);\n\n // Fetch content when status is LOADING\n useEffect(() => {\n if (status !== STATUS.LOADING) {\n return undefined;\n }\n\n const controller = new AbortController();\n let active = true;\n\n (async () => {\n try {\n const dataURI = /^data:image\\/svg[^,]*?(;base64)?,(.*)/.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 if (active) {\n setState({ content: inlineSrc, isCached: false, status: STATUS.LOADED });\n }\n\n return;\n }\n\n const fetchParameters = { ...fetchOptionsRef.current, signal: controller.signal };\n let loadedContent: string;\n let hasCache = false;\n\n if (cacheRequests) {\n hasCache = cacheStore.isCached(src);\n loadedContent = await cacheStore.get(src, fetchParameters);\n } else {\n loadedContent = await request(src, fetchParameters);\n }\n\n if (active) {\n setState({ content: loadedContent, isCached: hasCache, status: STATUS.LOADED });\n }\n } catch (error: any) {\n if (active && error.name !== 'AbortError') {\n handleError(error);\n }\n }\n })();\n\n return () => {\n active = false;\n controller.abort();\n };\n }, [cacheRequests, cacheStore, handleError, src, status]);\n\n // LOADED -> READY\n useEffect(() => {\n if (status === STATUS.LOADED && content) {\n getElement();\n }\n }, [content, getElement, status]);\n\n // 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 // READY -> onLoad\n useEffect(() => {\n if (!previousState) {\n return;\n }\n\n if (status === STATUS.READY && previousState.status !== STATUS.READY) {\n onLoadRef.current?.(src, isCached);\n }\n }, [isCached, previousState, src, status]);\n\n return { element, status };\n}\n","import { EffectCallback, useEffect, useRef } from 'react';\n\nexport function useMount(effect: EffectCallback) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(effect, []);\n}\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\nfunction uniquifyStyleIds(svgText: string, hash: string, baseURL: string): string {\n const idMatches = svgText.matchAll(/\\bid=([\"'])([^\"']+)\\1/g);\n const ids = [...new Set([...idMatches].map(m => m[2]))];\n\n if (!ids.length) {\n return svgText;\n }\n\n ids.sort((a, b) => b.length - a.length);\n\n return svgText.replace(/<style[^>]*>([\\S\\s]*?)<\\/style>/gi, (fullMatch, cssContent) => {\n let modified = cssContent as string;\n\n for (const id of ids) {\n const escaped = id.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n\n modified = modified.replace(\n new RegExp(`url\\\\((['\"]?)#${escaped}\\\\1\\\\)`, 'g'),\n `url($1${baseURL}#${id}__${hash}$1)`,\n );\n modified = modified.replace(\n new RegExp(`#${escaped}(?![a-zA-Z0-9_-])`, 'g'),\n `#${id}__${hash}`,\n );\n }\n\n return fullMatch.replace(cssContent, modified);\n });\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 let svgText = processSVG(content, preProcessor);\n\n if (uniquifyIDs) {\n svgText = uniquifyStyleIds(svgText, hash, baseURL ?? '');\n }\n\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","import React, { createContext, ReactNode, useContext, useState } from 'react';\n\nimport CacheStore from './modules/cache';\n\nconst CacheContext = createContext<CacheStore | null>(null);\n\ninterface Props {\n children: ReactNode;\n name?: string;\n}\n\nexport default function CacheProvider({ children, name }: Props) {\n const [store] = useState(() => new CacheStore({ name, persistent: true }));\n\n return <CacheContext.Provider value={store}>{children}</CacheContext.Provider>;\n}\n\nexport function useCacheStore(): CacheStore | null {\n return useContext(CacheContext);\n}\n"],"mappings":"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","names":["useEffect","useRef","convert","cacheStore","useRef","previousState","convert","useEffect"]}