@amplitude/plugin-autocapture-browser 1.23.7 → 1.24.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/lib/cjs/autocapture/track-click.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-click.js.map +1 -1
- package/lib/cjs/autocapture/track-exposure.d.ts +12 -0
- package/lib/cjs/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-exposure.js +56 -0
- package/lib/cjs/autocapture/track-exposure.js.map +1 -0
- package/lib/cjs/autocapture/track-scroll.d.ts +15 -0
- package/lib/cjs/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-scroll.js +34 -0
- package/lib/cjs/autocapture/track-scroll.js.map +1 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.js +71 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/cjs/autocapture-plugin.d.ts +4 -0
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +109 -14
- package/lib/cjs/autocapture-plugin.js.map +1 -1
- package/lib/cjs/constants.d.ts +7 -0
- package/lib/cjs/constants.d.ts.map +1 -1
- package/lib/cjs/constants.js +9 -1
- package/lib/cjs/constants.js.map +1 -1
- package/lib/cjs/data-extractor.d.ts +1 -0
- package/lib/cjs/data-extractor.d.ts.map +1 -1
- package/lib/cjs/data-extractor.js +19 -0
- package/lib/cjs/data-extractor.js.map +1 -1
- package/lib/cjs/helpers.d.ts +1 -0
- package/lib/cjs/helpers.d.ts.map +1 -1
- package/lib/cjs/helpers.js +22 -1
- package/lib/cjs/helpers.js.map +1 -1
- package/lib/cjs/libs/element-path.d.ts +2 -0
- package/lib/cjs/libs/element-path.d.ts.map +1 -0
- package/lib/cjs/libs/element-path.js +177 -0
- package/lib/cjs/libs/element-path.js.map +1 -0
- package/lib/cjs/observables.d.ts +3 -0
- package/lib/cjs/observables.d.ts.map +1 -1
- package/lib/cjs/observables.js +70 -3
- package/lib/cjs/observables.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/autocapture/track-click.d.ts.map +1 -1
- package/lib/esm/autocapture/track-click.js.map +1 -1
- package/lib/esm/autocapture/track-exposure.d.ts +12 -0
- package/lib/esm/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/esm/autocapture/track-exposure.js +52 -0
- package/lib/esm/autocapture/track-exposure.js.map +1 -0
- package/lib/esm/autocapture/track-scroll.d.ts +15 -0
- package/lib/esm/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/esm/autocapture/track-scroll.js +30 -0
- package/lib/esm/autocapture/track-scroll.js.map +1 -0
- package/lib/esm/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/esm/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/esm/autocapture/track-viewport-content-updated.js +65 -0
- package/lib/esm/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/esm/autocapture-plugin.d.ts +4 -0
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +111 -16
- package/lib/esm/autocapture-plugin.js.map +1 -1
- package/lib/esm/constants.d.ts +7 -0
- package/lib/esm/constants.d.ts.map +1 -1
- package/lib/esm/constants.js +8 -0
- package/lib/esm/constants.js.map +1 -1
- package/lib/esm/data-extractor.d.ts +1 -0
- package/lib/esm/data-extractor.d.ts.map +1 -1
- package/lib/esm/data-extractor.js +20 -1
- package/lib/esm/data-extractor.js.map +1 -1
- package/lib/esm/helpers.d.ts +1 -0
- package/lib/esm/helpers.d.ts.map +1 -1
- package/lib/esm/helpers.js +21 -1
- package/lib/esm/helpers.js.map +1 -1
- package/lib/esm/libs/element-path.d.ts +2 -0
- package/lib/esm/libs/element-path.d.ts.map +1 -0
- package/lib/esm/libs/element-path.js +173 -0
- package/lib/esm/libs/element-path.js.map +1 -0
- package/lib/esm/observables.d.ts +3 -0
- package/lib/esm/observables.d.ts.map +1 -1
- package/lib/esm/observables.js +67 -2
- package/lib/esm/observables.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.js.map +1 -1
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
- package/lib/scripts/autocapture/track-exposure.d.ts +12 -0
- package/lib/scripts/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/scripts/autocapture/track-scroll.d.ts +15 -0
- package/lib/scripts/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/scripts/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/scripts/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/scripts/autocapture-plugin.d.ts +4 -0
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
- package/lib/scripts/constants.d.ts +7 -0
- package/lib/scripts/constants.d.ts.map +1 -1
- package/lib/scripts/data-extractor.d.ts +1 -0
- package/lib/scripts/data-extractor.d.ts.map +1 -1
- package/lib/scripts/helpers.d.ts +1 -0
- package/lib/scripts/helpers.d.ts.map +1 -1
- package/lib/scripts/libs/element-path.d.ts +2 -0
- package/lib/scripts/libs/element-path.d.ts.map +1 -0
- package/lib/scripts/observables.d.ts +3 -0
- package/lib/scripts/observables.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/package.json +2 -2
- package/lib/cjs/libs/finder.d.ts +0 -13
- package/lib/cjs/libs/finder.d.ts.map +0 -1
- package/lib/cjs/libs/finder.js +0 -348
- package/lib/cjs/libs/finder.js.map +0 -1
- package/lib/esm/libs/finder.d.ts +0 -13
- package/lib/esm/libs/finder.d.ts.map +0 -1
- package/lib/esm/libs/finder.js +0 -344
- package/lib/esm/libs/finder.js.map +0 -1
- package/lib/scripts/libs/finder.d.ts +0 -13
- package/lib/scripts/libs/finder.d.ts.map +0 -1
package/lib/esm/libs/finder.js
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
/* istanbul ignore file */
|
|
2
|
-
import { __assign, __generator, __read, __spreadArray, __values } from "tslib";
|
|
3
|
-
var config;
|
|
4
|
-
var rootDocument;
|
|
5
|
-
export function finder(input, options) {
|
|
6
|
-
if (input.nodeType !== Node.ELEMENT_NODE) {
|
|
7
|
-
throw new Error("Can't generate CSS selector for non-element node type.");
|
|
8
|
-
}
|
|
9
|
-
if ('html' === input.tagName.toLowerCase()) {
|
|
10
|
-
return 'html';
|
|
11
|
-
}
|
|
12
|
-
var defaults = {
|
|
13
|
-
root: document.body,
|
|
14
|
-
idName: function (_name) { return true; },
|
|
15
|
-
className: function (_name) { return true; },
|
|
16
|
-
tagName: function (_name) { return true; },
|
|
17
|
-
attr: function (_name, _value) { return false; },
|
|
18
|
-
seedMinLength: 1,
|
|
19
|
-
optimizedMinLength: 2,
|
|
20
|
-
threshold: 1000,
|
|
21
|
-
maxNumberOfTries: 10000,
|
|
22
|
-
};
|
|
23
|
-
config = __assign(__assign({}, defaults), options);
|
|
24
|
-
rootDocument = findRootDocument(config.root, defaults);
|
|
25
|
-
var path = bottomUpSearch(input, 'all', function () {
|
|
26
|
-
return bottomUpSearch(input, 'two', function () { return bottomUpSearch(input, 'one', function () { return bottomUpSearch(input, 'none'); }); });
|
|
27
|
-
});
|
|
28
|
-
if (path) {
|
|
29
|
-
var optimized = sort(optimize(path, input));
|
|
30
|
-
if (optimized.length > 0) {
|
|
31
|
-
path = optimized[0];
|
|
32
|
-
}
|
|
33
|
-
return selector(path);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
throw new Error("Selector was not found.");
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function findRootDocument(rootNode, defaults) {
|
|
40
|
-
if (rootNode.nodeType === Node.DOCUMENT_NODE) {
|
|
41
|
-
return rootNode;
|
|
42
|
-
}
|
|
43
|
-
if (rootNode === defaults.root) {
|
|
44
|
-
return rootNode.ownerDocument;
|
|
45
|
-
}
|
|
46
|
-
return rootNode;
|
|
47
|
-
}
|
|
48
|
-
function bottomUpSearch(input, limit, fallback) {
|
|
49
|
-
var path = null;
|
|
50
|
-
var stack = [];
|
|
51
|
-
var current = input;
|
|
52
|
-
var i = 0;
|
|
53
|
-
var _loop_1 = function () {
|
|
54
|
-
var e_1, _a;
|
|
55
|
-
var level = maybe(id(current)) || maybe.apply(void 0, __spreadArray([], __read(attr(current)), false)) || maybe.apply(void 0, __spreadArray([], __read(classNames(current)), false)) ||
|
|
56
|
-
maybe(tagName(current)) || [any()];
|
|
57
|
-
var nth = index(current);
|
|
58
|
-
if (limit == 'all') {
|
|
59
|
-
if (nth) {
|
|
60
|
-
level = level.concat(level.filter(dispensableNth).map(function (node) { return nthChild(node, nth); }));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else if (limit == 'two') {
|
|
64
|
-
level = level.slice(0, 1);
|
|
65
|
-
if (nth) {
|
|
66
|
-
level = level.concat(level.filter(dispensableNth).map(function (node) { return nthChild(node, nth); }));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else if (limit == 'one') {
|
|
70
|
-
var _b = __read((level = level.slice(0, 1)), 1), node = _b[0];
|
|
71
|
-
if (nth && dispensableNth(node)) {
|
|
72
|
-
level = [nthChild(node, nth)];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else if (limit == 'none') {
|
|
76
|
-
level = [any()];
|
|
77
|
-
if (nth) {
|
|
78
|
-
level = [nthChild(level[0], nth)];
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
try {
|
|
82
|
-
for (var level_1 = (e_1 = void 0, __values(level)), level_1_1 = level_1.next(); !level_1_1.done; level_1_1 = level_1.next()) {
|
|
83
|
-
var node = level_1_1.value;
|
|
84
|
-
node.level = i;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
88
|
-
finally {
|
|
89
|
-
try {
|
|
90
|
-
if (level_1_1 && !level_1_1.done && (_a = level_1.return)) _a.call(level_1);
|
|
91
|
-
}
|
|
92
|
-
finally { if (e_1) throw e_1.error; }
|
|
93
|
-
}
|
|
94
|
-
stack.push(level);
|
|
95
|
-
if (stack.length >= config.seedMinLength) {
|
|
96
|
-
path = findUniquePath(stack, fallback);
|
|
97
|
-
if (path) {
|
|
98
|
-
return "break";
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
current = current.parentElement;
|
|
102
|
-
i++;
|
|
103
|
-
};
|
|
104
|
-
while (current) {
|
|
105
|
-
var state_1 = _loop_1();
|
|
106
|
-
if (state_1 === "break")
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
if (!path) {
|
|
110
|
-
path = findUniquePath(stack, fallback);
|
|
111
|
-
}
|
|
112
|
-
if (!path && fallback) {
|
|
113
|
-
return fallback();
|
|
114
|
-
}
|
|
115
|
-
return path;
|
|
116
|
-
}
|
|
117
|
-
function findUniquePath(stack, fallback) {
|
|
118
|
-
var e_2, _a;
|
|
119
|
-
// Check first the total number of combinations first since generating the combinations can cause memory exhaustion
|
|
120
|
-
var numCombinations = stack.reduce(function (acc, i) { return acc * i.length; }, 1);
|
|
121
|
-
if (numCombinations > config.threshold) {
|
|
122
|
-
return fallback ? fallback() : null;
|
|
123
|
-
}
|
|
124
|
-
var paths = sort(combinations(stack));
|
|
125
|
-
try {
|
|
126
|
-
for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
|
|
127
|
-
var candidate = paths_1_1.value;
|
|
128
|
-
if (unique(candidate)) {
|
|
129
|
-
return candidate;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
134
|
-
finally {
|
|
135
|
-
try {
|
|
136
|
-
if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
|
|
137
|
-
}
|
|
138
|
-
finally { if (e_2) throw e_2.error; }
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
function selector(path) {
|
|
143
|
-
var node = path[0];
|
|
144
|
-
var query = node.name;
|
|
145
|
-
for (var i = 1; i < path.length; i++) {
|
|
146
|
-
var level = path[i].level || 0;
|
|
147
|
-
if (node.level === level - 1) {
|
|
148
|
-
query = "".concat(path[i].name, " > ").concat(query);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
query = "".concat(path[i].name, " ").concat(query);
|
|
152
|
-
}
|
|
153
|
-
node = path[i];
|
|
154
|
-
}
|
|
155
|
-
return query;
|
|
156
|
-
}
|
|
157
|
-
function penalty(path) {
|
|
158
|
-
return path.map(function (node) { return node.penalty; }).reduce(function (acc, i) { return acc + i; }, 0);
|
|
159
|
-
}
|
|
160
|
-
function unique(path) {
|
|
161
|
-
var css = selector(path);
|
|
162
|
-
switch (rootDocument.querySelectorAll(css).length) {
|
|
163
|
-
case 0:
|
|
164
|
-
throw new Error("Can't select any node with this selector: ".concat(css));
|
|
165
|
-
case 1:
|
|
166
|
-
return true;
|
|
167
|
-
default:
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
function id(input) {
|
|
172
|
-
var elementId = input.getAttribute('id');
|
|
173
|
-
if (elementId && config.idName(elementId)) {
|
|
174
|
-
return {
|
|
175
|
-
name: '#' + CSS.escape(elementId),
|
|
176
|
-
penalty: 0,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
function attr(input) {
|
|
182
|
-
var attrs = Array.from(input.attributes).filter(function (attr) { return config.attr(attr.name, attr.value); });
|
|
183
|
-
return attrs.map(function (attr) { return ({
|
|
184
|
-
name: "[".concat(CSS.escape(attr.name), "=\"").concat(CSS.escape(attr.value), "\"]"),
|
|
185
|
-
penalty: 0.5,
|
|
186
|
-
}); });
|
|
187
|
-
}
|
|
188
|
-
function classNames(input) {
|
|
189
|
-
var names = Array.from(input.classList).filter(config.className);
|
|
190
|
-
return names.map(function (name) { return ({
|
|
191
|
-
name: '.' + CSS.escape(name),
|
|
192
|
-
penalty: 1,
|
|
193
|
-
}); });
|
|
194
|
-
}
|
|
195
|
-
function tagName(input) {
|
|
196
|
-
var name = input.tagName.toLowerCase();
|
|
197
|
-
if (config.tagName(name)) {
|
|
198
|
-
return {
|
|
199
|
-
name: name,
|
|
200
|
-
penalty: 2,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
return null;
|
|
204
|
-
}
|
|
205
|
-
function any() {
|
|
206
|
-
return {
|
|
207
|
-
name: '*',
|
|
208
|
-
penalty: 3,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
function index(input) {
|
|
212
|
-
var parent = input.parentNode;
|
|
213
|
-
if (!parent) {
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
var child = parent.firstChild;
|
|
217
|
-
if (!child) {
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
var i = 0;
|
|
221
|
-
while (child) {
|
|
222
|
-
if (child.nodeType === Node.ELEMENT_NODE) {
|
|
223
|
-
i++;
|
|
224
|
-
}
|
|
225
|
-
if (child === input) {
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
child = child.nextSibling;
|
|
229
|
-
}
|
|
230
|
-
return i;
|
|
231
|
-
}
|
|
232
|
-
function nthChild(node, i) {
|
|
233
|
-
return {
|
|
234
|
-
name: node.name + ":nth-child(".concat(i, ")"),
|
|
235
|
-
penalty: node.penalty + 1,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
function dispensableNth(node) {
|
|
239
|
-
return node.name !== 'html' && !node.name.startsWith('#');
|
|
240
|
-
}
|
|
241
|
-
function maybe() {
|
|
242
|
-
var level = [];
|
|
243
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
244
|
-
level[_i] = arguments[_i];
|
|
245
|
-
}
|
|
246
|
-
var list = level.filter(notEmpty);
|
|
247
|
-
if (list.length > 0) {
|
|
248
|
-
return list;
|
|
249
|
-
}
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
function notEmpty(value) {
|
|
253
|
-
return value !== null && value !== undefined;
|
|
254
|
-
}
|
|
255
|
-
function combinations(stack, path) {
|
|
256
|
-
var _a, _b, node, e_3_1;
|
|
257
|
-
var e_3, _c;
|
|
258
|
-
if (path === void 0) { path = []; }
|
|
259
|
-
return __generator(this, function (_d) {
|
|
260
|
-
switch (_d.label) {
|
|
261
|
-
case 0:
|
|
262
|
-
if (!(stack.length > 0)) return [3 /*break*/, 9];
|
|
263
|
-
_d.label = 1;
|
|
264
|
-
case 1:
|
|
265
|
-
_d.trys.push([1, 6, 7, 8]);
|
|
266
|
-
_a = __values(stack[0]), _b = _a.next();
|
|
267
|
-
_d.label = 2;
|
|
268
|
-
case 2:
|
|
269
|
-
if (!!_b.done) return [3 /*break*/, 5];
|
|
270
|
-
node = _b.value;
|
|
271
|
-
return [5 /*yield**/, __values(combinations(stack.slice(1, stack.length), path.concat(node)))];
|
|
272
|
-
case 3:
|
|
273
|
-
_d.sent();
|
|
274
|
-
_d.label = 4;
|
|
275
|
-
case 4:
|
|
276
|
-
_b = _a.next();
|
|
277
|
-
return [3 /*break*/, 2];
|
|
278
|
-
case 5: return [3 /*break*/, 8];
|
|
279
|
-
case 6:
|
|
280
|
-
e_3_1 = _d.sent();
|
|
281
|
-
e_3 = { error: e_3_1 };
|
|
282
|
-
return [3 /*break*/, 8];
|
|
283
|
-
case 7:
|
|
284
|
-
try {
|
|
285
|
-
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
286
|
-
}
|
|
287
|
-
finally { if (e_3) throw e_3.error; }
|
|
288
|
-
return [7 /*endfinally*/];
|
|
289
|
-
case 8: return [3 /*break*/, 11];
|
|
290
|
-
case 9: return [4 /*yield*/, path];
|
|
291
|
-
case 10:
|
|
292
|
-
_d.sent();
|
|
293
|
-
_d.label = 11;
|
|
294
|
-
case 11: return [2 /*return*/];
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
function sort(paths) {
|
|
299
|
-
return __spreadArray([], __read(paths), false).sort(function (a, b) { return penalty(a) - penalty(b); });
|
|
300
|
-
}
|
|
301
|
-
function optimize(path, input, scope) {
|
|
302
|
-
var i, newPath, newPathKey;
|
|
303
|
-
if (scope === void 0) { scope = {
|
|
304
|
-
counter: 0,
|
|
305
|
-
visited: new Map(),
|
|
306
|
-
}; }
|
|
307
|
-
return __generator(this, function (_a) {
|
|
308
|
-
switch (_a.label) {
|
|
309
|
-
case 0:
|
|
310
|
-
if (!(path.length > 2 && path.length > config.optimizedMinLength)) return [3 /*break*/, 5];
|
|
311
|
-
i = 1;
|
|
312
|
-
_a.label = 1;
|
|
313
|
-
case 1:
|
|
314
|
-
if (!(i < path.length - 1)) return [3 /*break*/, 5];
|
|
315
|
-
if (scope.counter > config.maxNumberOfTries) {
|
|
316
|
-
return [2 /*return*/]; // Okay At least I tried!
|
|
317
|
-
}
|
|
318
|
-
scope.counter += 1;
|
|
319
|
-
newPath = __spreadArray([], __read(path), false);
|
|
320
|
-
newPath.splice(i, 1);
|
|
321
|
-
newPathKey = selector(newPath);
|
|
322
|
-
if (scope.visited.has(newPathKey)) {
|
|
323
|
-
return [2 /*return*/];
|
|
324
|
-
}
|
|
325
|
-
if (!(unique(newPath) && same(newPath, input))) return [3 /*break*/, 4];
|
|
326
|
-
return [4 /*yield*/, newPath];
|
|
327
|
-
case 2:
|
|
328
|
-
_a.sent();
|
|
329
|
-
scope.visited.set(newPathKey, true);
|
|
330
|
-
return [5 /*yield**/, __values(optimize(newPath, input, scope))];
|
|
331
|
-
case 3:
|
|
332
|
-
_a.sent();
|
|
333
|
-
_a.label = 4;
|
|
334
|
-
case 4:
|
|
335
|
-
i++;
|
|
336
|
-
return [3 /*break*/, 1];
|
|
337
|
-
case 5: return [2 /*return*/];
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
function same(path, input) {
|
|
342
|
-
return rootDocument.querySelector(selector(path)) === input;
|
|
343
|
-
}
|
|
344
|
-
//# sourceMappingURL=finder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../../src/libs/finder.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n\n// License: MIT\n// Author: Anton Medvedev <anton@medv.io>\n// Source: https://github.com/antonmedv/finder\n\ntype Knot = {\n name: string;\n penalty: number;\n level?: number;\n};\n\ntype Path = Knot[];\n\nexport type Options = {\n root: Element;\n idName: (name: string) => boolean;\n className: (name: string) => boolean;\n tagName: (name: string) => boolean;\n attr: (name: string, value: string) => boolean;\n seedMinLength: number;\n optimizedMinLength: number;\n threshold: number;\n maxNumberOfTries: number;\n};\n\nlet config: Options;\nlet rootDocument: Document | Element;\n\nexport function finder(input: Element, options?: Partial<Options>) {\n if (input.nodeType !== Node.ELEMENT_NODE) {\n throw new Error(`Can't generate CSS selector for non-element node type.`);\n }\n if ('html' === input.tagName.toLowerCase()) {\n return 'html';\n }\n const defaults: Options = {\n root: document.body,\n idName: (_name: string) => true,\n className: (_name: string) => true,\n tagName: (_name: string) => true,\n attr: (_name: string, _value: string) => false,\n seedMinLength: 1,\n optimizedMinLength: 2,\n threshold: 1000,\n maxNumberOfTries: 10000,\n };\n\n config = { ...defaults, ...options };\n rootDocument = findRootDocument(config.root, defaults);\n\n let path = bottomUpSearch(input, 'all', () =>\n bottomUpSearch(input, 'two', () => bottomUpSearch(input, 'one', () => bottomUpSearch(input, 'none'))),\n );\n\n if (path) {\n const optimized = sort(optimize(path, input));\n if (optimized.length > 0) {\n path = optimized[0];\n }\n return selector(path);\n } else {\n throw new Error(`Selector was not found.`);\n }\n}\n\nfunction findRootDocument(rootNode: Element | Document, defaults: Options) {\n if (rootNode.nodeType === Node.DOCUMENT_NODE) {\n return rootNode;\n }\n if (rootNode === defaults.root) {\n return rootNode.ownerDocument;\n }\n return rootNode;\n}\n\nfunction bottomUpSearch(\n input: Element,\n limit: 'all' | 'two' | 'one' | 'none',\n fallback?: () => Path | null,\n): Path | null {\n let path: Path | null = null;\n const stack: Knot[][] = [];\n let current: Element | null = input;\n let i = 0;\n while (current) {\n let level: Knot[] = maybe(id(current)) ||\n maybe(...attr(current)) ||\n maybe(...classNames(current)) ||\n maybe(tagName(current)) || [any()];\n const nth = index(current);\n if (limit == 'all') {\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'two') {\n level = level.slice(0, 1);\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'one') {\n const [node] = (level = level.slice(0, 1));\n if (nth && dispensableNth(node)) {\n level = [nthChild(node, nth)];\n }\n } else if (limit == 'none') {\n level = [any()];\n if (nth) {\n level = [nthChild(level[0], nth)];\n }\n }\n for (const node of level) {\n node.level = i;\n }\n stack.push(level);\n if (stack.length >= config.seedMinLength) {\n path = findUniquePath(stack, fallback);\n if (path) {\n break;\n }\n }\n current = current.parentElement;\n i++;\n }\n if (!path) {\n path = findUniquePath(stack, fallback);\n }\n if (!path && fallback) {\n return fallback();\n }\n return path;\n}\n\nfunction findUniquePath(stack: Knot[][], fallback?: () => Path | null): Path | null {\n // Check first the total number of combinations first since generating the combinations can cause memory exhaustion\n const numCombinations = stack.reduce((acc, i) => acc * i.length, 1);\n if (numCombinations > config.threshold) {\n return fallback ? fallback() : null;\n }\n\n const paths = sort(combinations(stack));\n for (const candidate of paths) {\n if (unique(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selector(path: Path): string {\n let node = path[0];\n let query = node.name;\n for (let i = 1; i < path.length; i++) {\n const level = path[i].level || 0;\n if (node.level === level - 1) {\n query = `${path[i].name} > ${query}`;\n } else {\n query = `${path[i].name} ${query}`;\n }\n node = path[i];\n }\n return query;\n}\n\nfunction penalty(path: Path): number {\n return path.map((node) => node.penalty).reduce((acc, i) => acc + i, 0);\n}\n\nfunction unique(path: Path) {\n const css = selector(path);\n switch (rootDocument.querySelectorAll(css).length) {\n case 0:\n throw new Error(`Can't select any node with this selector: ${css}`);\n case 1:\n return true;\n default:\n return false;\n }\n}\n\nfunction id(input: Element): Knot | null {\n const elementId = input.getAttribute('id');\n if (elementId && config.idName(elementId)) {\n return {\n name: '#' + CSS.escape(elementId),\n penalty: 0,\n };\n }\n return null;\n}\n\nfunction attr(input: Element): Knot[] {\n const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value));\n return attrs.map(\n (attr): Knot => ({\n name: `[${CSS.escape(attr.name)}=\"${CSS.escape(attr.value)}\"]`,\n penalty: 0.5,\n }),\n );\n}\n\nfunction classNames(input: Element): Knot[] {\n const names = Array.from(input.classList).filter(config.className);\n return names.map(\n (name): Knot => ({\n name: '.' + CSS.escape(name),\n penalty: 1,\n }),\n );\n}\n\nfunction tagName(input: Element): Knot | null {\n const name = input.tagName.toLowerCase();\n if (config.tagName(name)) {\n return {\n name,\n penalty: 2,\n };\n }\n return null;\n}\n\nfunction any(): Knot {\n return {\n name: '*',\n penalty: 3,\n };\n}\n\nfunction index(input: Element): number | null {\n const parent = input.parentNode;\n if (!parent) {\n return null;\n }\n let child = parent.firstChild;\n if (!child) {\n return null;\n }\n let i = 0;\n while (child) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n i++;\n }\n if (child === input) {\n break;\n }\n child = child.nextSibling;\n }\n return i;\n}\n\nfunction nthChild(node: Knot, i: number): Knot {\n return {\n name: node.name + `:nth-child(${i})`,\n penalty: node.penalty + 1,\n };\n}\n\nfunction dispensableNth(node: Knot) {\n return node.name !== 'html' && !node.name.startsWith('#');\n}\n\nfunction maybe(...level: (Knot | null)[]): Knot[] | null {\n const list = level.filter(notEmpty);\n if (list.length > 0) {\n return list;\n }\n return null;\n}\n\nfunction notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction* combinations(stack: Knot[][], path: Knot[] = []): Generator<Knot[]> {\n if (stack.length > 0) {\n for (const node of stack[0]) {\n yield* combinations(stack.slice(1, stack.length), path.concat(node));\n }\n } else {\n yield path;\n }\n}\n\nfunction sort(paths: Iterable<Path>): Path[] {\n return [...paths].sort((a, b) => penalty(a) - penalty(b));\n}\n\ntype Scope = {\n counter: number;\n visited: Map<string, boolean>;\n};\n\nfunction* optimize(\n path: Path,\n input: Element,\n scope: Scope = {\n counter: 0,\n visited: new Map<string, boolean>(),\n },\n): Generator<Knot[]> {\n if (path.length > 2 && path.length > config.optimizedMinLength) {\n for (let i = 1; i < path.length - 1; i++) {\n if (scope.counter > config.maxNumberOfTries) {\n return; // Okay At least I tried!\n }\n scope.counter += 1;\n const newPath = [...path];\n newPath.splice(i, 1);\n const newPathKey = selector(newPath);\n if (scope.visited.has(newPathKey)) {\n return;\n }\n if (unique(newPath) && same(newPath, input)) {\n yield newPath;\n scope.visited.set(newPathKey, true);\n yield* optimize(newPath, input, scope);\n }\n }\n }\n}\n\nfunction same(path: Path, input: Element) {\n return rootDocument.querySelector(selector(path)) === input;\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type Options = {
|
|
2
|
-
root: Element;
|
|
3
|
-
idName: (name: string) => boolean;
|
|
4
|
-
className: (name: string) => boolean;
|
|
5
|
-
tagName: (name: string) => boolean;
|
|
6
|
-
attr: (name: string, value: string) => boolean;
|
|
7
|
-
seedMinLength: number;
|
|
8
|
-
optimizedMinLength: number;
|
|
9
|
-
threshold: number;
|
|
10
|
-
maxNumberOfTries: number;
|
|
11
|
-
};
|
|
12
|
-
export declare function finder(input: Element, options?: Partial<Options>): string;
|
|
13
|
-
//# sourceMappingURL=finder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../../src/libs/finder.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAKF,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,UAmChE"}
|