Skip to main content

priv/ts/runtime/preload.ts

const __duskmoon_bundlerPreloaded = new Set<string>()

const __duskmoon_bundlerPreload = (load: () => Promise<unknown>, deps: string[]) =>
  Promise.all(deps.map(__duskmoon_bundlerPreloadDep))
    .then(load)
    .catch((error) => {
      window.dispatchEvent(new CustomEvent('duskmoon_bundler:preloadError', { detail: error }))
      throw error
    })

function __duskmoon_bundlerPreloadDep(dep: string) {
  if (__duskmoon_bundlerPreloaded.has(dep) || document.querySelector(`link[href=${JSON.stringify(dep)}]`)) {
    return Promise.resolve()
  }

  __duskmoon_bundlerPreloaded.add(dep)

  const link = document.createElement('link')
  link.rel = dep.endsWith('.css') ? 'stylesheet' : 'modulepreload'
  link.href = dep
  document.head.appendChild(link)

  if (link.rel !== 'stylesheet') {
    return Promise.resolve()
  }

  return new Promise((resolve, reject) => {
    link.onload = resolve
    link.onerror = reject
  })
}