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 +7 -9
- package/dist/hyperinstant.js +68 -32
- package/dist/hyperinstant.min.js +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
# HyperInstant v1.1.
|
|
1
|
+
# HyperInstant v1.1.1 (Legacy-fast)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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.
|
|
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)
|
package/dist/hyperinstant.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
/*! HyperInstant v1.1.
|
|
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 {
|
|
31
|
-
|
|
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
|
|
35
|
-
try {
|
|
36
|
-
|
|
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 (!
|
|
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(
|
|
52
|
-
url = normalizeUrl(
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
93
|
-
if (!a
|
|
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
|
|
103
|
-
if (!a
|
|
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
|
-
|
|
110
|
-
document.addEventListener("
|
|
111
|
-
document.addEventListener("
|
|
112
|
-
document.addEventListener("
|
|
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]
|
|
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
|
})();
|
package/dist/hyperinstant.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! HyperInstant v1.1.
|
|
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.
|
|
4
|
-
"description": "HyperInstant legacy-fast build (
|
|
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"
|