fck-honey 0.1.5 → 0.2.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
@@ -7,7 +7,7 @@ Open source lib for Merchants to detect if an end user has Honey browser extensi
7
7
  ## Usage (Browser Global)
8
8
 
9
9
  ```html
10
- <script src="https://cdn.jsdelivr.net/npm/fck-honey"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/fck-honey/dist/honey-detect.min.js"></script>
11
11
  <script>
12
12
  window.fckHoney.listen((el) => {
13
13
  // Decide how you want to handle this.
@@ -32,3 +32,13 @@ listen((el) => {
32
32
  console.log("Honey overlay detected:", el);
33
33
  });
34
34
  ```
35
+
36
+ ## Advanced Options
37
+
38
+ ```js
39
+ window.fckHoney.listen((el, warn) => {
40
+ // Optional: the element is removed automatically by default.
41
+ // warn() shows a built-in overlay message (returns a hide function).
42
+ warn("You must disable the Honey extension to continue.");
43
+ }, { removeHoney: true });
44
+ ```
package/dist/esm/index.js CHANGED
@@ -12,6 +12,36 @@ var __assign = (this && this.__assign) || function () {
12
12
  var DEFAULT_Z_NEAR_MAX = 2147480000;
13
13
  var UUIDISH_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14
14
  var TARGET_SELECTOR = "div[id]";
15
+ var OVERLAY_STYLE_ID = "simple-overlay-styles";
16
+ function showOverlay(message) {
17
+ if (typeof document === "undefined")
18
+ return function () { };
19
+ if (!document.getElementById(OVERLAY_STYLE_ID)) {
20
+ var style = document.createElement("style");
21
+ style.id = OVERLAY_STYLE_ID;
22
+ style.textContent =
23
+ ".simple-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.6);z-index:999999;display:flex;align-items:center;justify-content:center;pointer-events:all;}" +
24
+ ".simple-overlay-message{background:#ffffff;padding:16px 20px;border-radius:8px;font-size:14px;max-width:80%;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,0.3);}";
25
+ document.head.appendChild(style);
26
+ }
27
+ var overlay = document.createElement("div");
28
+ overlay.className = "simple-overlay";
29
+ var messageEl = document.createElement("div");
30
+ messageEl.className = "simple-overlay-message";
31
+ messageEl.innerHTML = message;
32
+ overlay.appendChild(messageEl);
33
+ if (document.body) {
34
+ document.body.appendChild(overlay);
35
+ }
36
+ var prevOverflow = document.body ? document.body.style.overflow : "";
37
+ if (document.body)
38
+ document.body.style.overflow = "hidden";
39
+ return function hideOverlay() {
40
+ overlay.remove();
41
+ if (document.body)
42
+ document.body.style.overflow = prevOverflow;
43
+ };
44
+ }
15
45
  function parseZIndex(cs, el) {
16
46
  var computed = parseInt(cs.zIndex, 10);
17
47
  if (isFinite(computed))
@@ -51,12 +81,14 @@ function looksLikeTargetDiv(el, zNearMax, uuidGate, debug) {
51
81
  console.log("+++ match", el);
52
82
  return true;
53
83
  }
54
- function scanElement(el, seen, zNearMax, uuidGate, debug, onMatch) {
84
+ function scanElement(el, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn) {
55
85
  var _a;
56
86
  if (el instanceof HTMLDivElement && el.matches(TARGET_SELECTOR)) {
57
87
  if (seen.indexOf(el) === -1 && looksLikeTargetDiv(el, zNearMax, uuidGate, debug)) {
58
88
  seen.push(el);
59
- onMatch(el);
89
+ if (removeHoney && el.parentNode)
90
+ el.parentNode.removeChild(el);
91
+ onMatch(el, warn);
60
92
  }
61
93
  }
62
94
  var divs = (_a = el.querySelectorAll) === null || _a === void 0 ? void 0 : _a.call(el, TARGET_SELECTOR);
@@ -66,22 +98,27 @@ function scanElement(el, seen, zNearMax, uuidGate, debug, onMatch) {
66
98
  var d = divs[i];
67
99
  if (seen.indexOf(d) === -1 && looksLikeTargetDiv(d, zNearMax, uuidGate, debug)) {
68
100
  seen.push(d);
69
- onMatch(d);
101
+ if (removeHoney && d.parentNode)
102
+ d.parentNode.removeChild(d);
103
+ onMatch(d, warn);
70
104
  }
71
105
  }
72
106
  }
73
107
  export function startHoneyOverlayObserver(options) {
74
- var _a, _b, _c, _d;
108
+ var _a, _b, _c, _d, _e;
75
109
  if (options === void 0) { options = {}; }
76
110
  var seen = [];
77
111
  var zNearMax = (_a = options.zNearMax) !== null && _a !== void 0 ? _a : DEFAULT_Z_NEAR_MAX;
78
112
  var uuidGate = (_b = options.uuidGate) !== null && _b !== void 0 ? _b : true;
79
113
  var debug = (_c = options.debug) !== null && _c !== void 0 ? _c : false;
80
- var onMatch = (_d = options.onMatch) !== null && _d !== void 0 ? _d : (function () { });
114
+ var removeHoney = (_d = options.removeHoney) !== null && _d !== void 0 ? _d : true;
115
+ var warn = function (message) { return showOverlay(message); };
116
+ var onMatch = (_e = options.onMatch) !== null && _e !== void 0 ? _e : (function () { });
81
117
  var mo = new MutationObserver(function (mutations) {
82
118
  for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {
83
119
  var m = mutations_1[_i];
84
120
  if (debug &&
121
+ document.body &&
85
122
  (m.target === document.body || (m.target instanceof Node && document.body.contains(m.target)))) {
86
123
  console.log("+++ body mutation", m.type, m.target);
87
124
  }
@@ -93,17 +130,17 @@ export function startHoneyOverlayObserver(options) {
93
130
  for (var i = 0; i < m.addedNodes.length; i += 1) {
94
131
  var node = m.addedNodes[i];
95
132
  if (node.nodeType === Node.ELEMENT_NODE) {
96
- scanElement(node, seen, zNearMax, uuidGate, debug, onMatch);
133
+ scanElement(node, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
97
134
  }
98
135
  }
99
136
  }
100
137
  if (m.target instanceof Element) {
101
- scanElement(m.target, seen, zNearMax, uuidGate, debug, onMatch);
138
+ scanElement(m.target, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
102
139
  }
103
140
  }
104
141
  else if (m.type === "attributes") {
105
142
  if (m.target instanceof Element) {
106
- scanElement(m.target, seen, zNearMax, uuidGate, debug, onMatch);
143
+ scanElement(m.target, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
107
144
  }
108
145
  }
109
146
  }
@@ -114,7 +151,7 @@ export function startHoneyOverlayObserver(options) {
114
151
  attributes: true,
115
152
  attributeFilter: ["style", "class", "id"]
116
153
  });
117
- scanElement(document.documentElement, seen, zNearMax, uuidGate, debug, onMatch);
154
+ scanElement(document.documentElement, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
118
155
  return {
119
156
  stop: function () { return mo.disconnect(); }
120
157
  };
@@ -13,6 +13,36 @@ var __assign = (this && this.__assign) || function () {
13
13
  var DEFAULT_Z_NEAR_MAX = 2147480000;
14
14
  var UUIDISH_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
15
15
  var TARGET_SELECTOR = "div[id]";
16
+ var OVERLAY_STYLE_ID = "simple-overlay-styles";
17
+ function showOverlay(message) {
18
+ if (typeof document === "undefined")
19
+ return function () { };
20
+ if (!document.getElementById(OVERLAY_STYLE_ID)) {
21
+ var style = document.createElement("style");
22
+ style.id = OVERLAY_STYLE_ID;
23
+ style.textContent =
24
+ ".simple-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.6);z-index:999999;display:flex;align-items:center;justify-content:center;pointer-events:all;}" +
25
+ ".simple-overlay-message{background:#ffffff;padding:16px 20px;border-radius:8px;font-size:14px;max-width:80%;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,0.3);}";
26
+ document.head.appendChild(style);
27
+ }
28
+ var overlay = document.createElement("div");
29
+ overlay.className = "simple-overlay";
30
+ var messageEl = document.createElement("div");
31
+ messageEl.className = "simple-overlay-message";
32
+ messageEl.innerHTML = message;
33
+ overlay.appendChild(messageEl);
34
+ if (document.body) {
35
+ document.body.appendChild(overlay);
36
+ }
37
+ var prevOverflow = document.body ? document.body.style.overflow : "";
38
+ if (document.body)
39
+ document.body.style.overflow = "hidden";
40
+ return function hideOverlay() {
41
+ overlay.remove();
42
+ if (document.body)
43
+ document.body.style.overflow = prevOverflow;
44
+ };
45
+ }
16
46
  function parseZIndex(cs, el) {
17
47
  var computed = parseInt(cs.zIndex, 10);
18
48
  if (isFinite(computed))
@@ -52,12 +82,14 @@ function looksLikeTargetDiv(el, zNearMax, uuidGate, debug) {
52
82
  console.log("+++ match", el);
53
83
  return true;
54
84
  }
55
- function scanElement(el, seen, zNearMax, uuidGate, debug, onMatch) {
85
+ function scanElement(el, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn) {
56
86
  var _a;
57
87
  if (el instanceof HTMLDivElement && el.matches(TARGET_SELECTOR)) {
58
88
  if (seen.indexOf(el) === -1 && looksLikeTargetDiv(el, zNearMax, uuidGate, debug)) {
59
89
  seen.push(el);
60
- onMatch(el);
90
+ if (removeHoney && el.parentNode)
91
+ el.parentNode.removeChild(el);
92
+ onMatch(el, warn);
61
93
  }
62
94
  }
63
95
  var divs = (_a = el.querySelectorAll) === null || _a === void 0 ? void 0 : _a.call(el, TARGET_SELECTOR);
@@ -67,22 +99,27 @@ function scanElement(el, seen, zNearMax, uuidGate, debug, onMatch) {
67
99
  var d = divs[i];
68
100
  if (seen.indexOf(d) === -1 && looksLikeTargetDiv(d, zNearMax, uuidGate, debug)) {
69
101
  seen.push(d);
70
- onMatch(d);
102
+ if (removeHoney && d.parentNode)
103
+ d.parentNode.removeChild(d);
104
+ onMatch(d, warn);
71
105
  }
72
106
  }
73
107
  }
74
108
  function startHoneyOverlayObserver(options) {
75
- var _a, _b, _c, _d;
109
+ var _a, _b, _c, _d, _e;
76
110
  if (options === void 0) { options = {}; }
77
111
  var seen = [];
78
112
  var zNearMax = (_a = options.zNearMax) !== null && _a !== void 0 ? _a : DEFAULT_Z_NEAR_MAX;
79
113
  var uuidGate = (_b = options.uuidGate) !== null && _b !== void 0 ? _b : true;
80
114
  var debug = (_c = options.debug) !== null && _c !== void 0 ? _c : false;
81
- var onMatch = (_d = options.onMatch) !== null && _d !== void 0 ? _d : (function () { });
115
+ var removeHoney = (_d = options.removeHoney) !== null && _d !== void 0 ? _d : true;
116
+ var warn = function (message) { return showOverlay(message); };
117
+ var onMatch = (_e = options.onMatch) !== null && _e !== void 0 ? _e : (function () { });
82
118
  var mo = new MutationObserver(function (mutations) {
83
119
  for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {
84
120
  var m = mutations_1[_i];
85
121
  if (debug &&
122
+ document.body &&
86
123
  (m.target === document.body || (m.target instanceof Node && document.body.contains(m.target)))) {
87
124
  console.log("+++ body mutation", m.type, m.target);
88
125
  }
@@ -94,17 +131,17 @@ function startHoneyOverlayObserver(options) {
94
131
  for (var i = 0; i < m.addedNodes.length; i += 1) {
95
132
  var node = m.addedNodes[i];
96
133
  if (node.nodeType === Node.ELEMENT_NODE) {
97
- scanElement(node, seen, zNearMax, uuidGate, debug, onMatch);
134
+ scanElement(node, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
98
135
  }
99
136
  }
100
137
  }
101
138
  if (m.target instanceof Element) {
102
- scanElement(m.target, seen, zNearMax, uuidGate, debug, onMatch);
139
+ scanElement(m.target, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
103
140
  }
104
141
  }
105
142
  else if (m.type === "attributes") {
106
143
  if (m.target instanceof Element) {
107
- scanElement(m.target, seen, zNearMax, uuidGate, debug, onMatch);
144
+ scanElement(m.target, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
108
145
  }
109
146
  }
110
147
  }
@@ -115,7 +152,7 @@ function startHoneyOverlayObserver(options) {
115
152
  attributes: true,
116
153
  attributeFilter: ["style", "class", "id"]
117
154
  });
118
- scanElement(document.documentElement, seen, zNearMax, uuidGate, debug, onMatch);
155
+ scanElement(document.documentElement, seen, zNearMax, uuidGate, debug, removeHoney, onMatch, warn);
119
156
  return {
120
157
  stop: function () { return mo.disconnect(); }
121
158
  };
@@ -1,9 +1,11 @@
1
- export type MatchCallback = (el: HTMLDivElement) => void;
1
+ export type WarnCallback = (message: string) => () => void;
2
+ export type MatchCallback = (el: HTMLDivElement, warn: WarnCallback) => void;
2
3
  export interface ObserverOptions {
3
4
  onMatch?: MatchCallback;
4
5
  uuidGate?: boolean;
5
6
  zNearMax?: number;
6
7
  debug?: boolean;
8
+ removeHoney?: boolean;
7
9
  }
8
10
  export interface ObserverHandle {
9
11
  stop: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fck-honey",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "description": "Detects Honey browser extension overlays for merchants.",
5
5
  "license": "MIT",
6
6
  "main": "dist/honey-detect.js",