hyperinstant 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
- # HyperInstant v1.1.0 (Legacy-fast)
1
+ # HyperInstant v1.1.1 (Legacy-fast)
2
2
 
3
- This package is intentionally a **legacy-fast** build: behavior matches the original **0.1.0** approach
4
- (simple, ultra-light, perceived-speed first).
3
+ Same ultra-light behavior as 0.1.0 / 1.1.0, with **practical fixes**:
4
+ - **Same-site support**: allows `www.` / non-`www` and subdomains by default
5
+ - **More reliable events**: uses `pointerover` + capture listeners
5
6
 
6
7
  ## CDN
7
8
  ```html
@@ -11,13 +12,10 @@ This package is intentionally a **legacy-fast** build: behavior matches the orig
11
12
  hoverDelay: 65,
12
13
  maxPrefetch: 6,
13
14
  maxPrerender: 2,
14
- deny: ["/cart", "/checkout", "/my-account", "/logout", "add-to-cart"],
15
+ sameSite: true, // allow www/non-www + subdomains (default true)
16
+ deny: ["/login","/logout","/customer/info","/cart","/shoppingcart","/checkout","addproducttocart"],
15
17
  debug: false
16
18
  };
17
19
  </script>
18
- <script src="https://unpkg.com/hyperinstant@1.1.0/dist/hyperinstant.min.js" defer></script>
20
+ <script src="https://unpkg.com/hyperinstant@1.1.1/dist/hyperinstant.min.js" defer></script>
19
21
  ```
