one
Version:
One is a new React Framework that makes Vite serve both native and web.
88 lines • 2.81 kB
JavaScript
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);
});
});
});