one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 8.25 kB
Source Map (JSON)
{"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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"}