UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

88 lines 2.81 kB
var import_vitest = require("vitest"); var import_prefetchViewport = require("./prefetchViewport.cjs"); let mockIOCallback; const mockObserved = /* @__PURE__ */new Set(); import_vitest.vi.stubGlobal("IntersectionObserver", class { constructor(callback) { mockIOCallback = callback; } observe(el) { mockObserved.add(el); } unobserve(el) { mockObserved.delete(el); } disconnect() { mockObserved.clear(); } }); function simulateIntersect(el, isIntersecting) { mockIOCallback([{ target: el, isIntersecting }], {}); } (0, import_vitest.describe)("prefetchViewport", () => { let prefetched; let vp; (0, import_vitest.beforeEach)(() => { prefetched = []; mockObserved.clear(); vp = (0, import_prefetchViewport.createPrefetchViewport)(); vp.start(href => prefetched.push(href)); }); (0, import_vitest.it)("prefetches when link enters viewport", () => { const el = {}; vp.observe(el, "/about"); simulateIntersect(el, true); (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }); (0, import_vitest.it)("does not prefetch when link exits viewport", () => { const el = {}; vp.observe(el, "/about"); simulateIntersect(el, false); (0, import_vitest.expect)(prefetched).toEqual([]); }); (0, import_vitest.it)("only prefetches each href once", () => { const el = {}; vp.observe(el, "/about"); simulateIntersect(el, true); simulateIntersect(el, false); simulateIntersect(el, true); (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }); (0, import_vitest.it)("cleanup re-enables prefetch for href", () => { const el = {}; const cleanup = vp.observe(el, "/about"); simulateIntersect(el, true); (0, import_vitest.expect)(prefetched).toEqual(["/about"]); cleanup(); prefetched.length = 0; vp.observe(el, "/about"); simulateIntersect(el, true); (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }); (0, import_vitest.describe)("memory and performance", () => { (0, import_vitest.it)("does not leak elements after cleanup", () => { const elements = []; const cleanups = []; for (let i = 0; i < 100; i++) { const el = {}; elements.push(el); cleanups.push(vp.observe(el, `/page-${i}`)); } (0, import_vitest.expect)(vp.nodes.size).toBe(100); cleanups.forEach(c => c()); (0, import_vitest.expect)(vp.nodes.size).toBe(0); (0, import_vitest.expect)(vp.done.size).toBe(0); }); (0, import_vitest.it)("handles rapid observe/unobserve cycles", () => { const el = {}; for (let i = 0; i < 100; i++) { const cleanup = vp.observe(el, "/test"); cleanup(); } (0, import_vitest.expect)(vp.nodes.size).toBe(0); }); }); });