@cypress/unique-selector 0.4.3 → 1.0.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/getData.js +7 -23
- package/lib/getName.js +19 -0
- package/lib/index.js +34 -56
- package/lib/isUnique.js +6 -2
- package/package.json +8 -11
- package/.babelrc +0 -3
- package/.eslintrc +0 -42
- package/.history/package-lock_20211116100405.json +0 -7884
- package/.history/package-lock_20211116101347.json +0 -7884
- package/.history/package_20180226102655.json +0 -62
- package/.history/package_20211018091805.json +0 -62
- package/.history/package_20211018091928.json +0 -62
- package/.history/package_20211116101343.json +0 -62
- package/.history/src/getData_20211116100405.js +0 -24
- package/.history/src/getData_20211116100500.js +0 -24
- package/.history/src/getData_20211116100511.js +0 -24
- package/.history/src/getData_20211116100803.js +0 -25
- package/.history/src/getData_20211116100925.js +0 -25
- package/.history/src/getData_20211116101054.js +0 -25
- package/.history/src/getData_20211116101058.js +0 -25
- package/.history/src/getData_20211116101234.js +0 -26
- package/.history/src/getData_20211116101243.js +0 -28
- package/.history/src/getData_20211116101301.js +0 -29
- package/.history/test/unique-selector_20180226102601.js +0 -131
- package/.history/test/unique-selector_20211018092001.js +0 -131
- package/.history/test/unique-selector_20211018092018.js +0 -131
- package/.history/test/unique-selector_20211018092209.js +0 -132
- package/.history/test/unique-selector_20211018092230.js +0 -132
- package/.history/test/unique-selector_20211018092245.js +0 -130
- package/.travis.yml +0 -11
- package/component.json +0 -12
- package/src/getAttributes.js +0 -20
- package/src/getClasses.js +0 -38
- package/src/getCombinations.js +0 -44
- package/src/getData.js +0 -29
- package/src/getID.js +0 -17
- package/src/getNthChild.js +0 -33
- package/src/getParents.js +0 -19
- package/src/getTag.js +0 -9
- package/src/index.js +0 -197
- package/src/isElement.js +0 -17
- package/src/isUnique.js +0 -12
- package/static/bundle.js +0 -5
- package/test/index.html +0 -0
- package/test/unique-selector.js +0 -146
package/lib/getData.js
CHANGED
|
@@ -1,27 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getData = undefined;
|
|
7
|
-
|
|
8
|
-
require('css.escape');
|
|
9
|
-
|
|
10
6
|
/**
|
|
11
7
|
* Returns the data-{dataAttr} selector of the element
|
|
12
|
-
* @param { String } selectorType
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
15
|
-
* @return { String }
|
|
8
|
+
* @param { String } selectorType - The type of selector to return.
|
|
9
|
+
* @param { String } attributes - The attributes of the element.
|
|
10
|
+
* @return { String | null } - The data-{dataAttr} selector of the element.
|
|
16
11
|
*/
|
|
17
12
|
|
|
18
|
-
function needsQuote(v) {
|
|
19
|
-
// if the escaped value is different from
|
|
20
|
-
// the non escaped value then we know
|
|
21
|
-
// we need to quote the value
|
|
22
|
-
return v !== CSS.escape(v);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
13
|
var getData = exports.getData = function getData(selectorType, attributes) {
|
|
26
14
|
for (var i = 0; i < attributes.length; i++) {
|
|
27
15
|
// extract node name + value
|
|
@@ -33,15 +21,11 @@ var getData = exports.getData = function getData(selectorType, attributes) {
|
|
|
33
21
|
|
|
34
22
|
if (nodeName === selectorType) {
|
|
35
23
|
if (value) {
|
|
36
|
-
if
|
|
37
|
-
|
|
38
|
-
return '[' + nodeName + '="' + value + '"]';
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return '[' + nodeName + '=' + value + ']';
|
|
24
|
+
// if we have value that needs quotes
|
|
25
|
+
return "[" + nodeName + "=\"" + value + "\"]";
|
|
42
26
|
}
|
|
43
27
|
|
|
44
|
-
return
|
|
28
|
+
return "[" + nodeName + "]";
|
|
45
29
|
}
|
|
46
30
|
}
|
|
47
31
|
|
package/lib/getName.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getName = getName;
|
|
7
|
+
/**
|
|
8
|
+
* Returns the `name` attribute of the element (if one exists)
|
|
9
|
+
* @param { Object } element
|
|
10
|
+
* @return { String }
|
|
11
|
+
*/
|
|
12
|
+
function getName(el) {
|
|
13
|
+
var name = el.getAttribute('name');
|
|
14
|
+
|
|
15
|
+
if (name !== null && name !== '') {
|
|
16
|
+
return '[name="' + name + '"]';
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
package/lib/index.js
CHANGED
|
@@ -13,6 +13,8 @@ var _getCombinations = require('./getCombinations');
|
|
|
13
13
|
|
|
14
14
|
var _getAttributes = require('./getAttributes');
|
|
15
15
|
|
|
16
|
+
var _getName = require('./getName');
|
|
17
|
+
|
|
16
18
|
var _getNthChild = require('./getNthChild');
|
|
17
19
|
|
|
18
20
|
var _getTag = require('./getTag');
|
|
@@ -30,7 +32,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
|
|
|
30
32
|
var dataRegex = /^data-(.+)/;
|
|
31
33
|
|
|
32
34
|
/**
|
|
33
|
-
* Returns all the selectors of the
|
|
35
|
+
* Returns all the selectors of the element
|
|
34
36
|
* @param { Object } element
|
|
35
37
|
* @return { Object }
|
|
36
38
|
*/
|
|
@@ -42,7 +44,8 @@ function getAllSelectors(el, selectors, attributesToIgnore) {
|
|
|
42
44
|
return (0, _getAttributes.getAttributes)(elem, attributesToIgnore);
|
|
43
45
|
},
|
|
44
46
|
'class': _getClasses.getClassSelectors,
|
|
45
|
-
'id': _getID.getID
|
|
47
|
+
'id': _getID.getID,
|
|
48
|
+
'name': _getName.getName
|
|
46
49
|
};
|
|
47
50
|
|
|
48
51
|
return selectors.filter(function (selector) {
|
|
@@ -62,8 +65,12 @@ function getAllSelectors(el, selectors, attributesToIgnore) {
|
|
|
62
65
|
function testUniqueness(element, selector) {
|
|
63
66
|
var parentNode = element.parentNode;
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
try {
|
|
69
|
+
var elements = parentNode.querySelectorAll(selector);
|
|
70
|
+
return elements.length === 1 && elements[0] === element;
|
|
71
|
+
} catch (e) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
67
74
|
}
|
|
68
75
|
|
|
69
76
|
/**
|
|
@@ -144,6 +151,7 @@ function getUniqueSelector(element, selectorTypes, attributesToIgnore) {
|
|
|
144
151
|
switch (selectorType) {
|
|
145
152
|
case 'data':
|
|
146
153
|
case 'id':
|
|
154
|
+
case 'name':
|
|
147
155
|
case 'tag':
|
|
148
156
|
if (testUniqueness(element, selector)) {
|
|
149
157
|
return selector;
|
|
@@ -195,69 +203,39 @@ function getUniqueSelector(element, selectorTypes, attributesToIgnore) {
|
|
|
195
203
|
function unique(el) {
|
|
196
204
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
197
205
|
var _options$selectorType = options.selectorTypes,
|
|
198
|
-
selectorTypes = _options$selectorType === undefined ? ['id', 'class', 'tag', 'nth-child'] : _options$selectorType,
|
|
206
|
+
selectorTypes = _options$selectorType === undefined ? ['id', 'name', 'class', 'tag', 'nth-child'] : _options$selectorType,
|
|
199
207
|
_options$attributesTo = options.attributesToIgnore,
|
|
200
|
-
attributesToIgnore = _options$attributesTo === undefined ? ['id', 'class', 'length'] : _options$attributesTo
|
|
208
|
+
attributesToIgnore = _options$attributesTo === undefined ? ['id', 'class', 'length'] : _options$attributesTo,
|
|
209
|
+
selectorCache = options.selectorCache,
|
|
210
|
+
isUniqueCache = options.isUniqueCache;
|
|
201
211
|
|
|
202
212
|
var allSelectors = [];
|
|
203
|
-
var parents = (0, _getParents.getParents)(el);
|
|
204
213
|
|
|
205
|
-
var
|
|
206
|
-
|
|
207
|
-
|
|
214
|
+
var currentElement = el;
|
|
215
|
+
while (currentElement) {
|
|
216
|
+
var selector = selectorCache ? selectorCache.get(currentElement) : undefined;
|
|
208
217
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
var selector = getUniqueSelector(elem, selectorTypes, attributesToIgnore);
|
|
214
|
-
if (Boolean(selector)) {
|
|
215
|
-
allSelectors.push(selector);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
} catch (err) {
|
|
219
|
-
_didIteratorError2 = true;
|
|
220
|
-
_iteratorError2 = err;
|
|
221
|
-
} finally {
|
|
222
|
-
try {
|
|
223
|
-
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
224
|
-
_iterator2.return();
|
|
225
|
-
}
|
|
226
|
-
} finally {
|
|
227
|
-
if (_didIteratorError2) {
|
|
228
|
-
throw _iteratorError2;
|
|
218
|
+
if (!selector) {
|
|
219
|
+
selector = getUniqueSelector(currentElement, selectorTypes, attributesToIgnore);
|
|
220
|
+
if (selectorCache) {
|
|
221
|
+
selectorCache.set(currentElement, selector);
|
|
229
222
|
}
|
|
230
223
|
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
var selectors = [];
|
|
234
|
-
var _iteratorNormalCompletion3 = true;
|
|
235
|
-
var _didIteratorError3 = false;
|
|
236
|
-
var _iteratorError3 = undefined;
|
|
237
|
-
|
|
238
|
-
try {
|
|
239
|
-
for (var _iterator3 = allSelectors[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
240
|
-
var it = _step3.value;
|
|
241
224
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
225
|
+
allSelectors.unshift(selector);
|
|
226
|
+
var maybeUniqueSelector = allSelectors.join(' > ');
|
|
227
|
+
var isUniqueSelector = isUniqueCache ? isUniqueCache.get(maybeUniqueSelector) : undefined;
|
|
228
|
+
if (isUniqueSelector === undefined) {
|
|
229
|
+
isUniqueSelector = (0, _isUnique.isUnique)(el, maybeUniqueSelector);
|
|
230
|
+
if (isUniqueCache) {
|
|
231
|
+
isUniqueCache.set(maybeUniqueSelector, isUniqueSelector);
|
|
246
232
|
}
|
|
247
233
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
} finally {
|
|
252
|
-
try {
|
|
253
|
-
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
254
|
-
_iterator3.return();
|
|
255
|
-
}
|
|
256
|
-
} finally {
|
|
257
|
-
if (_didIteratorError3) {
|
|
258
|
-
throw _iteratorError3;
|
|
259
|
-
}
|
|
234
|
+
|
|
235
|
+
if (isUniqueSelector) {
|
|
236
|
+
return maybeUniqueSelector;
|
|
260
237
|
}
|
|
238
|
+
currentElement = currentElement.parentNode;
|
|
261
239
|
}
|
|
262
240
|
|
|
263
241
|
return null;
|
package/lib/isUnique.js
CHANGED
|
@@ -12,6 +12,10 @@ exports.isUnique = isUnique;
|
|
|
12
12
|
*/
|
|
13
13
|
function isUnique(el, selector) {
|
|
14
14
|
if (!Boolean(selector)) return false;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
try {
|
|
16
|
+
var elems = el.ownerDocument.querySelectorAll(selector);
|
|
17
|
+
return elems.length === 1 && elems[0] === el;
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
17
21
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cypress/unique-selector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Given a DOM node, return a unique CSS selector matching only that element",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"jsnext:main": "./src/index.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"build": "npm run compile",
|
|
12
12
|
"test": "npm run compile && mocha --ignore-leaks",
|
|
13
13
|
"compile": "babel -d lib/ src/",
|
|
14
|
-
"
|
|
14
|
+
"prepublishOnly": "npm run compile",
|
|
15
15
|
"watch": "npm-scripts-watcher"
|
|
16
16
|
},
|
|
17
17
|
"watch": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "git://github.com/
|
|
24
|
+
"url": "git://github.com/cypress-io/unique-selector.git"
|
|
25
25
|
},
|
|
26
26
|
"keywords": [
|
|
27
27
|
"dom",
|
|
@@ -30,13 +30,7 @@
|
|
|
30
30
|
"selector",
|
|
31
31
|
"event"
|
|
32
32
|
],
|
|
33
|
-
"author": "
|
|
34
|
-
"contributors": [
|
|
35
|
-
{
|
|
36
|
-
"name": "Avraam Mavridis",
|
|
37
|
-
"email": "avr.mav@gmail.com"
|
|
38
|
-
}
|
|
39
|
-
],
|
|
33
|
+
"author": "Cypress",
|
|
40
34
|
"license": "MIT",
|
|
41
35
|
"devDependencies": {
|
|
42
36
|
"babel-cli": "^6.26.0",
|
|
@@ -58,5 +52,8 @@
|
|
|
58
52
|
},
|
|
59
53
|
"dependencies": {
|
|
60
54
|
"css.escape": "^1.5.1"
|
|
61
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"files": [
|
|
57
|
+
"lib"
|
|
58
|
+
]
|
|
62
59
|
}
|
package/.babelrc
DELETED
package/.eslintrc
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"rules": {
|
|
3
|
-
"quotes": [
|
|
4
|
-
2,
|
|
5
|
-
"single"
|
|
6
|
-
],
|
|
7
|
-
"linebreak-style": [
|
|
8
|
-
2,
|
|
9
|
-
"unix"
|
|
10
|
-
],
|
|
11
|
-
"semi": [
|
|
12
|
-
2,
|
|
13
|
-
"always"
|
|
14
|
-
],
|
|
15
|
-
"no-console": 0,
|
|
16
|
-
"max-len": [1, 160],
|
|
17
|
-
"quote-props": [1, "consistent-as-needed"],
|
|
18
|
-
"no-cond-assign": [2, "except-parens"],
|
|
19
|
-
"radix": 0,
|
|
20
|
-
"keyword-spacing": 0,
|
|
21
|
-
"one-var": 0,
|
|
22
|
-
"func-names": 0,
|
|
23
|
-
"padded-blocks": 0,
|
|
24
|
-
"computed-property-spacing": [2, "always"],
|
|
25
|
-
"space-infix-ops": 0,
|
|
26
|
-
"no-unused-vars": [1, {"vars": "local", "args": "none"}],
|
|
27
|
-
"space-before-function-paren": 2,
|
|
28
|
-
"space-in-parens": [2, "always"],
|
|
29
|
-
"key-spacing": [2, { "align": "colon", "beforeColon": true, "afterColon": true }],
|
|
30
|
-
"brace-style": [2, "allman", { "allowSingleLine": true }]
|
|
31
|
-
},
|
|
32
|
-
"env": {
|
|
33
|
-
"es6": true,
|
|
34
|
-
"browser": true,
|
|
35
|
-
"node": true
|
|
36
|
-
},
|
|
37
|
-
"globals": {
|
|
38
|
-
"describe": true,
|
|
39
|
-
"it": true
|
|
40
|
-
},
|
|
41
|
-
"extends": "airbnb/base"
|
|
42
|
-
}
|