@searchspring/snap-toolbox 0.76.1 → 0.78.0
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/dist/cjs/DomTargeter/DomTargeter.d.ts +6 -1
- package/dist/cjs/DomTargeter/DomTargeter.d.ts.map +1 -1
- package/dist/cjs/DomTargeter/DomTargeter.js +71 -6
- package/dist/esm/DomTargeter/DomTargeter.d.ts +6 -1
- package/dist/esm/DomTargeter/DomTargeter.d.ts.map +1 -1
- package/dist/esm/DomTargeter/DomTargeter.js +57 -6
- package/package.json +2 -2
|
@@ -9,17 +9,22 @@ export type Target = {
|
|
|
9
9
|
autoRetarget?: boolean;
|
|
10
10
|
unsetTargetMinHeight?: boolean;
|
|
11
11
|
clickRetarget?: boolean | string;
|
|
12
|
+
navigationRetarget?: boolean;
|
|
12
13
|
[any: string]: unknown;
|
|
13
14
|
};
|
|
14
|
-
export type OnTarget = (target: Target, elem: Element, originalElem?: Element) => void | Promise<void>;
|
|
15
|
+
export type OnTarget = (target: Target, elem: Element, originalElem?: Element, targeter?: DomTargeter) => void | Promise<void>;
|
|
15
16
|
export declare class DomTargeter {
|
|
16
17
|
private targets;
|
|
17
18
|
private onTarget;
|
|
18
19
|
private document;
|
|
19
20
|
private styleBlockRefs;
|
|
20
21
|
private targetedElems;
|
|
22
|
+
private abortController?;
|
|
21
23
|
constructor(targets: Array<Target>, onTarget: OnTarget, document?: Document);
|
|
22
24
|
getTargets(): Array<Target>;
|
|
25
|
+
getTargetedElems(): ReadonlyArray<Element>;
|
|
26
|
+
releaseTargets(elems?: ReadonlyArray<Element>): void;
|
|
27
|
+
destroy(): void;
|
|
23
28
|
retarget(): void;
|
|
24
29
|
unhideTarget: (selector: string) => void;
|
|
25
30
|
hideTarget: (selector: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomTargeter.d.ts","sourceRoot":"","sources":["../../../src/DomTargeter/DomTargeter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QAC9D,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;KACnE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DomTargeter.d.ts","sourceRoot":"","sources":["../../../src/DomTargeter/DomTargeter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QAC9D,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;KACnE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAI/H,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ;IA6F3E,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAI3B,gBAAgB,IAAI,aAAa,CAAC,OAAO,CAAC;IAK1C,cAAc,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI;IAepD,OAAO,IAAI,IAAI;IAMf,QAAQ,IAAI,IAAI;IAuEhB,YAAY,aAAc,MAAM,KAAG,IAAI,CASrC;IAEF,UAAU,aAAc,MAAM,KAAG,IAAI,CASnC;IAEF,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;CA2Cd"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.DomTargeter = void 0;
|
|
4
13
|
var globallyTargetedElems = [];
|
|
@@ -30,12 +39,25 @@ var DomTargeter = /** @class */ (function () {
|
|
|
30
39
|
_this.styleBlockRefs[selector] = styleBlock;
|
|
31
40
|
};
|
|
32
41
|
this.document = document || window.document;
|
|
42
|
+
// use the document's own window AbortController to ensure realm compatibility (e.g., JSDOM)
|
|
43
|
+
// and gracefully handle environments where AbortController is not available (e.g., IE11)
|
|
44
|
+
try {
|
|
45
|
+
this.abortController = new (this.document.defaultView || window).AbortController();
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
// AbortController not available - listeners won't auto-cleanup on destroy()
|
|
49
|
+
}
|
|
33
50
|
this.targets = targets;
|
|
34
51
|
this.onTarget = onTarget;
|
|
35
52
|
this.retarget();
|
|
36
53
|
this.targets.forEach(function (target) {
|
|
54
|
+
var _a, _b, _c, _d;
|
|
37
55
|
var timeoutTime = 100;
|
|
38
56
|
var checker = function () {
|
|
57
|
+
var _a;
|
|
58
|
+
if ((_a = _this.abortController) === null || _a === void 0 ? void 0 : _a.signal.aborted) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
39
61
|
// lets not just keep trying forever - this waits roughly 12 seconds before giving up.
|
|
40
62
|
if (timeoutTime < 2000) {
|
|
41
63
|
// increase the time till next check
|
|
@@ -58,12 +80,25 @@ var DomTargeter = /** @class */ (function () {
|
|
|
58
80
|
clickElems = Array.from(_this.document.querySelectorAll(target.clickRetarget));
|
|
59
81
|
}
|
|
60
82
|
clickElems.map(function (elem) {
|
|
83
|
+
var _a;
|
|
61
84
|
elem.addEventListener('click', function () {
|
|
62
85
|
timeoutTime = 100;
|
|
63
|
-
checker
|
|
64
|
-
});
|
|
86
|
+
setTimeout(checker); // allow the click to complete
|
|
87
|
+
}, { capture: true, signal: (_a = _this.abortController) === null || _a === void 0 ? void 0 : _a.signal });
|
|
65
88
|
});
|
|
66
89
|
}
|
|
90
|
+
// listen for SPA navigations via the Navigation API to restart retargeting
|
|
91
|
+
if (target.navigationRetarget) {
|
|
92
|
+
try {
|
|
93
|
+
(_b = (_a = _this.document.defaultView) === null || _a === void 0 ? void 0 : _a.navigation) === null || _b === void 0 ? void 0 : _b.addEventListener('navigate', function () {
|
|
94
|
+
timeoutTime = 100;
|
|
95
|
+
checker();
|
|
96
|
+
}, { signal: (_c = _this.abortController) === null || _c === void 0 ? void 0 : _c.signal });
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
// Navigation API not available
|
|
100
|
+
}
|
|
101
|
+
}
|
|
67
102
|
if (target.autoRetarget) {
|
|
68
103
|
// do initial retargeting check
|
|
69
104
|
checker();
|
|
@@ -77,16 +112,45 @@ var DomTargeter = /** @class */ (function () {
|
|
|
77
112
|
_this.document.addEventListener('DOMContentLoaded', function () {
|
|
78
113
|
_this.retarget();
|
|
79
114
|
target.hideTarget && _this.unhideTarget(target.selector);
|
|
80
|
-
});
|
|
115
|
+
}, { signal: (_d = _this.abortController) === null || _d === void 0 ? void 0 : _d.signal });
|
|
81
116
|
}
|
|
82
117
|
});
|
|
83
118
|
}
|
|
84
119
|
DomTargeter.prototype.getTargets = function () {
|
|
85
120
|
return this.targets;
|
|
86
121
|
};
|
|
122
|
+
DomTargeter.prototype.getTargetedElems = function () {
|
|
123
|
+
this.targetedElems = this.targetedElems.filter(function (elem) { return elem.isConnected; });
|
|
124
|
+
return __spreadArray([], this.targetedElems, true);
|
|
125
|
+
};
|
|
126
|
+
DomTargeter.prototype.releaseTargets = function (elems) {
|
|
127
|
+
var toRelease = elems || this.targetedElems;
|
|
128
|
+
toRelease.forEach(function (elem) {
|
|
129
|
+
var idx = globallyTargetedElems.indexOf(elem);
|
|
130
|
+
if (idx !== -1) {
|
|
131
|
+
globallyTargetedElems.splice(idx, 1);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (elems) {
|
|
135
|
+
this.targetedElems = this.targetedElems.filter(function (elem) { return !elems.includes(elem); });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.targetedElems = [];
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
DomTargeter.prototype.destroy = function () {
|
|
142
|
+
var _this = this;
|
|
143
|
+
var _a;
|
|
144
|
+
(_a = this.abortController) === null || _a === void 0 ? void 0 : _a.abort();
|
|
145
|
+
this.releaseTargets();
|
|
146
|
+
Object.keys(this.styleBlockRefs).forEach(function (selector) { return _this.unhideTarget(selector); });
|
|
147
|
+
};
|
|
87
148
|
DomTargeter.prototype.retarget = function () {
|
|
88
149
|
var _this = this;
|
|
89
150
|
var _a, _b;
|
|
151
|
+
// prune references to elements no longer in the DOM
|
|
152
|
+
globallyTargetedElems = globallyTargetedElems.filter(function (elem) { return elem.isConnected; });
|
|
153
|
+
this.targetedElems = this.targetedElems.filter(function (elem) { return elem.isConnected; });
|
|
90
154
|
var targetElemPairs = this.targets.flatMap(function (target) {
|
|
91
155
|
var _a;
|
|
92
156
|
// hide targets before found
|
|
@@ -108,11 +172,12 @@ var DomTargeter = /** @class */ (function () {
|
|
|
108
172
|
for (var _i = 0, targetElemPairs_1 = targetElemPairs; _i < targetElemPairs_1.length; _i++) {
|
|
109
173
|
var _c = targetElemPairs_1[_i], target = _c.target, elem = _c.elem;
|
|
110
174
|
try {
|
|
175
|
+
// track targeted elements
|
|
176
|
+
this.targetedElems = this.targetedElems.concat(elem);
|
|
111
177
|
if (target.inject) {
|
|
112
178
|
var injectedElem = this.inject(elem, target);
|
|
113
|
-
this.targetedElems = this.targetedElems.concat(elem);
|
|
114
179
|
// handle both sync and async onTarget functions
|
|
115
|
-
var result = this.onTarget(target, injectedElem, elem);
|
|
180
|
+
var result = this.onTarget(target, injectedElem, elem, this);
|
|
116
181
|
if (result && typeof result.then === 'function') {
|
|
117
182
|
// async function - handle promise
|
|
118
183
|
result.catch(function (error) {
|
|
@@ -127,7 +192,7 @@ var DomTargeter = /** @class */ (function () {
|
|
|
127
192
|
while (elem.firstChild && elem.removeChild(elem.firstChild))
|
|
128
193
|
;
|
|
129
194
|
// handle both sync and async onTarget functions
|
|
130
|
-
var result = this.onTarget(target, elem);
|
|
195
|
+
var result = this.onTarget(target, elem, undefined, this);
|
|
131
196
|
if (result && typeof result.then === 'function') {
|
|
132
197
|
// async function - handle promise
|
|
133
198
|
result.catch(function (error) {
|
|
@@ -9,17 +9,22 @@ export type Target = {
|
|
|
9
9
|
autoRetarget?: boolean;
|
|
10
10
|
unsetTargetMinHeight?: boolean;
|
|
11
11
|
clickRetarget?: boolean | string;
|
|
12
|
+
navigationRetarget?: boolean;
|
|
12
13
|
[any: string]: unknown;
|
|
13
14
|
};
|
|
14
|
-
export type OnTarget = (target: Target, elem: Element, originalElem?: Element) => void | Promise<void>;
|
|
15
|
+
export type OnTarget = (target: Target, elem: Element, originalElem?: Element, targeter?: DomTargeter) => void | Promise<void>;
|
|
15
16
|
export declare class DomTargeter {
|
|
16
17
|
private targets;
|
|
17
18
|
private onTarget;
|
|
18
19
|
private document;
|
|
19
20
|
private styleBlockRefs;
|
|
20
21
|
private targetedElems;
|
|
22
|
+
private abortController?;
|
|
21
23
|
constructor(targets: Array<Target>, onTarget: OnTarget, document?: Document);
|
|
22
24
|
getTargets(): Array<Target>;
|
|
25
|
+
getTargetedElems(): ReadonlyArray<Element>;
|
|
26
|
+
releaseTargets(elems?: ReadonlyArray<Element>): void;
|
|
27
|
+
destroy(): void;
|
|
23
28
|
retarget(): void;
|
|
24
29
|
unhideTarget: (selector: string) => void;
|
|
25
30
|
hideTarget: (selector: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomTargeter.d.ts","sourceRoot":"","sources":["../../../src/DomTargeter/DomTargeter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QAC9D,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;KACnE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DomTargeter.d.ts","sourceRoot":"","sources":["../../../src/DomTargeter/DomTargeter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QAC9D,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;KACnE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAI/H,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ;IA6F3E,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAI3B,gBAAgB,IAAI,aAAa,CAAC,OAAO,CAAC;IAK1C,cAAc,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI;IAepD,OAAO,IAAI,IAAI;IAMf,QAAQ,IAAI,IAAI;IAuEhB,YAAY,aAAc,MAAM,KAAG,IAAI,CASrC;IAEF,UAAU,aAAc,MAAM,KAAG,IAAI,CASnC;IAEF,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;CA2Cd"}
|
|
@@ -26,12 +26,23 @@ export class DomTargeter {
|
|
|
26
26
|
this.styleBlockRefs[selector] = styleBlock;
|
|
27
27
|
};
|
|
28
28
|
this.document = document || window.document;
|
|
29
|
+
// use the document's own window AbortController to ensure realm compatibility (e.g., JSDOM)
|
|
30
|
+
// and gracefully handle environments where AbortController is not available (e.g., IE11)
|
|
31
|
+
try {
|
|
32
|
+
this.abortController = new (this.document.defaultView || window).AbortController();
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
// AbortController not available - listeners won't auto-cleanup on destroy()
|
|
36
|
+
}
|
|
29
37
|
this.targets = targets;
|
|
30
38
|
this.onTarget = onTarget;
|
|
31
39
|
this.retarget();
|
|
32
40
|
this.targets.forEach((target) => {
|
|
33
41
|
let timeoutTime = 100;
|
|
34
42
|
const checker = () => {
|
|
43
|
+
if (this.abortController?.signal.aborted) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
35
46
|
// lets not just keep trying forever - this waits roughly 12 seconds before giving up.
|
|
36
47
|
if (timeoutTime < 2000) {
|
|
37
48
|
// increase the time till next check
|
|
@@ -56,10 +67,22 @@ export class DomTargeter {
|
|
|
56
67
|
clickElems.map((elem) => {
|
|
57
68
|
elem.addEventListener('click', () => {
|
|
58
69
|
timeoutTime = 100;
|
|
59
|
-
checker
|
|
60
|
-
});
|
|
70
|
+
setTimeout(checker); // allow the click to complete
|
|
71
|
+
}, { capture: true, signal: this.abortController?.signal });
|
|
61
72
|
});
|
|
62
73
|
}
|
|
74
|
+
// listen for SPA navigations via the Navigation API to restart retargeting
|
|
75
|
+
if (target.navigationRetarget) {
|
|
76
|
+
try {
|
|
77
|
+
this.document.defaultView?.navigation?.addEventListener('navigate', () => {
|
|
78
|
+
timeoutTime = 100;
|
|
79
|
+
checker();
|
|
80
|
+
}, { signal: this.abortController?.signal });
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
// Navigation API not available
|
|
84
|
+
}
|
|
85
|
+
}
|
|
63
86
|
if (target.autoRetarget) {
|
|
64
87
|
// do initial retargeting check
|
|
65
88
|
checker();
|
|
@@ -73,14 +96,41 @@ export class DomTargeter {
|
|
|
73
96
|
this.document.addEventListener('DOMContentLoaded', () => {
|
|
74
97
|
this.retarget();
|
|
75
98
|
target.hideTarget && this.unhideTarget(target.selector);
|
|
76
|
-
});
|
|
99
|
+
}, { signal: this.abortController?.signal });
|
|
77
100
|
}
|
|
78
101
|
});
|
|
79
102
|
}
|
|
80
103
|
getTargets() {
|
|
81
104
|
return this.targets;
|
|
82
105
|
}
|
|
106
|
+
getTargetedElems() {
|
|
107
|
+
this.targetedElems = this.targetedElems.filter((elem) => elem.isConnected);
|
|
108
|
+
return [...this.targetedElems];
|
|
109
|
+
}
|
|
110
|
+
releaseTargets(elems) {
|
|
111
|
+
const toRelease = elems || this.targetedElems;
|
|
112
|
+
toRelease.forEach((elem) => {
|
|
113
|
+
const idx = globallyTargetedElems.indexOf(elem);
|
|
114
|
+
if (idx !== -1) {
|
|
115
|
+
globallyTargetedElems.splice(idx, 1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
if (elems) {
|
|
119
|
+
this.targetedElems = this.targetedElems.filter((elem) => !elems.includes(elem));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.targetedElems = [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
destroy() {
|
|
126
|
+
this.abortController?.abort();
|
|
127
|
+
this.releaseTargets();
|
|
128
|
+
Object.keys(this.styleBlockRefs).forEach((selector) => this.unhideTarget(selector));
|
|
129
|
+
}
|
|
83
130
|
retarget() {
|
|
131
|
+
// prune references to elements no longer in the DOM
|
|
132
|
+
globallyTargetedElems = globallyTargetedElems.filter((elem) => elem.isConnected);
|
|
133
|
+
this.targetedElems = this.targetedElems.filter((elem) => elem.isConnected);
|
|
84
134
|
const targetElemPairs = this.targets.flatMap((target) => {
|
|
85
135
|
// hide targets before found
|
|
86
136
|
target.hideTarget && this.hideTarget(target.selector);
|
|
@@ -100,11 +150,12 @@ export class DomTargeter {
|
|
|
100
150
|
});
|
|
101
151
|
for (const { target, elem } of targetElemPairs) {
|
|
102
152
|
try {
|
|
153
|
+
// track targeted elements
|
|
154
|
+
this.targetedElems = this.targetedElems.concat(elem);
|
|
103
155
|
if (target.inject) {
|
|
104
156
|
const injectedElem = this.inject(elem, target);
|
|
105
|
-
this.targetedElems = this.targetedElems.concat(elem);
|
|
106
157
|
// handle both sync and async onTarget functions
|
|
107
|
-
const result = this.onTarget(target, injectedElem, elem);
|
|
158
|
+
const result = this.onTarget(target, injectedElem, elem, this);
|
|
108
159
|
if (result && typeof result.then === 'function') {
|
|
109
160
|
// async function - handle promise
|
|
110
161
|
result.catch((error) => {
|
|
@@ -119,7 +170,7 @@ export class DomTargeter {
|
|
|
119
170
|
while (elem.firstChild && elem.removeChild(elem.firstChild))
|
|
120
171
|
;
|
|
121
172
|
// handle both sync and async onTarget functions
|
|
122
|
-
const result = this.onTarget(target, elem);
|
|
173
|
+
const result = this.onTarget(target, elem, undefined, this);
|
|
123
174
|
if (result && typeof result.then === 'function') {
|
|
124
175
|
// async function - handle promise
|
|
125
176
|
result.catch((error) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@searchspring/snap-toolbox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.78.0",
|
|
4
4
|
"description": "Snap Toolbox",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
"files": [
|
|
24
24
|
"dist/**/*"
|
|
25
25
|
],
|
|
26
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "9d17504d1ba3b5131c4edeb0cb1edb6ff65ec1b0"
|
|
27
27
|
}
|