appium-uiautomator2-driver 2.29.11 → 2.30.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 (135) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/index.d.ts +4 -0
  3. package/build/index.d.ts.map +1 -0
  4. package/build/index.js +8 -15
  5. package/build/index.js.map +1 -0
  6. package/build/lib/commands/actions.d.ts +2 -0
  7. package/build/lib/commands/actions.d.ts.map +1 -0
  8. package/build/lib/commands/actions.js +67 -62
  9. package/build/lib/commands/actions.js.map +1 -1
  10. package/build/lib/commands/alert.d.ts +2 -0
  11. package/build/lib/commands/alert.d.ts.map +1 -0
  12. package/build/lib/commands/alert.js +28 -26
  13. package/build/lib/commands/alert.js.map +1 -1
  14. package/build/lib/commands/app-strings.d.ts +3 -0
  15. package/build/lib/commands/app-strings.d.ts.map +1 -0
  16. package/build/lib/commands/app-strings.js +86 -57
  17. package/build/lib/commands/app-strings.js.map +1 -1
  18. package/build/lib/commands/battery.d.ts +2 -0
  19. package/build/lib/commands/battery.d.ts.map +1 -0
  20. package/build/lib/commands/battery.js +26 -16
  21. package/build/lib/commands/battery.js.map +1 -1
  22. package/build/lib/commands/element.d.ts +2 -0
  23. package/build/lib/commands/element.d.ts.map +1 -0
  24. package/build/lib/commands/element.js +140 -159
  25. package/build/lib/commands/element.js.map +1 -1
  26. package/build/lib/commands/find.d.ts +2 -0
  27. package/build/lib/commands/find.d.ts.map +1 -0
  28. package/build/lib/commands/find.js +39 -25
  29. package/build/lib/commands/find.js.map +1 -1
  30. package/build/lib/commands/general.d.ts +4 -0
  31. package/build/lib/commands/general.d.ts.map +1 -0
  32. package/build/lib/commands/general.js +217 -215
  33. package/build/lib/commands/general.js.map +1 -1
  34. package/build/lib/commands/gestures.d.ts +2 -0
  35. package/build/lib/commands/gestures.d.ts.map +1 -0
  36. package/build/lib/commands/gestures.js +206 -193
  37. package/build/lib/commands/gestures.js.map +1 -1
  38. package/build/lib/commands/index.d.ts +2 -0
  39. package/build/lib/commands/index.d.ts.map +1 -0
  40. package/build/lib/commands/index.js +13 -22
  41. package/build/lib/commands/index.js.map +1 -1
  42. package/build/lib/commands/mixins.d.ts +84 -0
  43. package/build/lib/commands/mixins.d.ts.map +1 -0
  44. package/build/lib/commands/mixins.js +23 -0
  45. package/build/lib/commands/mixins.js.map +1 -0
  46. package/build/lib/commands/screenshot.d.ts +2 -0
  47. package/build/lib/commands/screenshot.d.ts.map +1 -0
  48. package/build/lib/commands/screenshot.js +77 -62
  49. package/build/lib/commands/screenshot.js.map +1 -1
  50. package/build/lib/commands/touch.d.ts +2 -0
  51. package/build/lib/commands/touch.d.ts.map +1 -0
  52. package/build/lib/commands/touch.js +48 -38
  53. package/build/lib/commands/touch.js.map +1 -1
  54. package/build/lib/commands/types.d.ts +452 -0
  55. package/build/lib/commands/types.d.ts.map +1 -0
  56. package/build/lib/commands/types.js +3 -0
  57. package/build/lib/commands/types.js.map +1 -0
  58. package/build/lib/commands/viewport.d.ts +2 -0
  59. package/build/lib/commands/viewport.d.ts.map +1 -0
  60. package/build/lib/commands/viewport.js +37 -35
  61. package/build/lib/commands/viewport.js.map +1 -1
  62. package/build/lib/constraints.d.ts +334 -0
  63. package/build/lib/constraints.d.ts.map +1 -0
  64. package/build/lib/constraints.js +51 -0
  65. package/build/lib/constraints.js.map +1 -0
  66. package/build/lib/css-converter.d.ts +45 -0
  67. package/build/lib/css-converter.d.ts.map +1 -0
  68. package/build/lib/css-converter.js +272 -175
  69. package/build/lib/css-converter.js.map +1 -1
  70. package/build/lib/driver.d.ts +912 -0
  71. package/build/lib/driver.d.ts.map +1 -0
  72. package/build/lib/driver.js +738 -482
  73. package/build/lib/driver.js.map +1 -1
  74. package/build/lib/execute-method-map.d.ts +477 -0
  75. package/build/lib/execute-method-map.d.ts.map +1 -0
  76. package/build/lib/execute-method-map.js +542 -0
  77. package/build/lib/execute-method-map.js.map +1 -0
  78. package/build/lib/extensions.d.ts +3 -0
  79. package/build/lib/extensions.d.ts.map +1 -0
  80. package/build/lib/extensions.js +7 -9
  81. package/build/lib/extensions.js.map +1 -1
  82. package/build/lib/helpers.d.ts +7 -0
  83. package/build/lib/helpers.d.ts.map +1 -0
  84. package/build/lib/helpers.js +36 -29
  85. package/build/lib/helpers.js.map +1 -1
  86. package/build/lib/logger.d.ts +3 -0
  87. package/build/lib/logger.d.ts.map +1 -0
  88. package/build/lib/logger.js +5 -10
  89. package/build/lib/logger.js.map +1 -1
  90. package/build/lib/method-map.d.ts +389 -0
  91. package/build/lib/method-map.d.ts.map +1 -0
  92. package/build/lib/method-map.js +11 -17
  93. package/build/lib/method-map.js.map +1 -1
  94. package/build/lib/types.d.ts +45 -0
  95. package/build/lib/types.d.ts.map +1 -0
  96. package/build/lib/types.js +3 -0
  97. package/build/lib/types.js.map +1 -0
  98. package/build/lib/uiautomator2.d.ts +45 -0
  99. package/build/lib/uiautomator2.d.ts.map +1 -0
  100. package/build/lib/uiautomator2.js +340 -299
  101. package/build/lib/uiautomator2.js.map +1 -1
  102. package/build/lib/utils.d.ts +10 -0
  103. package/build/lib/utils.d.ts.map +1 -0
  104. package/build/lib/utils.js +23 -16
  105. package/build/lib/utils.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -0
  107. package/index.js +5 -3
  108. package/lib/commands/actions.js +115 -101
  109. package/lib/commands/alert.js +36 -44
  110. package/lib/commands/app-strings.js +79 -58
  111. package/lib/commands/battery.js +27 -28
  112. package/lib/commands/element.js +231 -134
  113. package/lib/commands/find.js +40 -21
  114. package/lib/commands/general.js +271 -336
  115. package/lib/commands/gestures.js +252 -366
  116. package/lib/commands/index.js +11 -31
  117. package/lib/commands/mixins.ts +167 -0
  118. package/lib/commands/screenshot.js +80 -76
  119. package/lib/commands/touch.js +64 -31
  120. package/lib/commands/types.ts +473 -0
  121. package/lib/commands/viewport.js +43 -31
  122. package/lib/constraints.ts +53 -0
  123. package/lib/css-converter.js +9 -1
  124. package/lib/{driver.js → driver.ts} +383 -225
  125. package/lib/execute-method-map.ts +573 -0
  126. package/lib/method-map.ts +11 -0
  127. package/lib/types.ts +59 -0
  128. package/lib/uiautomator2.js +21 -2
  129. package/lib/utils.js +2 -2
  130. package/npm-shrinkwrap.json +363 -492
  131. package/package.json +95 -69
  132. package/build/lib/desired-caps.js +0 -71
  133. package/build/lib/desired-caps.js.map +0 -1
  134. package/lib/desired-caps.js +0 -70
  135. package/lib/method-map.js +0 -11
