{"version":3,"file":"PreloadLinks.js","names":[],"sources":["esm/views/PreloadLinks.js"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { getURL } from \"../getURL\";\nimport { preloadRoute } from \"../router/router\";\nimport { shouldPreloadRoute } from \"../utils/url\";\nconst PREFETCH_MODE = process.env.ONE_LINK_PREFETCH || \"intent\";\nfunction getPrefetchableHref(anchor, url) {\n  if (anchor.target && anchor.target !== \"_self\") return null;\n  if (anchor.hasAttribute(\"download\")) return null;\n  if (anchor.getAttribute(\"rel\")?.includes(\"external\")) return null;\n  const href = anchor.getAttribute(\"href\");\n  if (!href) return null;\n  if (href[0] === \"/\" || href.startsWith(url)) {\n    const cleanHref = href.replace(url, \"\");\n    if (!shouldPreloadRoute(cleanHref)) return null;\n    return cleanHref;\n  }\n  return null;\n}\nfunction getHrefFromTarget(url, target) {\n  if (!(target instanceof HTMLElement)) return null;\n  const anchor = target instanceof HTMLAnchorElement ? target : target.closest(\"a\");\n  if (!(anchor instanceof HTMLAnchorElement)) return null;\n  return getPrefetchableHref(anchor, url);\n}\nfunction PreloadLinks() {\n  if (typeof window === \"undefined\") {\n    return null;\n  }\n  if (!import.meta.env.PROD) {\n    useEffect(() => {\n      const url = getURL();\n      const controller = new AbortController();\n      document.addEventListener(\n        \"mouseover\",\n        (e) => {\n          const href = getHrefFromTarget(url, e.target);\n          if (href) preloadRoute(href);\n        },\n        { passive: true, signal: controller.signal }\n      );\n      return () => controller.abort();\n    }, []);\n    return null;\n  }\n  if (PREFETCH_MODE === \"false\") {\n    return null;\n  }\n  const cleanupRef = useRef(null);\n  useEffect(() => {\n    const url = getURL();\n    if (PREFETCH_MODE === \"hover\") {\n      const controller = new AbortController();\n      document.addEventListener(\n        \"mouseover\",\n        (e) => {\n          const href = getHrefFromTarget(url, e.target);\n          if (href) preloadRoute(href);\n        },\n        { passive: true, signal: controller.signal }\n      );\n      return () => controller.abort();\n    }\n    if (PREFETCH_MODE === \"viewport\") {\n      import(\"../link/prefetchViewport\").then(\n        ({ startPrefetchViewport, observePrefetchViewport }) => {\n          startPrefetchViewport(preloadRoute);\n          const cleanups = [];\n          const seen = /* @__PURE__ */ new WeakSet();\n          const observeLinks = () => {\n            const links = document.querySelectorAll(\n              'a[href^=\"/\"], a[href^=\"' + url + '\"]'\n            );\n            links.forEach((link) => {\n              if (seen.has(link)) return;\n              seen.add(link);\n              const href = getPrefetchableHref(link, url);\n              if (href) {\n                cleanups.push(\n                  observePrefetchViewport(link, href)\n                );\n              }\n            });\n          };\n          observeLinks();\n          let timeout;\n          const observer = new MutationObserver(() => {\n            clearTimeout(timeout);\n            timeout = setTimeout(observeLinks, 100);\n          });\n          observer.observe(document.body, { childList: true, subtree: true });\n          cleanupRef.current = () => {\n            clearTimeout(timeout);\n            cleanups.forEach((c) => c());\n            observer.disconnect();\n          };\n        }\n      );\n      return () => cleanupRef.current?.();\n    }\n    if (PREFETCH_MODE === \"intent\") {\n      const controller = new AbortController();\n      import(\"../link/prefetchIntent\").then(\n        ({ startPrefetchIntent, observePrefetchIntent }) => {\n          startPrefetchIntent(preloadRoute);\n          const cleanups = [];\n          const seen = /* @__PURE__ */ new WeakSet();\n          const observeLinks = () => {\n            const links = document.querySelectorAll(\n              'a[href^=\"/\"], a[href^=\"' + url + '\"]'\n            );\n            links.forEach((link) => {\n              if (seen.has(link)) return;\n              seen.add(link);\n              const href = getPrefetchableHref(link, url);\n              if (href) {\n                cleanups.push(\n                  observePrefetchIntent(link, href)\n                );\n              }\n            });\n          };\n          observeLinks();\n          let timeout;\n          const observer = new MutationObserver(() => {\n            clearTimeout(timeout);\n            timeout = setTimeout(observeLinks, 100);\n          });\n          observer.observe(document.body, { childList: true, subtree: true });\n          cleanupRef.current = () => {\n            clearTimeout(timeout);\n            cleanups.forEach((c) => c());\n            observer.disconnect();\n          };\n          document.addEventListener(\n            \"mouseover\",\n            (e) => {\n              const href = getHrefFromTarget(url, e.target);\n              if (href) preloadRoute(href);\n            },\n            { passive: true, signal: controller.signal }\n          );\n        }\n      );\n      return () => {\n        controller.abort();\n        cleanupRef.current?.();\n      };\n    }\n  }, []);\n  return null;\n}\nexport {\n  PreloadLinks,\n  getPrefetchableHref\n};\n//# sourceMappingURL=PreloadLinks.js.map\n"],"mappings":"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"}