| 22 | const cssCache: Record<string, Promise<void> | undefined> = {}; |
| 23 | |
| 24 | async function loadJSItem(item: JSItem, context: unknown) { |
| 25 | const src = (item.type === 'script' && item.data?.src) || ''; |
| 26 | item.loaded ||= jsCache[src]; |
| 27 | if (!item.loaded) { |
| 28 | const deferred = defer<void>(); |
| 29 | item.loaded = deferred.promise; |
| 30 | if (item.type === 'script') { |
| 31 | document.head.append( |
| 32 | hm('script', { |
| 33 | ...item.data, |
| 34 | onLoad: () => deferred.resolve(), |
| 35 | onError: deferred.reject, |
| 36 | }), |
| 37 | ); |
| 38 | if (!src) { |
| 39 | // Run inline script synchronously |
| 40 | deferred.resolve(); |
| 41 | } else { |
| 42 | jsCache[src] = item.loaded; |
| 43 | } |
| 44 | } |
| 45 | if (item.type === 'iife') { |
| 46 | const { fn, getParams } = item.data; |
| 47 | fn(...(getParams?.(context) || [])); |
| 48 | deferred.resolve(); |
| 49 | } |
| 50 | } |
| 51 | await item.loaded; |
| 52 | } |
| 53 | |
| 54 | async function loadCSSItem(item: CSSItem) { |
| 55 | const url = (item.type === 'stylesheet' && item.data.href) || ''; |