@@ -1,199 +1,296 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- require("source-map-support/register");
9
- var _cssSelectorParser = require("css-selector-parser");
10
- var _lodash = _interopRequireDefault(require("lodash"));
11
- var _driver = require("appium/driver");
12
- var _logger = _interopRequireDefault(require("./logger"));
13
- const parseCssSelector = (0, _cssSelectorParser.createParser)({
14
- syntax: {
15
- pseudoClasses: {
16
- unknown: 'accept',
17
- definitions: {
18
- Selector: ['has']
19
- }
20
- },
21
- combinators: ['>', '+', '~'],
22
- attributes: {
23
- operators: ['^=', '$=', '*=', '~=', '=']
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const css_selector_parser_1 = require("css-selector-parser");
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const driver_1 = require("appium/driver");
9
+ const logger_1 = __importDefault(require("./logger"));
10
+ const parseCssSelector = (0, css_selector_parser_1.createParser)({
11
+ syntax: {
12
+ pseudoClasses: {
13
+ unknown: 'accept',
14
+ definitions: {
15
+ Selector: ['has'],
16
+ }
17
+ },
18
+ combinators: ['>', '+', '~'],
19
+ attributes: {
20
+ operators: ['^=', '$=', '*=', '~=', '=']
21
+ },
22
+ ids: true,
23
+ classNames: true,
24
+ tag: {
25
+ wildcard: true
26
+ },
24
27
  },
25
- ids: true,
26
- classNames: true,
27
- tag: {
28
- wildcard: true
29
- }
30
- },
31
- substitutes: true
28
+ substitutes: true
32
29
  });
33
30
  const RESOURCE_ID = 'resource-id';
34
31
  const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
35
- const BOOLEAN_ATTRS = ['checkable', 'checked', 'clickable', 'enabled', 'focusable', 'focused', 'long-clickable', 'scrollable', 'selected'];
36
- const NUMERIC_ATTRS = ['index', 'instance'];
37
- const STR_ATTRS = ['description', RESOURCE_ID, 'text', 'class-name', 'package-name'];
38
- const ALL_ATTRS = [...BOOLEAN_ATTRS, ...NUMERIC_ATTRS, ...STR_ATTRS];
39
- const ATTRIBUTE_ALIASES = [[RESOURCE_ID, ['id']], ['description', ['content-description', 'content-desc', 'desc', 'accessibility-id']], ['index', ['nth-child']]];
32
+ const BOOLEAN_ATTRS = [
33
+ 'checkable', 'checked', 'clickable', 'enabled', 'focusable',
34
+ 'focused', 'long-clickable', 'scrollable', 'selected',
35
+ ];
36
+ const NUMERIC_ATTRS = [
37
+ 'index', 'instance',
38
+ ];
39
+ const STR_ATTRS = [
40
+ 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'
41
+ ];
42
+ const ALL_ATTRS = [
43
+ ...BOOLEAN_ATTRS,
44
+ ...NUMERIC_ATTRS,
45
+ ...STR_ATTRS,
46
+ ];
47
+ /** @type {[string, string[]][]} */
48
+ const ATTRIBUTE_ALIASES = [
49
+ [RESOURCE_ID, ['id']],
50
+ ['description', [
51
+ 'content-description', 'content-desc',
52
+ 'desc', 'accessibility-id',
53
+ ]],
54
+ ['index', ['nth-child']],
55
+ ];
56
+ /**
57
+ * Convert hyphen separated word to snake case
58
+ *
59
+ * @param {string?} str
60
+ * @returns {string} The hyphen separated word translated to snake case
61
+ */
40
62
  function toSnakeCase(str) {
41
- if (!str) {
42
- return '';
43
- }
44
- const tokens = str.split('-').map(str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());
45
- const out = tokens.join('');
46
- return out.charAt(0).toLowerCase() + out.slice(1);
63
+ if (!str) {
64
+ return '';
65
+ }
66
+ const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());
67
+ const out = tokens.join('');
68
+ return out.charAt(0).toLowerCase() + out.slice(1);
47
69
  }
70
+ /**
71
+ * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception
72
+ *
73
+ * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} css A
74
+ * CSS object that has 'name' and 'value'
75
+ * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'
76
+ */
48
77
  function requireBoolean(css) {
49
- var _ref;
50
- const val = _lodash.default.toLower((_ref = css.value ?? css.argument) === null || _ref === void 0 ? void 0 : _ref.value) || 'true';
51
- if (['true', 'false'].includes(val)) {
52
- return val;
53
- }
54
- throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
78
+ // @ts-ignore Attributes should exist
79
+ const val = lodash_1.default.toLower((css.value ?? css.argument)?.value) || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)
80
+ if (['true', 'false'].includes(val)) {
81
+ return val;
82
+ }
83
+ // @ts-ignore The attribute should exist
84
+ throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
55
85
  }
86
+ /**
87
+ * Get the canonical form of a CSS attribute name
88
+ *
89
+ * Converts to lowercase and if an attribute name is an alias for something else, return
90
+ * what it is an alias for
91
+ *
92
+ * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} cssEntity CSS object
93
+ * @returns {string} The canonical attribute name
94
+ */
56
95
  function requireEntityName(cssEntity) {
57
- const attrName = cssEntity.name.toLowerCase();
58
- if (ALL_ATTRS.includes(attrName)) {
59
- return attrName.toLowerCase();
60
- }
61
- for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
62
- if (aliasAttrs.includes(attrName)) {
63
- return officialAttr;
96
+ const attrName = cssEntity.name.toLowerCase();
97
+ // Check if it's supported and if it is, return it
98
+ if (ALL_ATTRS.includes(attrName)) {
99
+ return attrName.toLowerCase();
64
100
  }
65
- }
66
- throw new Error(`'${attrName}' is not a valid attribute. ` + `Supported attributes are '${ALL_ATTRS.join(', ')}'`);
101
+ // If attrName is an alias for something else, return that
102
+ for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
103
+ if (aliasAttrs.includes(attrName)) {
104
+ return officialAttr;
105
+ }
106
+ }
107
+ throw new Error(`'${attrName}' is not a valid attribute. ` +
108
+ `Supported attributes are '${ALL_ATTRS.join(', ')}'`);
67
109
  }