20
-
21
- ## Notes
22
- - Uses `<link rel="prefetch|prerender">` for documents
23
- - No adapters / no auto-tuning / no overlays (by design)
@@ -1,15 +1,18 @@
1
- /*! HyperInstant v1.1.0 (legacy-fast, 0.1.0 behavior) | MIT | Putia Web */
1
+ /*! HyperInstant v1.1.1 (legacy-fast) | MIT | Putia Web */
2
2
  (function () {
3
3
  if (window.__HYPERINSTANT_LOADED__) return;
4
4
  window.__HYPERINSTANT_LOADED__ = true;
5
5
 
6
6
  var cfg = window.HyperInstant || {};
7
+ var VERSION = "1.1.1";
8
+
7
9
  var strategy = (cfg.strategy || "auto").toLowerCase();
8
10
  var hoverDelay = (typeof cfg.hoverDelay === "number") ? cfg.hoverDelay : 65;
9
11
  var maxPrefetch = (typeof cfg.maxPrefetch === "number") ? cfg.maxPrefetch : 6;
10
12
  var maxPrerender = (typeof cfg.maxPrerender === "number") ? cfg.maxPrerender : 2;
11
13
  var deny = Array.isArray(cfg.deny) ? cfg.deny : [];
12
14
  var debug = !!cfg.debug;
15
+ var sameSite = (cfg.sameSite === undefined) ? true : !!cfg.sameSite;
13
16
 
14
17
  var prefetched = new Set();
15
18
  var prerendered = new Set();
@@ -27,29 +30,52 @@
27
30
  }
28
31
 
29
32
  function normalizeUrl(url) {
30
- try { var u = new URL(url, location.href); u.hash = ""; return u.toString(); }
31
- catch (e) { return ""; }
33
+ try {
34
+ var u = new URL(url, location.href);
35
+ u.hash = "";
36
+ return u.toString();
37
+ } catch (e) { return ""; }
38
+ }
39
+
40
+ function baseHost(hostname) {
41
+ hostname = String(hostname || "").toLowerCase();
42
+ return hostname.replace(/^www\./, "");
32
43
  }
33
44
 
34
- function isSameOrigin(url) {
35
- try { return new URL(url, location.href).origin === location.origin; }
36
- catch (e) { return false; }
45
+ function isAllowedOrigin(url) {
46
+ try {
47
+ var u = new URL(url, location.href);
48
+ if (u.origin === location.origin) return true;
49
+
50
+ if (!sameSite) return false;
51
+
52
+ // allow www/non-www and subdomains for same base host
53
+ var here = baseHost(location.hostname);
54
+ var there = baseHost(u.hostname);
55
+ if (there === here) return true;
56
+ if (there.endsWith("." + here)) return true;
57
+ if (here.endsWith("." + there)) return true; // just in case
58
+
59
+ return false;
60
+ } catch (e) {
61
+ return false;
62
+ }
37
63
  }
38
64
 
39
65
  function isDenied(url) {
40
66
  if (!url) return true;
41
- if (!isSameOrigin(url)) return true;
67
+ if (!isAllowedOrigin(url)) return true;
42
68
 
43
- var u = String(url);
69
+ var u = String(url).toLowerCase();
44
70
  for (var i = 0; i < deny.length; i++) {
45
71
  var d = deny[i];
46
- if (d && u.indexOf(String(d)) !== -1) return true;
72
+ if (d && u.indexOf(String(d).toLowerCase()) !== -1) return true;
47
73
  }
48
74
  return false;
49
75
  }
50
76
 
51
- function enqueue(url) {
52
- url = normalizeUrl(url);
77
+ function enqueue(rawUrl) {
78
+ var url = normalizeUrl(rawUrl);
53
79
  if (!url) return;
54
80
  if (isDenied(url)) return;
55
81
  if (prefetched.has(url) || prerendered.has(url) || inflight.has(url)) return;
@@ -76,49 +102,59 @@
76
102
  if (rel === "prerender") usedPrerender++;
77
103
  else usedPrefetch++;
78
104
 
79
- link.onload = function () {
80
- inflight.delete(url);
81
- if (rel === "prerender") prerendered.add(url);
82
- else prefetched.add(url);
83
- if (debug) console.log("[HyperInstant]", rel, url);
84
- };
85
- link.onerror = function () { inflight.delete(url); };
105
+ (function(u, r){
106
+ link.onload = function () {
107
+ inflight.delete(u);
108
+ if (r === "prerender") prerendered.add(u);
109
+ else prefetched.add(u);
110
+ if (debug) console.log("[HyperInstant]", r, u);
111
+ };
112
+ link.onerror = function () { inflight.delete(u); };
113
+ })(url, rel);
86
114
 
87
115
  document.head.appendChild(link);
88
116
  }
89
117
 
90
118
  var t = null;
119
+ function getAnchor(target) {
120
+ var a = target && target.closest ? target.closest("a[href]") : null;
121
+ if (!a || !a.href) return null;
122
+ if (a.target && a.target !== "_self") return null;
123
+ if (a.getAttribute("data-no-instant") !== null) return null;
124
+ return a;
125
+ }
126
+
91
127
  function onHover(e) {
92
- var a = e.target && e.target.closest ? e.target.closest("a[href]") : null;
93
- if (!a || !a.href) return;
94
- if (a.target && a.target !== "_self") return;
95
- if (a.getAttribute("data-no-instant") !== null) return;
128
+ var a = getAnchor(e.target);
129
+ if (!a) return;
96
130
 
97
131
  clearTimeout(t);
98
132
  t = setTimeout(function () { enqueue(a.href); }, hoverDelay);
99
133
  }
100
134
 
101
135
  function onImmediate(e) {
102
- var a = e.target && e.target.closest ? e.target.closest("a[href]") : null;
103
- if (!a || !a.href) return;
104
- if (a.target && a.target !== "_self") return;
105
- if (a.getAttribute("data-no-instant") !== null) return;
136
+ var a = getAnchor(e.target);
137
+ if (!a) return;
106
138
  enqueue(a.href);
107
139
  }
108
140
 
109
- document.addEventListener("mouseover", onHover, { passive: true });
110
- document.addEventListener("touchstart", onImmediate, { passive: true });
111
- document.addEventListener("mousedown", onImmediate, { passive: true });
112
- document.addEventListener("focusin", onImmediate, { passive: true });
141
+ // More reliable than mouseover in many modern themes
142
+ document.addEventListener("pointerover", onHover, { passive: true, capture: true });
143
+ document.addEventListener("touchstart", onImmediate, { passive: true, capture: true });
144
+ document.addEventListener("mousedown", onImmediate, { passive: true, capture: true });
145
+ document.addEventListener("focusin", onImmediate, { passive: true, capture: true });
113
146
 
114
147
  window.addEventListener("pageshow", function () {
115
148
  usedPrefetch = 0;
116
149
  usedPrerender = 0;
117
150
  });
118
151
 
152
+ window.HyperInstant = window.HyperInstant || {};
153
+ window.HyperInstant.version = VERSION;
154
+
119
155
  if (debug) {
120
- console.log("[HyperInstant] v1.1.0 legacy-fast loaded", {
121
- strategy: strategy, hoverDelay: hoverDelay, maxPrefetch: maxPrefetch, maxPrerender: maxPrerender
156
+ console.log("[HyperInstant] v"+VERSION+" legacy-fast loaded", {
157
+ strategy: strategy, hoverDelay: hoverDelay, maxPrefetch: maxPrefetch, maxPrerender: maxPrerender, sameSite: sameSite
122
158
  });
123
159
  }
124
160
  })();
@@ -1 +1 @@
1
- /*! HyperInstant v1.1.0 (legacy-fast, 0.1.0 behavior) | MIT | Putia Web */ (function (){if (window.__HYPERINSTANT_LOADED__) return; window.__HYPERINSTANT_LOADED__ = true; var cfg = window.HyperInstant ||{}; var strategy = (cfg.strategy || "auto").toLowerCase(); var hoverDelay = (typeof cfg.hoverDelay === "number") ? cfg.hoverDelay : 65; var maxPrefetch = (typeof cfg.maxPrefetch === "number") ? cfg.maxPrefetch : 6; var maxPrerender = (typeof cfg.maxPrerender === "number") ? cfg.maxPrerender : 2; var deny = Array.isArray(cfg.deny) ? cfg.deny : []; var debug = !!cfg.debug; var prefetched = new Set(); var prerendered = new Set(); var inflight = new Set(); var usedPrefetch = 0; var usedPrerender = 0; function supportsPrerender(){try{return "relList" in HTMLLinkElement.prototype && HTMLLinkElement.prototype.relList && HTMLLinkElement.prototype.relList.supports && HTMLLinkElement.prototype.relList.supports("prerender");} catch (e){return false;}} function normalizeUrl(url){try{var u = new URL(url, location.href); u.hash = ""; return u.toString();} catch (e){return "";}} function isSameOrigin(url){try{return new URL(url, location.href).origin === location.origin;} catch (e){return false;}} function isDenied(url){if (!url) return true; if (!isSameOrigin(url)) return true; var u = String(url); for (var i = 0; i < deny.length; i++){var d = deny[i]; if (d && u.indexOf(String(d)) !== -1) return true;} return false;} function enqueue(url){url = normalizeUrl(url); if (!url) return; if (isDenied(url)) return; if (prefetched.has(url) || prerendered.has(url) || inflight.has(url)) return; var canPrerender = supportsPrerender() && (usedPrerender < maxPrerender); var canPrefetch = (usedPrefetch < maxPrefetch); var rel = "prefetch"; if (strategy === "prefetch") rel = "prefetch"; else if (strategy === "prerender") rel = canPrerender ? "prerender" : "prefetch"; else rel = canPrerender ? "prerender" : "prefetch"; if (rel === "prefetch" && !canPrefetch) return; if (rel === "prerender" && !canPrerender) rel = canPrefetch ? "prefetch" : ""; if (!rel) return; inflight.add(url); var link = document.createElement("link"); link.rel = rel; link.href = url; link.as = "document"; if (rel === "prerender") usedPrerender++; else usedPrefetch++; link.onload = function (){inflight.delete(url); if (rel === "prerender") prerendered.add(url); else prefetched.add(url); if (debug) console.log("[HyperInstant]", rel, url);}; link.onerror = function (){inflight.delete(url);}; document.head.appendChild(link);} var t = null; function onHover(e){var a = e.target && e.target.closest ? e.target.closest("a[href]") : null; if (!a || !a.href) return; if (a.target && a.target !== "_self") return; if (a.getAttribute("data-no-instant") !== null) return; clearTimeout(t); t = setTimeout(function (){enqueue(a.href);}, hoverDelay);} function onImmediate(e){var a = e.target && e.target.closest ? e.target.closest("a[href]") : null; if (!a || !a.href) return; if (a.target && a.target !== "_self") return; if (a.getAttribute("data-no-instant") !== null) return; enqueue(a.href);} document.addEventListener("mouseover", onHover,{passive: true}); document.addEventListener("touchstart", onImmediate,{passive: true}); document.addEventListener("mousedown", onImmediate,{passive: true}); document.addEventListener("focusin", onImmediate,{passive: true}); window.addEventListener("pageshow", function (){usedPrefetch = 0; usedPrerender = 0;}); if (debug){console.log("[HyperInstant] v1.1.0 legacy-fast loaded",{strategy: strategy, hoverDelay: hoverDelay, maxPrefetch: maxPrefetch, maxPrerender: maxPrerender});}})();
1
+ /*! HyperInstant v1.1.1 (legacy-fast) | MIT | Putia Web */ (function (){if (window.__HYPERINSTANT_LOADED__) return; window.__HYPERINSTANT_LOADED__ = true; var cfg = window.HyperInstant ||{}; var VERSION = "1.1.1"; var strategy = (cfg.strategy || "auto").toLowerCase(); var hoverDelay = (typeof cfg.hoverDelay === "number") ? cfg.hoverDelay : 65; var maxPrefetch = (typeof cfg.maxPrefetch === "number") ? cfg.maxPrefetch : 6; var maxPrerender = (typeof cfg.maxPrerender === "number") ? cfg.maxPrerender : 2; var deny = Array.isArray(cfg.deny) ? cfg.deny : []; var debug = !!cfg.debug; var sameSite = (cfg.sameSite === undefined) ? true : !!cfg.sameSite; var prefetched = new Set(); var prerendered = new Set(); var inflight = new Set(); var usedPrefetch = 0; var usedPrerender = 0; function supportsPrerender(){try{return "relList" in HTMLLinkElement.prototype && HTMLLinkElement.prototype.relList && HTMLLinkElement.prototype.relList.supports && HTMLLinkElement.prototype.relList.supports("prerender");} catch (e){return false;}} function normalizeUrl(url){try{var u = new URL(url, location.href); u.hash = ""; return u.toString();} catch (e){return "";}} function baseHost(hostname){hostname = String(hostname || "").toLowerCase(); return hostname.replace(/^www\./, "");} function isAllowedOrigin(url){try{var u = new URL(url, location.href); if (u.origin === location.origin) return true; if (!sameSite) return false; // allow www/non-www and subdomains for same base host var here = baseHost(location.hostname); var there = baseHost(u.hostname); if (there === here) return true; if (there.endsWith("." + here)) return true; if (here.endsWith("." + there)) return true; // just in case return false;} catch (e){return false;}} function isDenied(url){if (!url) return true; if (!isAllowedOrigin(url)) return true; var u = String(url).toLowerCase(); for (var i = 0; i < deny.length; i++){var d = deny[i]; if (d && u.indexOf(String(d).toLowerCase()) !== -1) return true;} return false;} function enqueue(rawUrl){var url = normalizeUrl(rawUrl); if (!url) return; if (isDenied(url)) return; if (prefetched.has(url) || prerendered.has(url) || inflight.has(url)) return; var canPrerender = supportsPrerender() && (usedPrerender < maxPrerender); var canPrefetch = (usedPrefetch < maxPrefetch); var rel = "prefetch"; if (strategy === "prefetch") rel = "prefetch"; else if (strategy === "prerender") rel = canPrerender ? "prerender" : "prefetch"; else rel = canPrerender ? "prerender" : "prefetch"; if (rel === "prefetch" && !canPrefetch) return; if (rel === "prerender" && !canPrerender) rel = canPrefetch ? "prefetch" : ""; if (!rel) return; inflight.add(url); var link = document.createElement("link"); link.rel = rel; link.href = url; link.as = "document"; if (rel === "prerender") usedPrerender++; else usedPrefetch++; (function(u, r){link.onload = function (){inflight.delete(u); if (r === "prerender") prerendered.add(u); else prefetched.add(u); if (debug) console.log("[HyperInstant]", r, u);}; link.onerror = function (){inflight.delete(u);};})(url, rel); document.head.appendChild(link);} var t = null; function getAnchor(target){var a = target && target.closest ? target.closest("a[href]") : null; if (!a || !a.href) return null; if (a.target && a.target !== "_self") return null; if (a.getAttribute("data-no-instant") !== null) return null; return a;} function onHover(e){var a = getAnchor(e.target); if (!a) return; clearTimeout(t); t = setTimeout(function (){enqueue(a.href);}, hoverDelay);} function onImmediate(e){var a = getAnchor(e.target); if (!a) return; enqueue(a.href);} // More reliable than mouseover in many modern themes document.addEventListener("pointerover", onHover,{passive: true, capture: true}); document.addEventListener("touchstart", onImmediate,{passive: true, capture: true}); document.addEventListener("mousedown", onImmediate,{passive: true, capture: true}); document.addEventListener("focusin", onImmediate,{passive: true, capture: true}); window.addEventListener("pageshow", function (){usedPrefetch = 0; usedPrerender = 0;}); window.HyperInstant = window.HyperInstant ||{}; window.HyperInstant.version = VERSION; if (debug){console.log("[HyperInstant] v"+VERSION+" legacy-fast loaded",{strategy: strategy, hoverDelay: hoverDelay, maxPrefetch: maxPrefetch, maxPrerender: maxPrerender, sameSite: sameSite});}})();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hyperinstant",
3
- "version": "1.1.0",
4
- "description": "HyperInstant legacy-fast build (same behavior as 0.1.0), packaged as 1.1.0.",
3
+ "version": "1.1.1",
4
+ "description": "HyperInstant legacy-fast build (0.1.0 behavior) with same-site support fixes.",
5
5
  "main": "dist/hyperinstant.min.js",
6
6
  "module": "dist/hyperinstant.js",
7
7
  "files": [
@@ -12,7 +12,8 @@
12
12
  "prefetch",
13
13
  "prerender",
14
14
  "instant-page",
15
- "web-performance"
15
+ "web-performance",
16
+ "legacy-fast"
16
17
  ],
17
18
  "author": "Putia Web",
18
19
  "license": "MIT"