import { Options } from './types' import { embedResources } from './embed-resources' import { toArray } from './util' import { isDataUrl, resourceToDataURL } from './dataurl' import { getMimeType } from './mimes' async function embedBackground( clonedNode: T, options: Options, ) { const background = clonedNode.style?.getPropertyValue('background') if (background) { const cssString = await embedResources(background, null, options) clonedNode.style.setProperty( 'background', cssString, clonedNode.style.getPropertyPriority('background'), ) } } async function embedImageNode( clonedNode: T, options: Options, ) { if ( !(clonedNode instanceof HTMLImageElement && !isDataUrl(clonedNode.src)) && !( clonedNode instanceof SVGImageElement && !isDataUrl(clonedNode.href.baseVal) ) ) { return } const url = clonedNode instanceof HTMLImageElement ? clonedNode.src : clonedNode.href.baseVal const dataURL = await resourceToDataURL(url, getMimeType(url), options) await new Promise((resolve, reject) => { clonedNode.onload = resolve clonedNode.onerror = reject if (clonedNode instanceof HTMLImageElement) { clonedNode.srcset = '' clonedNode.src = dataURL } else { clonedNode.href.baseVal = dataURL } }) } async function embedChildren( clonedNode: T, options: Options, ) { const children = toArray(clonedNode.childNodes) const deferreds = children.map((child) => embedImages(child, options)) await Promise.all(deferreds).then(() => clonedNode) } export async function embedImages( clonedNode: T, options: Options, ) { if (clonedNode instanceof Element) { await embedBackground(clonedNode, options) await embedImageNode(clonedNode, options) await embedChildren(clonedNode, options) } }