@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.
Files changed (45) hide show
  1. package/lib/getData.js +7 -23
  2. package/lib/getName.js +19 -0
  3. package/lib/index.js +34 -56
  4. package/lib/isUnique.js +6 -2
  5. package/package.json +8 -11
  6. package/.babelrc +0 -3
  7. package/.eslintrc +0 -42
  8. package/.history/package-lock_20211116100405.json +0 -7884
  9. package/.history/package-lock_20211116101347.json +0 -7884
  10. package/.history/package_20180226102655.json +0 -62
  11. package/.history/package_20211018091805.json +0 -62
  12. package/.history/package_20211018091928.json +0 -62
  13. package/.history/package_20211116101343.json +0 -62
  14. package/.history/src/getData_20211116100405.js +0 -24
  15. package/.history/src/getData_20211116100500.js +0 -24
  16. package/.history/src/getData_20211116100511.js +0 -24
  17. package/.history/src/getData_20211116100803.js +0 -25
  18. package/.history/src/getData_20211116100925.js +0 -25
  19. package/.history/src/getData_20211116101054.js +0 -25
  20. package/.history/src/getData_20211116101058.js +0 -25
  21. package/.history/src/getData_20211116101234.js +0 -26
  22. package/.history/src/getData_20211116101243.js +0 -28
  23. package/.history/src/getData_20211116101301.js +0 -29
  24. package/.history/test/unique-selector_20180226102601.js +0 -131
  25. package/.history/test/unique-selector_20211018092001.js +0 -131
  26. package/.history/test/unique-selector_20211018092018.js +0 -131
  27. package/.history/test/unique-selector_20211018092209.js +0 -132
  28. package/.history/test/unique-selector_20211018092230.js +0 -132
  29. package/.history/test/unique-selector_20211018092245.js +0 -130
  30. package/.travis.yml +0 -11
  31. package/component.json +0 -12
  32. package/src/getAttributes.js +0 -20
  33. package/src/getClasses.js +0 -38
  34. package/src/getCombinations.js +0 -44
  35. package/src/getData.js +0 -29
  36. package/src/getID.js +0 -17
  37. package/src/getNthChild.js +0 -33
  38. package/src/getParents.js +0 -19
  39. package/src/getTag.js +0 -9
  40. package/src/index.js +0 -197
  41. package/src/isElement.js +0 -17
  42. package/src/isUnique.js +0 -12
  43. package/static/bundle.js +0 -5
  44. package/test/index.html +0 -0
  45. package/test/unique-selector.js +0 -146
package/lib/getData.js CHANGED
@@ -1,27 +1,15 @@
1
- 'use strict';
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
- * @return { Function }
14
- * @param { Object } element
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 (needsQuote(value)) {
37
- // if we have value that needs quotes
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 '[' + nodeName + ']';
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 elmenet
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
- var elements = parentNode.querySelectorAll(selector);
66
- return elements.length === 1 && elements[0] === element;
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 _iteratorNormalCompletion2 = true;
206
- var _didIteratorError2 = false;
207
- var _iteratorError2 = undefined;
214
+ var currentElement = el;
215
+ while (currentElement) {
216
+ var selector = selectorCache ? selectorCache.get(currentElement) : undefined;
208
217
 
209
- try {
210
- for (var _iterator2 = parents[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
211
- var elem = _step2.value;
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
- selectors.unshift(it);
243
- var _selector = selectors.join(' > ');
244
- if ((0, _isUnique.isUnique)(el, _selector)) {
245
- return _selector;
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
- } catch (err) {
249
- _didIteratorError3 = true;
250
- _iteratorError3 = err;
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
- var elems = el.ownerDocument.querySelectorAll(selector);
16
- return elems.length === 1 && elems[0] === el;
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.4.3",
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
- "prepublish": "npm run compile",
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/ericclemmons/unique-selector.git"
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": "Eric Clemmons <eric@smarterspam.com>",
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
@@ -1,3 +0,0 @@
1
- {
2
- "presets": ["latest"]
3
- }
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
- }