110
+ /**
111
+ * Get a regex that matches a whole word. For the ~= CSS attribute selector.
112
+ *
113
+ * @param {string} word
114
+ * @returns {string} A regex "word" matcher
115
+ */
68
116
  function getWordMatcherRegex(word) {
69
- return `\\b(\\w*${_lodash.default.escapeRegExp(word)}\\w*)\\b`;
117
+ return `\\b(\\w*${lodash_1.default.escapeRegExp(word)}\\w*)\\b`;
70
118
  }
71
119
  class CssConverter {
72
- constructor(selector, pkg) {
73
- this.selector = selector;
74
- this.pkg = pkg;
75
- }
76
- formatIdLocator(locator) {
77
- return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
78
- }
79
- parseAttr(cssAttr) {
80
- var _cssAttr$value;
81
- const attrValue = (_cssAttr$value = cssAttr.value) === null || _cssAttr$value === void 0 ? void 0 : _cssAttr$value.value;
82
- if (!_lodash.default.isString(attrValue) && !_lodash.default.isEmpty(attrValue)) {
83
- throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);
84
- }
85
- const attrName = requireEntityName(cssAttr);
86
- const methodName = toSnakeCase(attrName);
87
- if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
88
- throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
89
- }
90
- if (BOOLEAN_ATTRS.includes(attrName)) {
91
- return `.${methodName}(${requireBoolean(cssAttr)})`;
92
- }
93
- let value = attrValue || '';
94
- if (attrName === RESOURCE_ID) {
95
- value = this.formatIdLocator(value);
120
+ constructor(selector, pkg) {
121
+ this.selector = selector;
122
+ this.pkg = pkg;
96
123
  }
97
- if (value === '') {
98
- return `.${methodName}Matches("")`;
124
+ /**
125
+ * Add `<pkgName>:id/` prefix to beginning of string if it's not there already
126
+ *
127
+ * @param {string} locator The initial locator
128
+ * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)
129
+ */
130
+ formatIdLocator(locator) {
131
+ return ID_LOCATOR_PATTERN.test(locator)
132
+ ? locator
133
+ : `${this.pkg || 'android'}:id/${locator}`;
99
134
  }
100
- switch (cssAttr.operator) {
101
- case '=':
102
- return `.${methodName}("${value}")`;
103
- case '*=':
104
- if (['description', 'text'].includes(attrName)) {
105
- return `.${methodName}Contains("${value}")`;
106
- }
107
- return `.${methodName}Matches("${_lodash.default.escapeRegExp(value)}")`;
108
- case '^=':
109
- if (['description', 'text'].includes(attrName)) {
110
- return `.${methodName}StartsWith("${value}")`;
111
- }
112
- return `.${methodName}Matches("^${_lodash.default.escapeRegExp(value)}")`;
113
- case '$=':
114
- return `.${methodName}Matches("${_lodash.default.escapeRegExp(value)}$")`;
115
- case '~=':
116
- return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
117
- default:
118
- throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
119
- }
120
- }
121
- parsePseudo(cssPseudo) {
122
- var _cssPseudo$argument;
123
- const argValue = (_cssPseudo$argument = cssPseudo.argument) === null || _cssPseudo$argument === void 0 ? void 0 : _cssPseudo$argument.value;
124
- if (!_lodash.default.isString(argValue) && !_lodash.default.isEmpty(argValue)) {
125
- throw new Error(`'${cssPseudo.name}=${argValue}'. ` + `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);
126
- }
127
- const pseudoName = requireEntityName(cssPseudo);
128
- if (BOOLEAN_ATTRS.includes(pseudoName)) {
129
- return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
130
- }
131
- if (NUMERIC_ATTRS.includes(pseudoName)) {
132
- return `.${pseudoName}(${argValue})`;
133
- }
134
- }
135
- parseCssRule(cssRule) {
136
- var _cssRule$tag;
137
- if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
138
- throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
139
- }
140
- let uiAutomatorSelector = 'new UiSelector()';
141
- const tagName = (_cssRule$tag = cssRule.tag) === null || _cssRule$tag === void 0 ? void 0 : _cssRule$tag.name;
142
- if (tagName && tagName !== '*') {
143
- let androidClass = [tagName];
144
- if (cssRule.classNames) {
145
- for (const cssClassNames of cssRule.classNames) {
146
- androidClass.push(cssClassNames);
147
- }
148
- uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
149
- } else {
150
- uiAutomatorSelector += `.classNameMatches("${tagName}")`;
151
- }
152
- } else if (!_lodash.default.isEmpty(cssRule.classNames)) {
153
- uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
154
- }
155
- if (!_lodash.default.isEmpty(cssRule.ids)) {
156
- uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.ids[0])}")`;
157
- }
158
- if (cssRule.attributes) {
159
- for (const attr of cssRule.attributes) {
160
- uiAutomatorSelector += this.parseAttr(attr);
161
- }
162
- }
163
- if (cssRule.pseudoClasses) {
164
- for (const pseudo of cssRule.pseudoClasses) {
165
- const sel = this.parsePseudo(pseudo);
166
- if (sel) {
167
- uiAutomatorSelector += sel;
135
+ /**
136
+ * Convert a CSS attribute into a UiSelector method call
137
+ *
138
+ * @param {import('css-selector-parser').AstAttribute} cssAttr CSS attribute object
139
+ * @returns {string} CSS attribute parsed as UiSelector
140
+ */
141
+ parseAttr(cssAttr) {
142
+ // @ts-ignore Value should be present
143
+ const attrValue = cssAttr.value?.value;
144
+ if (!lodash_1.default.isString(attrValue) && !lodash_1.default.isEmpty(attrValue)) {
145
+ throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` +
146
+ `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);
147
+ }
148
+ const attrName = requireEntityName(cssAttr);
149
+ const methodName = toSnakeCase(attrName);
150
+ // Validate that it's a supported attribute
151
+ if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
152
+ throw new Error(`'${attrName}' is not supported. Supported attributes are ` +
153
+ `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
154
+ }
155
+ // Parse boolean, if it's a boolean attribute
156
+ if (BOOLEAN_ATTRS.includes(attrName)) {
157
+ return `.${methodName}(${requireBoolean(cssAttr)})`;
158
+ }
159
+ // Otherwise parse as string
160
+ let value = attrValue || '';
161
+ if (attrName === RESOURCE_ID) {
162
+ value = this.formatIdLocator(value);
163
+ }
164
+ if (value === '') {
165
+ return `.${methodName}Matches("")`;
166
+ }
167
+ switch (cssAttr.operator) {
168
+ case '=':
169
+ return `.${methodName}("${value}")`;
170
+ case '*=':
171
+ if (['description', 'text'].includes(attrName)) {
172
+ return `.${methodName}Contains("${value}")`;
173
+ }
174
+ return `.${methodName}Matches("${lodash_1.default.escapeRegExp(value)}")`;
175
+ case '^=':
176
+ if (['description', 'text'].includes(attrName)) {
177
+ return `.${methodName}StartsWith("${value}")`;
178
+ }
179
+ return `.${methodName}Matches("^${lodash_1.default.escapeRegExp(value)}")`;
180
+ case '$=':
181
+ return `.${methodName}Matches("${lodash_1.default.escapeRegExp(value)}$")`;
182
+ case '~=':
183
+ return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
184
+ default:
185
+ // Unreachable, but adding error in case a new CSS attribute is added.
186
+ throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +
187
+ ` '=', '*=', '^=', '$=' and '~=' are supported.`);
168
188
  }
169
- }
170
189
  }
171
- if (cssRule.nestedRule) {
172
- uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;
190
+ /**
191
+ * Convert a CSS pseudo class to a UiSelector
192
+ *
193
+ * @param {import('css-selector-parser').AstPseudoClass} cssPseudo CSS Pseudo class
194
+ * @returns {string|null|undefined} Pseudo selector parsed as UiSelector
195
+ */
196
+ parsePseudo(cssPseudo) {
197
+ // @ts-ignore The attribute should exist
198
+ const argValue = cssPseudo.argument?.value;
199
+ if (!lodash_1.default.isString(argValue) && !lodash_1.default.isEmpty(argValue)) {
200
+ throw new Error(`'${cssPseudo.name}=${argValue}'. ` +
201
+ `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);
202
+ }
203
+ const pseudoName = requireEntityName(cssPseudo);
204
+ if (BOOLEAN_ATTRS.includes(pseudoName)) {
205
+ return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
206
+ }
207
+ if (NUMERIC_ATTRS.includes(pseudoName)) {
208
+ return `.${pseudoName}(${argValue})`;
209
+ }
173
210
  }
174
- return uiAutomatorSelector;
175
- }
176
- parseCssObject(css) {
177
- if (!_lodash.default.isEmpty(css.rules)) {
178
- return this.parseCssRule(css.rules[0]);
211
+ /**
212
+ * Convert a CSS rule to a UiSelector
213
+ * @param {import('css-selector-parser').AstRule} cssRule CSS rule definition
214
+ */
215
+ parseCssRule(cssRule) {
216
+ if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
217
+ throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` +
218
+ `Only child combinator (>) and descendant combinator are supported.`);
219
+ }
220
+ let uiAutomatorSelector = 'new UiSelector()';
221
+ // @ts-ignore the attribute should exist
222
+ const tagName = cssRule.tag?.name;
223
+ if (tagName && tagName !== '*') {
224
+ let androidClass = [tagName];
225
+ if (cssRule.classNames) {
226
+ for (const cssClassNames of cssRule.classNames) {
227
+ androidClass.push(cssClassNames);
228
+ }
229
+ uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
230
+ }
231
+ else {
232
+ uiAutomatorSelector += `.classNameMatches("${tagName}")`;
233
+ }
234
+ }
235
+ else if (!lodash_1.default.isEmpty(cssRule.classNames)) {
236
+ // @ts-ignore the attribute should exist
237
+ uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
238
+ }
239
+ if (!lodash_1.default.isEmpty(cssRule.ids)) {
240
+ // @ts-ignore The attribute should exist
241
+ uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.ids[0])}")`;
242
+ }
243
+ if (cssRule.attributes) {
244
+ for (const attr of cssRule.attributes) {
245
+ uiAutomatorSelector += this.parseAttr(attr);
246
+ }
247
+ }
248
+ if (cssRule.pseudoClasses) {
249
+ for (const pseudo of cssRule.pseudoClasses) {
250
+ const sel = this.parsePseudo(pseudo);
251
+ if (sel) {
252
+ uiAutomatorSelector += sel;
253
+ }
254
+ }
255
+ }
256
+ if (cssRule.nestedRule) {
257
+ uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;
258
+ }
259
+ return uiAutomatorSelector;
179
260
  }
180
- throw new Error('No rules could be parsed out of the current selector');
181
- }
182
- toUiAutomatorSelector() {
183
- let cssObj;
184
- try {
185
- cssObj = parseCssSelector(this.selector);
186
- } catch (e) {
187
- _logger.default.debug(e.stack);
188
- throw new _driver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);
261
+ /**
262
+ * Convert CSS object to UiAutomator2 selector
263
+ * @param {import('css-selector-parser').AstSelector} css CSS object
264
+ * @returns {string} The CSS object parsed as a UiSelector
265
+ */
266
+ parseCssObject(css) {
267
+ if (!lodash_1.default.isEmpty(css.rules)) {
268
+ return this.parseCssRule(css.rules[0]);
269
+ }
270
+ throw new Error('No rules could be parsed out of the current selector');
189
271
  }
190
- try {
191
- return this.parseCssObject(cssObj);
192
- } catch (e) {
193
- _logger.default.debug(e.stack);
194
- throw new _driver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);
272
+ /**
273
+ * Convert a CSS selector to a UiAutomator2 selector
274
+ *
275
+ * @returns {string} The CSS selector converted to a UiSelector
276
+ */
277
+ toUiAutomatorSelector() {
278
+ let cssObj;
279
+ try {
280
+ cssObj = parseCssSelector(this.selector);
281
+ }
282
+ catch (e) {
283
+ logger_1.default.debug(e.stack);
284
+ throw new driver_1.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);
285
+ }
286
+ try {
287
+ return this.parseCssObject(cssObj);
288
+ }
289
+ catch (e) {
290
+ logger_1.default.debug(e.stack);
291
+ throw new driver_1.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);
292
+ }
195
293
  }
196
- }
197
294
  }
