
import MagicString from 'magic-string'
import type { Plugin } from 'vite'

export function chunkErrorPlugin (options: { sourcemap?: boolean }): Plugin {
  return {
    name: 'nuxt:chunk-error',
    transform (code, id) {
      if (id !== '\0vite/preload-helper' || code.includes('nuxt.preloadError')) { return }

      const s = new MagicString(code)
      s.replace(/__vitePreload/g, '___vitePreload')
      s.append(`
export const __vitePreload = (...args) => ___vitePreload(...args).catch(err => {
  const e = new Event("nuxt.preloadError");
  e.payload = err;
  window.dispatchEvent(e);
  throw err;
})`)

      return {
        code: s.toString(),
        map: options.sourcemap
          ? s.generateMap({ hires: true })
          : undefined
      }
    }
  }
}
