one
Version:
One is a new React Framework that makes Vite serve both native and web.
126 lines (123 loc) • 4 kB
JavaScript
;
var import_vitest = require("vitest");
var import_prefetchViewport = require("./prefetchViewport.native.js");
function _class_call_check(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _create_class(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
var mockIOCallback;
var mockObserved = /* @__PURE__ */new Set();
import_vitest.vi.stubGlobal("IntersectionObserver", /* @__PURE__ */function () {
"use strict";
function _class(callback) {
_class_call_check(this, _class);
mockIOCallback = callback;
}
_create_class(_class, [{
key: "observe",
value: function observe(el) {
mockObserved.add(el);
}
}, {
key: "unobserve",
value: function unobserve(el) {
mockObserved.delete(el);
}
}, {
key: "disconnect",
value: function disconnect() {
mockObserved.clear();
}
}]);
return _class;
}());
function simulateIntersect(el, isIntersecting) {
mockIOCallback([{
target: el,
isIntersecting
}], {});
}
(0, import_vitest.describe)("prefetchViewport", function () {
var prefetched;
var vp;
(0, import_vitest.beforeEach)(function () {
prefetched = [];
mockObserved.clear();
vp = (0, import_prefetchViewport.createPrefetchViewport)();
vp.start(function (href) {
return prefetched.push(href);
});
});
(0, import_vitest.it)("prefetches when link enters viewport", function () {
var 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", function () {
var el = {};
vp.observe(el, "/about");
simulateIntersect(el, false);
(0, import_vitest.expect)(prefetched).toEqual([]);
});
(0, import_vitest.it)("only prefetches each href once", function () {
var 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", function () {
var el = {};
var 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", function () {
(0, import_vitest.it)("does not leak elements after cleanup", function () {
var elements = [];
var cleanups = [];
for (var i = 0; i < 100; i++) {
var el = {};
elements.push(el);
cleanups.push(vp.observe(el, `/page-${i}`));
}
(0, import_vitest.expect)(vp.nodes.size).toBe(100);
cleanups.forEach(function (c) {
return 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", function () {
var el = {};
for (var i = 0; i < 100; i++) {
var cleanup = vp.observe(el, "/test");
cleanup();
}
(0, import_vitest.expect)(vp.nodes.size).toBe(0);
});
});
});
//# sourceMappingURL=prefetchViewport.test.native.js.map