198
- var _default = exports.default = CssConverter;
199
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3NzU2VsZWN0b3JQYXJzZXIiLCJyZXF1aXJlIiwiX2xvZGFzaCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZHJpdmVyIiwiX2xvZ2dlciIsInBhcnNlQ3NzU2VsZWN0b3IiLCJjcmVhdGVQYXJzZXIiLCJzeW50YXgiLCJwc2V1ZG9DbGFzc2VzIiwidW5rbm93biIsImRlZmluaXRpb25zIiwiU2VsZWN0b3IiLCJjb21iaW5hdG9ycyIsImF0dHJpYnV0ZXMiLCJvcGVyYXRvcnMiLCJpZHMiLCJjbGFzc05hbWVzIiwidGFnIiwid2lsZGNhcmQiLCJzdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwicmVxdWlyZUJvb2xlYW4iLCJjc3MiLCJfcmVmIiwidmFsIiwiXyIsInRvTG93ZXIiLCJ2YWx1ZSIsImFyZ3VtZW50IiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJyZXF1aXJlRW50aXR5TmFtZSIsImNzc0VudGl0eSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZXNjYXBlUmVnRXhwIiwiQ3NzQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJzZWxlY3RvciIsInBrZyIsImZvcm1hdElkTG9jYXRvciIsImxvY2F0b3IiLCJ0ZXN0IiwicGFyc2VBdHRyIiwiY3NzQXR0ciIsIl9jc3NBdHRyJHZhbHVlIiwiYXR0clZhbHVlIiwiaXNTdHJpbmciLCJpc0VtcHR5IiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJfY3NzUHNldWRvJGFyZ3VtZW50IiwiYXJnVmFsdWUiLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIl9jc3NSdWxlJHRhZyIsImNvbWJpbmF0b3IiLCJ1aUF1dG9tYXRvclNlbGVjdG9yIiwidGFnTmFtZSIsImFuZHJvaWRDbGFzcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiYXR0ciIsInBzZXVkbyIsInNlbCIsIm5lc3RlZFJ1bGUiLCJwYXJzZUNzc09iamVjdCIsInJ1bGVzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwiZSIsImxvZyIsImRlYnVnIiwic3RhY2siLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciIsIm1lc3NhZ2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Nzcy1jb252ZXJ0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgcGFyc2VDc3NTZWxlY3RvciA9IGNyZWF0ZVBhcnNlcih7XG4gIHN5bnRheDoge1xuICAgIHBzZXVkb0NsYXNzZXM6IHtcbiAgICAgIHVua25vd246ICdhY2NlcHQnLFxuICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgU2VsZWN0b3I6IFsnaGFzJ10sXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21iaW5hdG9yczogWyc+JywgJysnLCAnfiddLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIG9wZXJhdG9yczogWydePScsICckPScsICcqPScsICd+PScsICc9J11cbiAgICB9LFxuICAgIGlkczogdHJ1ZSxcbiAgICBjbGFzc05hbWVzOiB0cnVlLFxuICAgIHRhZzoge1xuICAgICAgd2lsZGNhcmQ6IHRydWVcbiAgICB9LFxuICB9LFxuICBzdWJzdGl0dXRlczogdHJ1ZVxufSk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZz99IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdEF0dHJpYnV0ZXxpbXBvcnQoJ2Nzcy1zZWxlY3Rvci1wYXJzZXInKS5Bc3RQc2V1ZG9DbGFzc30gY3NzIEFcbiAqIENTUyBvYmplY3QgdGhhdCBoYXMgJ25hbWUnIGFuZCAndmFsdWUnXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuIElmIHZhbHVlIGlzIGVtcHR5LCByZXR1cm4gJ3RydWUnXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVCb29sZWFuIChjc3MpIHtcbiAgY29uc3QgdmFsID0gXy50b0xvd2VyKChjc3MudmFsdWUgPz8gY3NzLmFyZ3VtZW50KT8udmFsdWUpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfGltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NFbnRpdHkgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiByZXF1aXJlRW50aXR5TmFtZSAoY3NzRW50aXR5KSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzRW50aXR5Lm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtfLmVzY2FwZVJlZ0V4cCh3b3JkKX1cXFxcdyopXFxcXGJgO1xufVxuXG5cbmNsYXNzIENzc0NvbnZlcnRlciB7XG5cbiAgY29uc3RydWN0b3IgKHNlbGVjdG9yLCBwa2cpIHtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5wa2cgPSBwa2c7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGA8cGtnTmFtZT46aWQvYCBwcmVmaXggdG8gYmVnaW5uaW5nIG9mIHN0cmluZyBpZiBpdCdzIG5vdCB0aGVyZSBhbHJlYWR5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYDxwa2dOYW1lPjppZC9gIHByZXBlbmRlZCAoaWYgaXQgd2Fzbid0IGFscmVhZHkpXG4gICAqL1xuICBmb3JtYXRJZExvY2F0b3IgKGxvY2F0b3IpIHtcbiAgICByZXR1cm4gSURfTE9DQVRPUl9QQVRURVJOLnRlc3QobG9jYXRvcilcbiAgICAgID8gbG9jYXRvclxuICAgICAgOiBgJHt0aGlzLnBrZyB8fCAnYW5kcm9pZCd9OmlkLyR7bG9jYXRvcn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNzc0F0dHIudmFsdWU/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhdHRyVmFsdWUpICYmICFfLmlzRW1wdHkoYXR0clZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7YXR0clZhbHVlfScgaXMgYW4gaW52YWxpZCBhdHRyaWJ1dGUuIGAgK1xuICAgICAgICBgT25seSAnc3RyaW5nJyBhbmQgZW1wdHkgYXR0cmlidXRlIHR5cGVzIGFyZSBzdXBwb3J0ZWQuIEZvdW5kICcke2F0dHJWYWx1ZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gcmVxdWlyZUVudGl0eU5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7cmVxdWlyZUJvb2xlYW4oY3NzQXR0cil9KWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlIGFzIHN0cmluZ1xuICAgIGxldCB2YWx1ZSA9IGF0dHJWYWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnXj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfVN0YXJ0c1dpdGgoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtfLmVzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJyQ9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NQc2V1ZG8gQ1NTIFBzZXVkbyBjbGFzc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nP30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgY29uc3QgYXJnVmFsdWUgPSBjc3NQc2V1ZG8uYXJndW1lbnQ/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhcmdWYWx1ZSkgJiYgIV8uaXNFbXB0eShhcmdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7YXJnVmFsdWV9Jy4gYCArXG4gICAgICAgIGBVbnN1cHBvcnRlZCBjc3MgcHNldWRvIGNsYXNzIHZhbHVlOiAnJHthcmdWYWx1ZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBzZXVkb05hbWUgPSByZXF1aXJlRW50aXR5TmFtZShjc3NQc2V1ZG8pO1xuXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7dG9TbmFrZUNhc2UocHNldWRvTmFtZSl9KCR7cmVxdWlyZUJvb2xlYW4oY3NzUHNldWRvKX0pYDtcbiAgICB9XG5cbiAgICBpZiAoTlVNRVJJQ19BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2FyZ1ZhbHVlfSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0UnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gICAqL1xuICBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgICBpZiAoY3NzUnVsZS5jb21iaW5hdG9yICYmICFbJyAnLCAnPiddLmluY2x1ZGVzKGNzc1J1bGUuY29tYmluYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUnVsZS5jb21iaW5hdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgY29uc3QgdGFnTmFtZSA9IGNzc1J1bGUudGFnPy5uYW1lO1xuICAgIGlmICh0YWdOYW1lICYmIHRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFt0YWdOYW1lXTtcbiAgICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICAgIGFuZHJvaWRDbGFzcy5wdXNoKGNzc0NsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHt0YWdOYW1lfVwiKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KGNzc1J1bGUuY2xhc3NOYW1lcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLmNsYXNzTmFtZXMuam9pbignXFxcXC4nKX1cIilgO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjc3NSdWxlLmlkcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkc1swXSl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VBdHRyKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5wc2V1ZG9DbGFzc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBzZXVkbyBvZiBjc3NSdWxlLnBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgICBpZiAoc2VsKSB7XG4gICAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBzZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUubmVzdGVkUnVsZSkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHt0aGlzLnBhcnNlQ3NzUnVsZShjc3NSdWxlLm5lc3RlZFJ1bGUpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0U2VsZWN0b3J9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShjc3MucnVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc1J1bGUoY3NzLnJ1bGVzWzBdKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJ1bGVzIGNvdWxkIGJlIHBhcnNlZCBvdXQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZUNzc1NlbGVjdG9yKHRoaXMuc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlLm1lc3NhZ2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2UubWVzc2FnZX0nYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENzc0NvbnZlcnRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUEsTUFBTUssZ0JBQWdCLEdBQUcsSUFBQUMsK0JBQVksRUFBQztFQUNwQ0MsTUFBTSxFQUFFO0lBQ05DLGFBQWEsRUFBRTtNQUNiQyxPQUFPLEVBQUUsUUFBUTtNQUNqQkMsV0FBVyxFQUFFO1FBQ1hDLFFBQVEsRUFBRSxDQUFDLEtBQUs7TUFDbEI7SUFDRixDQUFDO0lBQ0RDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCQyxVQUFVLEVBQUU7TUFDVkMsU0FB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
295
+ exports.default = CssConverter;
296
+ //# sourceMappingURL=css-converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_interopRequireDefault","_driver","_logger","parseCssSelector","createParser","syntax","pseudoClasses","unknown","definitions","Selector","combinators","attributes","operators","ids","classNames","tag","wildcard","substitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","requireBoolean","css","_ref","val","_","toLower","value","argument","includes","Error","name","requireEntityName","cssEntity","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","_cssAttr$value","attrValue","isString","isEmpty","methodName","operator","parsePseudo","cssPseudo","_cssPseudo$argument","argValue","pseudoName","parseCssRule","cssRule","_cssRule$tag","combinator","uiAutomatorSelector","tagName","androidClass","cssClassNames","push","attr","pseudo","sel","nestedRule","parseCssObject","rules","toUiAutomatorSelector","cssObj","e","log","debug","stack","errors","InvalidSelectorError","message","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { createParser } from 'css-selector-parser';\nimport _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport log from './logger';\n\nconst parseCssSelector = createParser({\n syntax: {\n pseudoClasses: {\n unknown: 'accept',\n definitions: {\n Selector: ['has'],\n }\n },\n combinators: ['>', '+', '~'],\n attributes: {\n operators: ['^=', '$=', '*=', '~=', '=']\n },\n ids: true,\n classNames: true,\n tag: {\n wildcard: true\n },\n },\n substitutes: true\n});\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string?} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} css A\n * CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction requireBoolean (css) {\n const val = _.toLower((css.value ?? css.argument)?.value) || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} cssEntity CSS object\n * @returns {string} The canonical attribute name\n */\nfunction requireEntityName (cssEntity) {\n const attrName = cssEntity.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${_.escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {import('css-selector-parser').AstAttribute} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n const attrValue = cssAttr.value?.value;\n if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {\n throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);\n }\n const attrName = requireEntityName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${requireBoolean(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = attrValue || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${_.escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {import('css-selector-parser').AstPseudoClass} cssPseudo CSS Pseudo class\n * @returns {string?} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n const argValue = cssPseudo.argument?.value;\n if (!_.isString(argValue) && !_.isEmpty(argValue)) {\n throw new Error(`'${cssPseudo.name}=${argValue}'. ` +\n `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = requireEntityName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${argValue})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {import('css-selector-parser').AstRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {\n throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n const tagName = cssRule.tag?.name;\n if (tagName && tagName !== '*') {\n let androidClass = [tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${tagName}\")`;\n }\n } else if (!_.isEmpty(cssRule.classNames)) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (!_.isEmpty(cssRule.ids)) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.ids[0])}\")`;\n }\n if (cssRule.attributes) {\n for (const attr of cssRule.attributes) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudoClasses) {\n for (const pseudo of cssRule.pseudoClasses) {\n const sel = this.parsePseudo(pseudo);\n if (sel) {\n uiAutomatorSelector += sel;\n }\n }\n }\n if (cssRule.nestedRule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {import('css-selector-parser').AstSelector} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n if (!_.isEmpty(css.rules)) {\n return this.parseCssRule(css.rules[0]);\n }\n\n throw new Error('No rules could be parsed out of the current selector');\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parseCssSelector(this.selector);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n }\n}\n\nexport default CssConverter;\n"],"mappings":"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"}
1
+ {"version":3,"file":"css-converter.js","sourceRoot":"","sources":["../../lib/css-converter.js"],"names":[],"mappings":"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"}