UNPKG

one

Version:

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

126 lines (123 loc) 4 kB
"use strict"; 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