@appium/universal-xml-plugin 1.0.3 → 1.0.5

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 (70) hide show
  1. package/LICENSE +2 -2
  2. package/build/lib/attr-map.d.ts +58 -0
  3. package/build/lib/attr-map.d.ts.map +1 -0
  4. package/build/lib/attr-map.js +1 -1
  5. package/build/lib/attr-map.js.map +1 -0
  6. package/build/lib/index.d.ts +5 -0
  7. package/build/lib/index.d.ts.map +1 -0
  8. package/build/lib/index.js +26 -0
  9. package/build/lib/index.js.map +1 -0
  10. package/build/lib/logger.d.ts +3 -0
  11. package/build/lib/logger.d.ts.map +1 -0
  12. package/build/lib/logger.js +2 -2
  13. package/build/lib/logger.js.map +1 -0
  14. package/build/lib/node-map.d.ts +200 -0
  15. package/build/lib/node-map.d.ts.map +1 -0
  16. package/build/lib/node-map.js +15 -57
  17. package/build/lib/node-map.js.map +1 -0
  18. package/build/lib/plugin.d.ts +8 -0
  19. package/build/lib/plugin.d.ts.map +1 -0
  20. package/build/lib/plugin.js +16 -8
  21. package/build/lib/plugin.js.map +1 -0
  22. package/build/lib/source.d.ts +24 -0
  23. package/build/lib/source.d.ts.map +1 -0
  24. package/build/lib/source.js +24 -10
  25. package/build/lib/source.js.map +1 -0
  26. package/build/lib/transformers.d.ts +8 -0
  27. package/build/lib/transformers.d.ts.map +1 -0
  28. package/build/lib/transformers.js +1 -1
  29. package/build/lib/transformers.js.map +1 -0
  30. package/build/lib/xpath.d.ts +4 -0
  31. package/build/lib/xpath.d.ts.map +1 -0
  32. package/build/lib/xpath.js +3 -2
  33. package/build/lib/xpath.js.map +1 -0
  34. package/index.js +3 -17
  35. package/lib/attr-map.js +1 -1
  36. package/lib/index.js +19 -0
  37. package/lib/logger.js +1 -1
  38. package/lib/node-map.js +14 -58
  39. package/lib/plugin.js +36 -25
  40. package/lib/source.js +30 -13
  41. package/lib/transformers.js +3 -3
  42. package/lib/xpath.js +7 -6
  43. package/package.json +49 -23
  44. package/tsconfig.json +2 -6
  45. package/build/index.js +0 -25
  46. package/build/test/fixtures/android-transformed-path.xml +0 -39
  47. package/build/test/fixtures/android-transformed.xml +0 -39
  48. package/build/test/fixtures/android.xml +0 -39
  49. package/build/test/fixtures/index.js +0 -25
  50. package/build/test/fixtures/ios-edge.xml +0 -16
  51. package/build/test/fixtures/ios-transformed-edge.xml +0 -16
  52. package/build/test/fixtures/ios-transformed-path.xml +0 -54
  53. package/build/test/fixtures/ios-transformed.xml +0 -54
  54. package/build/test/fixtures/ios.xml +0 -51
  55. package/build/test/unit/plugin-specs.js +0 -59
  56. package/build/test/unit/source-specs.js +0 -82
  57. package/build/test/unit/xpath-specs.js +0 -46
  58. package/build/tsconfig.tsbuildinfo +0 -1
  59. package/test/fixtures/android-transformed-path.xml +0 -39
  60. package/test/fixtures/android-transformed.xml +0 -39
  61. package/test/fixtures/android.xml +0 -39
  62. package/test/fixtures/index.js +0 -14
  63. package/test/fixtures/ios-edge.xml +0 -16
  64. package/test/fixtures/ios-transformed-edge.xml +0 -16
  65. package/test/fixtures/ios-transformed-path.xml +0 -54
  66. package/test/fixtures/ios-transformed.xml +0 -54
  67. package/test/fixtures/ios.xml +0 -51
  68. package/test/unit/plugin-specs.js +0 -57
  69. package/test/unit/source-specs.js +0 -79
  70. package/test/unit/xpath-specs.js +0 -43
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -47,7 +51,11 @@ function transformSourceXml(xmlStr, platform, { metadata = {}, addIndexPath = fa
47
51
  // necessary index attribute, so we add it if it's not there
48
52
  xmlStr = xmlStr.replace('<AppiumAUT>', '<AppiumAUT index="0">');
49
53
  const xmlObj = fast_xml_parser_1.default.parse(xmlStr, PARSE_OPTS);
50
- const unknowns = transformNode(xmlObj, platform, { metadata, addIndexPath, parentPath: '' });
54
+ const unknowns = transformNode(xmlObj, platform, {
55
+ metadata,
56
+ addIndexPath,
57
+ parentPath: '',
58
+ });
51
59
  const jParser = new fast_xml_parser_1.j2xParser(GEN_OPTS);
52
60
  let transformedXml = jParser.parse(xmlObj).trim();
53
61
  transformedXml = `<?xml version="1.0" encoding="UTF-8"?>\n${transformedXml}`;
@@ -55,9 +63,8 @@ function transformSourceXml(xmlStr, platform, { metadata = {}, addIndexPath = fa
55
63
  }
56
64
  exports.transformSourceXml = transformSourceXml;
57
65
  function getUniversalName(nameMap, name, platform) {
58
- var _a;
59
66
  for (const translatedName of Object.keys(nameMap)) {
60
- const sourceNodes = (_a = nameMap[translatedName]) === null || _a === void 0 ? void 0 : _a[platform];
67
+ const sourceNodes = nameMap[translatedName]?.[platform];
61
68
  if (lodash_1.default.isArray(sourceNodes) && sourceNodes.includes(name)) {
62
69
  return translatedName;
63
70
  }
@@ -76,7 +83,6 @@ function getUniversalAttrName(attrName, platform) {
76
83
  }
77
84
  exports.getUniversalAttrName = getUniversalAttrName;
78
85
  function transformNode(nodeObj, platform, { metadata, addIndexPath, parentPath }) {
79
- var _a;
80
86
  const unknownNodes = [];
81
87
  const unknownAttrs = [];
82
88
  if (lodash_1.default.isPlainObject(nodeObj)) {
@@ -91,10 +97,12 @@ function transformNode(nodeObj, platform, { metadata, addIndexPath, parentPath }
91
97
  thisIndexPath = `${parentPath}/${nodeObj[exports.IDX_PREFIX]}`;
92
98
  nodeObj[exports.IDX_PATH_PREFIX] = thisIndexPath;
93
99
  }
94
- (_a = transformers_1.default[platform]) === null || _a === void 0 ? void 0 : _a.call(transformers_1.default, nodeObj, metadata);
100
+ transformers_1.default[platform]?.(nodeObj, metadata);
95
101
  unknownAttrs.push(...transformAttrs(nodeObj, attrs, platform));
96
102
  const unknowns = transformChildNodes(nodeObj, childNodeNames, platform, {
97
- metadata, addIndexPath, parentPath: thisIndexPath
103
+ metadata,
104
+ addIndexPath,
105
+ parentPath: thisIndexPath,
98
106
  });
99
107
  unknownAttrs.push(...unknowns.attrs);
100
108
  unknownNodes.push(...unknowns.nodes);
@@ -102,7 +110,9 @@ function transformNode(nodeObj, platform, { metadata, addIndexPath, parentPath }
102
110
  else if (lodash_1.default.isArray(nodeObj)) {
103
111
  for (const childObj of nodeObj) {
104
112
  const { nodes, attrs } = transformNode(childObj, platform, {
105
- metadata, addIndexPath, parentPath
113
+ metadata,
114
+ addIndexPath,
115
+ parentPath,
106
116
  });
107
117
  unknownNodes.push(...nodes);
108
118
  unknownAttrs.push(...attrs);
@@ -119,7 +129,11 @@ function transformChildNodes(nodeObj, childNodeNames, platform, { metadata, addI
119
129
  const unknownAttrs = [];
120
130
  for (const nodeName of childNodeNames) {
121
131
  // before modifying the name of this child node, recurse down and modify the subtree
122
- const { nodes, attrs } = transformNode(nodeObj[nodeName], platform, { metadata, addIndexPath, parentPath });
132
+ const { nodes, attrs } = transformNode(nodeObj[nodeName], platform, {
133
+ metadata,
134
+ addIndexPath,
135
+ parentPath,
136
+ });
123
137
  unknownNodes.push(...nodes);
124
138
  unknownAttrs.push(...attrs);
125
139
  // now translate the node name and replace the subtree with this node
@@ -167,4 +181,4 @@ function transformAttrs(nodeObj, attrs, platform) {
167
181
  return unknownAttrs;
168
182
  }
169
183
  exports.transformAttrs = transformAttrs;
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NvdXJjZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQXVCO0FBQ3ZCLG1FQUFvRDtBQUNwRCwwREFBa0M7QUFDbEMseUNBQW9EO0FBQ3BELGtFQUF3QztBQUV4QyxNQUFNLFVBQVUsR0FBRztJQUNqQixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLFNBQVMsRUFBRSxJQUFJO0NBQ2hCLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRztJQUNmLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFVyxRQUFBLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxlQUFlLEdBQUcsR0FBRyxtQkFBVyxXQUFXLENBQUM7QUFDNUMsUUFBQSxVQUFVLEdBQUcsR0FBRyxtQkFBVyxPQUFPLENBQUM7QUFFaEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLG1CQUFXLENBQUM7QUFDeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpDLFNBQWdCLGtCQUFrQixDQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBQyxRQUFRLEdBQUcsRUFBRSxFQUFFLFlBQVksR0FBRyxLQUFLLEVBQUMsR0FBRyxFQUFFO0lBQzlGLCtGQUErRjtJQUMvRiw0REFBNEQ7SUFDNUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcseUJBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUs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
184
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../lib/source.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ declare namespace _default {
2
+ export { ios };
3
+ export { android };
4
+ }
5
+ export default _default;
6
+ declare function ios(nodeObj: any): any;
7
+ declare function android(nodeObj: any, metadata: any): void;
8
+ //# sourceMappingURL=transformers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../lib/transformers.js"],"names":[],"mappings":";;;;;AAEA,wCAEC;AAED,4DAoBC"}
@@ -28,4 +28,4 @@ exports.default = {
28
28
  ios,
29
29
  android,
30
30
  };
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3RyYW5zZm9ybWVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUF1QztBQUV2QyxTQUFTLEdBQUcsQ0FBRSxPQUFPLENBQUEsY0FBYztJQUNqQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUUsT0FBTyxFQUFFLFFBQVE7SUFDakMsb0NBQW9DO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLG9CQUFXLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDaEMsT0FBTyxDQUFDLEdBQUcsb0JBQVcsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztLQUN4RjtJQUVELHlDQUF5QztJQUN6QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLG9CQUFXLFFBQVEsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLG9CQUFXLFFBQVEsQ0FBQzthQUNoRCxLQUFLLENBQUMsU0FBUyxDQUFDO2FBQ2hCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLG9CQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsR0FBRyxvQkFBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsb0JBQVcsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLG9CQUFXLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztLQUMxQztBQUNILENBQUM7QUFFRCxrQkFBZTtJQUNiLEdBQUc7SUFDSCxPQUFPO0NBQ1IsQ0FBQyJ9
31
+ //# sourceMappingURL=transformers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../lib/transformers.js"],"names":[],"mappings":";;AAAA,qCAAqC;AAErC,SAAS,GAAG,CAAC,OAAO,CAAC,cAAc;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,QAAQ;IAChC,oCAAoC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,oBAAW,aAAa,CAAC,CAAC;IACnD,IAAI,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE;QAChC,OAAO,CAAC,GAAG,oBAAW,aAAa,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC;KACxF;IAED,yCAAyC;IACzC,IAAI,OAAO,CAAC,GAAG,oBAAW,QAAQ,CAAC,EAAE;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,oBAAW,QAAQ,CAAC;aAChD,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC;QACnC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,oBAAW,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,oBAAW,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,oBAAW,OAAO,CAAC,GAAG,KAAK,CAAC;QACvC,OAAO,CAAC,GAAG,oBAAW,QAAQ,CAAC,GAAG,MAAM,CAAC;KAC1C;AACH,CAAC;AAED,kBAAe;IACb,GAAG;IACH,OAAO;CACR,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function runQuery(query: any, xmlStr: any): import("xpath").SelectedValue[];
2
+ export function transformQuery(query: any, xmlStr: any, multiple: any): string | null;
3
+ export function getNodeAttrVal(node: any, attr: any): any;
4
+ //# sourceMappingURL=xpath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xpath.d.ts","sourceRoot":"","sources":["../../lib/xpath.js"],"names":[],"mappings":"AAGA,mFAIC;AAED,sFA6BC;AAED,0DAMC"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getNodeAttrVal = exports.transformQuery = exports.runQuery = void 0;
4
4
  const xpath_1 = require("xpath");
5
- const xmldom_1 = require("xmldom");
5
+ const xmldom_1 = require("@xmldom/xmldom");
6
6
  function runQuery(query, xmlStr) {
7
7
  const dom = new xmldom_1.DOMParser().parseFromString(xmlStr);
8
8
  const nodes = (0, xpath_1.select)(query, dom);
@@ -18,6 +18,7 @@ function transformQuery(query, xmlStr, multiple) {
18
18
  .substring(1) // remove leading / so we can split
19
19
  .split('/') // split into idnexes
20
20
  .map((indexStr) => {
21
+ // map to xpath node indexes (1-based)
21
22
  const xpathIndex = parseInt(indexStr, 10) + 1;
22
23
  return `*[${xpathIndex}]`;
23
24
  })
@@ -45,4 +46,4 @@ function getNodeAttrVal(node, attr) {
45
46
  return attrObjs[0].value;
46
47
  }
47
48
  exports.getNodeAttrVal = getNodeAttrVal;
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHBhdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIveHBhdGguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQTZDO0FBQzdDLG1DQUFtQztBQUVuQyxTQUFnQixRQUFRLENBQUUsS0FBSyxFQUFFLE1BQU07SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxrQkFBUyxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUEsY0FBVSxFQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCw0QkFJQztBQUVELFNBQWdCLGNBQWMsQ0FBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVE7SUFDckQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV0QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRCwwREFBMEQ7UUFDMUQsSUFBSSxRQUFRLEdBQUcsU0FBUzthQUNyQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO2FBQ2hELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUI7YUFDaEMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsT0FBTyxLQUFLLFVBQVUsR0FBRyxDQUFDO1FBQzVCLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVk7UUFFMUIsaUZBQWlGO1FBQ2pGLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztJQUN2QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDckIsSUFBSSxRQUFRLEVBQUU7WUFDWixXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QzthQUFNO1lBQ0wsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtLQUNGO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQTVCRCx3Q0E0QkM7QUFFRCxTQUFnQixjQUFjLENBQUUsSUFBSSxFQUFFLElBQUk7SUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLElBQUksK0JBQStCLENBQUMsQ0FBQztLQUM3RjtJQUNELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMzQixDQUFDO0FBTkQsd0NBTUMifQ==
49
+ //# sourceMappingURL=xpath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xpath.js","sourceRoot":"","sources":["../../lib/xpath.js"],"names":[],"mappings":";;;AAAA,iCAA2C;AAC3C,2CAAyC;AAEzC,SAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACpC,MAAM,GAAG,GAAG,IAAI,kBAAS,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAA,cAAU,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACf,CAAC;AAJD,4BAIC;AAED,SAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpD,0DAA0D;QAC1D,IAAI,QAAQ,GAAG,SAAS;aACrB,SAAS,CAAC,CAAC,CAAC,CAAC,mCAAmC;aAChD,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB;aAChC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,sCAAsC;YACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,KAAK,UAAU,GAAG,CAAC;QAC5B,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;QAE1B,iFAAiF;QACjF,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,IAAI,QAAQ,EAAE;YACZ,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACtC;aAAM;YACL,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;SAC7B;KACF;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AA7BD,wCA6BC;AAED,SAAgB,cAAc,CAAC,IAAI,EAAE,IAAI;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,+BAA+B,CAAC,CAAC;KAC7F;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAND,wCAMC"}
package/index.js CHANGED
@@ -1,19 +1,5 @@
1
- import UniversalXMLPlugin from './lib/plugin';
2
- export default UniversalXMLPlugin;
3
- export { UniversalXMLPlugin };
1
+ const {main} = require('./build/lib');
4
2
 
5
- if (module === require.main) {
6
- const { transformSourceXml } = require('./lib/source');
7
- const fs = require('fs');
8
- const [,, xmlDataPath, platform, optsJson] = process.argv;
9
- const xmlData = fs.readFileSync(xmlDataPath, 'utf8');
10
- let opts = {};
11
- if (optsJson) {
12
- opts = JSON.parse(optsJson);
13
- }
14
- const {xml, unknowns} = transformSourceXml(xmlData, platform, opts);
15
- console.log(xml); // eslint-disable-line no-console
16
- if (unknowns.nodes.length || unknowns.attrs.length) {
17
- console.error(unknowns); // eslint-disable-line no-console
18
- }
3
+ if (require.main === module) {
4
+ main();
19
5
  }
package/lib/attr-map.js CHANGED
@@ -32,4 +32,4 @@ const REMOVE_ATTRS = [
32
32
  'rotation',
33
33
  ];
34
34
 
35
- export { ATTR_MAP, REMOVE_ATTRS };
35
+ export {ATTR_MAP, REMOVE_ATTRS};
package/lib/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import UniversalXMLPlugin from './plugin';
2
+ export default UniversalXMLPlugin;
3
+ export {UniversalXMLPlugin};
4
+
5
+ export function main() {
6
+ const {transformSourceXml} = require('./source');
7
+ const fs = require('fs');
8
+ const [, , xmlDataPath, platform, optsJson] = process.argv;
9
+ const xmlData = fs.readFileSync(xmlDataPath, 'utf8');
10
+ let opts = {};
11
+ if (optsJson) {
12
+ opts = JSON.parse(optsJson);
13
+ }
14
+ const {xml, unknowns} = transformSourceXml(xmlData, platform, opts);
15
+ console.log(xml); // eslint-disable-line no-console
16
+ if (unknowns.nodes.length || unknowns.attrs.length) {
17
+ console.error(unknowns); // eslint-disable-line no-console
18
+ }
19
+ }
package/lib/logger.js CHANGED
@@ -1,3 +1,3 @@
1
- import { logger } from '@appium/support';
1
+ import {logger} from 'appium/support';
2
2
  const log = logger.getLogger('UniversalXMLPlugin');
3
3
  export default log;
package/lib/node-map.js CHANGED
@@ -64,23 +64,14 @@ export default {
64
64
  'XCUIElementTypeStatusItem',
65
65
  'XCUIElementTypeTimeline',
66
66
  ],
67
- android: [
68
- 'android.widget.Space',
69
- 'android.widget.TwoLineListItem',
70
- ],
67
+ android: ['android.widget.Space', 'android.widget.TwoLineListItem'],
71
68
  },
72
69
  Grid: {
73
70
  ios: 'XCUIElementTypeGrid',
74
- android: [
75
- 'android.widget.GridLayout',
76
- 'android.widget.GridView',
77
- ],
71
+ android: ['android.widget.GridLayout', 'android.widget.GridView'],
78
72
  },
79
73
  Icon: {
80
- ios: [
81
- 'XCUIElementTypeIcon',
82
- 'XCUIElementTypeDockItem',
83
- ],
74
+ ios: ['XCUIElementTypeIcon', 'XCUIElementTypeDockItem'],
84
75
  },
85
76
  Image: {
86
77
  ios: 'XCUIElementTypeImage',
@@ -94,17 +85,11 @@ export default {
94
85
  'XCUIElementTypeRelevanceIndicator',
95
86
  'XCUIElementTypeValueIndicator',
96
87
  ],
97
- android: [
98
- 'android.widget.RatingBar',
99
- 'android.widget.ProgressBar',
100
- ],
88
+ android: ['android.widget.RatingBar', 'android.widget.ProgressBar'],
101
89
  },
102
90
  Input: {
103
- ios: [
104
- 'XCUIElementTypeColorWell',
105
- ],
106
- android: [
107
- ]
91
+ ios: ['XCUIElementTypeColorWell'],
92
+ android: [],
108
93
  },
109
94
  List: {
110
95
  android: [
@@ -112,18 +97,13 @@ export default {
112
97
  'android.widget.ExpandableListView',
113
98
  'android.widget.Gallery',
114
99
  ],
115
- ios: [
116
- 'XCUIElementTypeCollectionView'
117
- ],
100
+ ios: ['XCUIElementTypeCollectionView'],
118
101
  },
119
102
  Map: {
120
103
  ios: 'XCUIElementTypeMap',
121
104
  },
122
105
  Menu: {
123
- ios: [
124
- 'XCUIElementTypeMenu',
125
- 'XCUIElementTypeMenuBar',
126
- ],
106
+ ios: ['XCUIElementTypeMenu', 'XCUIElementTypeMenuBar'],
127
107
  android: ['android.widget.ActionMenuView', 'android.widget.PopupMenu'],
128
108
  },
129
109
  Modal: {
@@ -133,11 +113,7 @@ export default {
133
113
  'android.widget.SlidingDrawer',
134
114
  'android.widget.Magnifier',
135
115
  ],
136
- ios: [
137
- 'XCUIElementTypeDrawer',
138
- 'XCUIElementTypeDialog',
139
- 'XCUIElementTypePopover',
140
- ],
116
+ ios: ['XCUIElementTypeDrawer', 'XCUIElementTypeDialog', 'XCUIElementTypePopover'],
141
117
  },
142
118
  Nav: {
143
119
  ios: 'XCUIElementTypeNavigationBar',
@@ -173,11 +149,7 @@ export default {
173
149
  },
174
150
  SliderInput: {
175
151
  android: 'android.widget.SeekBar',
176
- ios: [
177
- 'XCUIElementTypeSlider',
178
- 'XCUIElementTypeStepper',
179
- 'XCUIElementTypeScrollBar',
180
- ],
152
+ ios: ['XCUIElementTypeSlider', 'XCUIElementTypeStepper', 'XCUIElementTypeScrollBar'],
181
153
  },
182
154
  Spinner: {
183
155
  ios: 'XCUIElementTypeActivityIndicator',
@@ -192,23 +164,11 @@ export default {
192
164
  android: 'android.widget.TableLayout',
193
165
  },
194
166
  Text: {
195
- ios: [
196
- 'XCUIElementTypeStaticText',
197
- 'XCUIElementTypeTextView',
198
- 'XCUIElementTypeHelpTag',
199
- ],
200
- android: [
201
- 'android.widget.TextView',
202
- 'android.widget.Chronometer',
203
- 'android.widget.TextClock',
204
- ],
167
+ ios: ['XCUIElementTypeStaticText', 'XCUIElementTypeTextView', 'XCUIElementTypeHelpTag'],
168
+ android: ['android.widget.TextView', 'android.widget.Chronometer', 'android.widget.TextClock'],
205
169
  },
206
170
  TextInput: {
207
- ios: [
208
- 'XCUIElementTypeTextField',
209
- 'XCUIElementTypeSecureTextField',
210
- 'XCUIElementTypeComboBox',
211
- ],
171
+ ios: ['XCUIElementTypeTextField', 'XCUIElementTypeSecureTextField', 'XCUIElementTypeComboBox'],
212
172
  android: [
213
173
  'android.widget.EditText',
214
174
  'android.widget.AutoCompleteTextView',
@@ -217,11 +177,7 @@ export default {
217
177
  },
218
178
  ToggleInput: {
219
179
  ios: 'XCUIElementTypeToggle',
220
- android: [
221
- 'android.widget.CheckedTextView',
222
- 'android.widget.ToggleButton',
223
- ],
224
-
180
+ android: ['android.widget.CheckedTextView', 'android.widget.ToggleButton'],
225
181
  },
226
182
  Toolbar: {
227
183
  ios: 'XCUIElementTypeToolbar',
package/lib/plugin.js CHANGED
@@ -1,49 +1,59 @@
1
1
  /* eslint-disable no-case-declarations */
2
2
 
3
- import BasePlugin from '@appium/base-plugin';
4
- import { errors } from '@appium/base-driver';
5
- import { transformSourceXml } from './source';
6
- import { transformQuery } from './xpath';
3
+ import BasePlugin from 'appium/plugin';
4
+ import {errors} from 'appium/driver';
5
+ import {transformSourceXml} from './source';
6
+ import {transformQuery} from './xpath';
7
7
  import log from './logger';
8
8
 
9
9
  export default class UniversalXMLPlugin extends BasePlugin {
10
+ commands = [
11
+ 'getPageSource',
12
+ 'findElement',
13
+ 'findElements',
14
+ 'findElementFromElement',
15
+ 'findElementsFromElement',
16
+ ];
10
17
 
11
- commands = ['getPageSource', 'findElement', 'findElements', 'findElementFromElement',
12
- 'findElementsFromElement'];
13
-
14
- async getPageSource (next, driver, sessId, addIndexPath = false) {
18
+ async getPageSource(next, driver, sessId, addIndexPath = false) {
15
19
  const source = next ? await next() : await driver.getPageSource();
16
20
  const metadata = {};
17
21
  const {platformName} = driver.caps;
18
22
  if (platformName.toLowerCase() === 'android') {
19
23
  metadata.appPackage = driver.opts.appPackage;
20
24
  }
21
- const {xml, unknowns} = transformSourceXml(source,
22
- platformName.toLowerCase(), {metadata, addIndexPath});
25
+ const {xml, unknowns} = transformSourceXml(source, platformName.toLowerCase(), {
26
+ metadata,
27
+ addIndexPath,
28
+ });
23
29
  if (unknowns.nodes.length) {
24
- log.warn(`The XML mapper found ${unknowns.nodes.length} node(s) / ` +
25
- `tag name(s) that it didn't know about. These should be ` +
26
- `reported to improve the quality of the plugin: ` +
27
- unknowns.nodes.join(', '));
30
+ log.warn(
31
+ `The XML mapper found ${unknowns.nodes.length} node(s) / ` +
32
+ `tag name(s) that it didn't know about. These should be ` +
33
+ `reported to improve the quality of the plugin: ` +
34
+ unknowns.nodes.join(', ')
35
+ );
28
36
  }
29
37
  if (unknowns.attrs.length) {
30
- log.warn(`The XML mapper found ${unknowns.attrs.length} attributes ` +
31
- `that it didn't know about. These should be reported to ` +
32
- `improve the quality of the plugin: ` +
33
- unknowns.attrs.join(', '));
38
+ log.warn(
39
+ `The XML mapper found ${unknowns.attrs.length} attributes ` +
40
+ `that it didn't know about. These should be reported to ` +
41
+ `improve the quality of the plugin: ` +
42
+ unknowns.attrs.join(', ')
43
+ );
34
44
  }
35
45
  return xml;
36
46
  }
37
47
 
38
- async findElement (...args) {
48
+ async findElement(...args) {
39
49
  return await this._find(false, ...args);
40
50
  }
41
51
 
42
- async findElements (...args) {
52
+ async findElements(...args) {
43
53
  return await this._find(true, ...args);
44
54
  }
45
55
 
46
- async _find (multiple, next, driver, strategy, selector) {
56
+ async _find(multiple, next, driver, strategy, selector) {
47
57
  const {platformName} = driver.caps;
48
58
  if (strategy.toLowerCase() !== 'xpath') {
49
59
  return await next();
@@ -54,8 +64,10 @@ export default class UniversalXMLPlugin extends BasePlugin {
54
64
  // if the selector was not able to be transformed, that means no elements were found that
55
65
  // matched, so do the appropriate thing based on element vs elements
56
66
  if (newSelector === null) {
57
- log.warn(`Selector was not able to be translated to underlying XML. Either the requested ` +
58
- `element does not exist or there was an error in translation`);
67
+ log.warn(
68
+ `Selector was not able to be translated to underlying XML. Either the requested ` +
69
+ `element does not exist or there was an error in translation`
70
+ );
59
71
  if (multiple) {
60
72
  return [];
61
73
  }
@@ -74,7 +86,6 @@ export default class UniversalXMLPlugin extends BasePlugin {
74
86
  const finder = multiple ? 'findElements' : 'findElement';
75
87
  return await driver[finder](strategy, newSelector);
76
88
  }
77
-
78
89
  }
79
90
 
80
- export { UniversalXMLPlugin };
91
+ export {UniversalXMLPlugin};
package/lib/source.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
- import parser, { j2xParser } from 'fast-xml-parser';
2
+ import parser, {j2xParser} from 'fast-xml-parser';
3
3
  import NODE_MAP from './node-map';
4
- import { ATTR_MAP, REMOVE_ATTRS } from './attr-map';
4
+ import {ATTR_MAP, REMOVE_ATTRS} from './attr-map';
5
5
  import TRANSFORMS from './transformers';
6
6
 
7
7
  const PARSE_OPTS = {
@@ -22,19 +22,23 @@ export const IDX_PREFIX = `${ATTR_PREFIX}index`;
22
22
  const isAttr = (k) => k.substring(0, 2) === ATTR_PREFIX;
23
23
  const isNode = (k) => !isAttr(k);
24
24
 
25
- export function transformSourceXml (xmlStr, platform, {metadata = {}, addIndexPath = false} = {}) {
25
+ export function transformSourceXml(xmlStr, platform, {metadata = {}, addIndexPath = false} = {}) {
26
26
  // first thing we want to do is modify the ios source root node, because it doesn't include the
27
27
  // necessary index attribute, so we add it if it's not there
28
28
  xmlStr = xmlStr.replace('<AppiumAUT>', '<AppiumAUT index="0">');
29
29
  const xmlObj = parser.parse(xmlStr, PARSE_OPTS);
30
- const unknowns = transformNode(xmlObj, platform, {metadata, addIndexPath, parentPath: ''});
30
+ const unknowns = transformNode(xmlObj, platform, {
31
+ metadata,
32
+ addIndexPath,
33
+ parentPath: '',
34
+ });
31
35
  const jParser = new j2xParser(GEN_OPTS);
32
36
  let transformedXml = jParser.parse(xmlObj).trim();
33
37
  transformedXml = `<?xml version="1.0" encoding="UTF-8"?>\n${transformedXml}`;
34
38
  return {xml: transformedXml, unknowns};
35
39
  }
36
40
 
37
- function getUniversalName (nameMap, name, platform) {
41
+ function getUniversalName(nameMap, name, platform) {
38
42
  for (const translatedName of Object.keys(nameMap)) {
39
43
  const sourceNodes = nameMap[translatedName]?.[platform];
40
44
  if (_.isArray(sourceNodes) && sourceNodes.includes(name)) {
@@ -47,15 +51,15 @@ function getUniversalName (nameMap, name, platform) {
47
51
  return null;
48
52
  }
49
53
 
50
- export function getUniversalNodeName (nodeName, platform) {
54
+ export function getUniversalNodeName(nodeName, platform) {
51
55
  return getUniversalName(NODE_MAP, nodeName, platform);
52
56
  }
53
57
 
54
- export function getUniversalAttrName (attrName, platform) {
58
+ export function getUniversalAttrName(attrName, platform) {
55
59
  return getUniversalName(ATTR_MAP, attrName, platform);
56
60
  }
57
61
 
58
- export function transformNode (nodeObj, platform, {metadata, addIndexPath, parentPath}) {
62
+ export function transformNode(nodeObj, platform, {metadata, addIndexPath, parentPath}) {
59
63
  const unknownNodes = [];
60
64
  const unknownAttrs = [];
61
65
  if (_.isPlainObject(nodeObj)) {
@@ -76,14 +80,18 @@ export function transformNode (nodeObj, platform, {metadata, addIndexPath, paren
76
80
  TRANSFORMS[platform]?.(nodeObj, metadata);
77
81
  unknownAttrs.push(...transformAttrs(nodeObj, attrs, platform));
78
82
  const unknowns = transformChildNodes(nodeObj, childNodeNames, platform, {
79
- metadata, addIndexPath, parentPath: thisIndexPath
83
+ metadata,
84
+ addIndexPath,
85
+ parentPath: thisIndexPath,
80
86
  });
81
87
  unknownAttrs.push(...unknowns.attrs);
82
88
  unknownNodes.push(...unknowns.nodes);
83
89
  } else if (_.isArray(nodeObj)) {
84
90
  for (const childObj of nodeObj) {
85
91
  const {nodes, attrs} = transformNode(childObj, platform, {
86
- metadata, addIndexPath, parentPath
92
+ metadata,
93
+ addIndexPath,
94
+ parentPath,
87
95
  });
88
96
  unknownNodes.push(...nodes);
89
97
  unknownAttrs.push(...attrs);
@@ -95,12 +103,21 @@ export function transformNode (nodeObj, platform, {metadata, addIndexPath, paren
95
103
  };
96
104
  }
97
105
 
98
- export function transformChildNodes (nodeObj, childNodeNames, platform, {metadata, addIndexPath, parentPath}) {
106
+ export function transformChildNodes(
107
+ nodeObj,
108
+ childNodeNames,
109
+ platform,
110
+ {metadata, addIndexPath, parentPath}
111
+ ) {
99
112
  const unknownNodes = [];
100
113
  const unknownAttrs = [];
101
114
  for (const nodeName of childNodeNames) {
102
115
  // before modifying the name of this child node, recurse down and modify the subtree
103
- const {nodes, attrs} = transformNode(nodeObj[nodeName], platform, {metadata, addIndexPath, parentPath});
116
+ const {nodes, attrs} = transformNode(nodeObj[nodeName], platform, {
117
+ metadata,
118
+ addIndexPath,
119
+ parentPath,
120
+ });
104
121
  unknownNodes.push(...nodes);
105
122
  unknownAttrs.push(...attrs);
106
123
 
@@ -127,7 +144,7 @@ export function transformChildNodes (nodeObj, childNodeNames, platform, {metadat
127
144
  return {nodes: unknownNodes, attrs: unknownAttrs};
128
145
  }
129
146
 
130
- export function transformAttrs (nodeObj, attrs, platform) {
147
+ export function transformAttrs(nodeObj, attrs, platform) {
131
148
  const unknownAttrs = [];
132
149
  for (const attr of attrs) {
133
150
  const cleanAttr = attr.substring(2);
@@ -1,10 +1,10 @@
1
- import { ATTR_PREFIX } from './source';
1
+ import {ATTR_PREFIX} from './source';
2
2
 
3
- function ios (nodeObj/*, metadata*/) {
3
+ function ios(nodeObj /*, metadata*/) {
4
4
  return nodeObj;
5
5
  }
6
6
 
7
- function android (nodeObj, metadata) {
7
+ function android(nodeObj, metadata) {
8
8
  // strip android:id from front of id
9
9
  const resId = nodeObj[`${ATTR_PREFIX}resource-id`];
10
10
  if (resId && metadata.appPackage) {
package/lib/xpath.js CHANGED
@@ -1,13 +1,13 @@
1
- import { select as xpathQuery } from 'xpath';
2
- import { DOMParser } from 'xmldom';
1
+ import {select as xpathQuery} from 'xpath';
2
+ import {DOMParser} from '@xmldom/xmldom';
3
3
 
4
- export function runQuery (query, xmlStr) {
4
+ export function runQuery(query, xmlStr) {
5
5
  const dom = new DOMParser().parseFromString(xmlStr);
6
6
  const nodes = xpathQuery(query, dom);
7
7
  return nodes;
8
8
  }
9
9
 
10
- export function transformQuery (query, xmlStr, multiple) {
10
+ export function transformQuery(query, xmlStr, multiple) {
11
11
  const nodes = runQuery(query, xmlStr);
12
12
 
13
13
  const newQueries = nodes.map((node) => {
@@ -16,7 +16,8 @@ export function transformQuery (query, xmlStr, multiple) {
16
16
  let newQuery = indexPath
17
17
  .substring(1) // remove leading / so we can split
18
18
  .split('/') // split into idnexes
19
- .map((indexStr) => { // map to xpath node indexes (1-based)
19
+ .map((indexStr) => {
20
+ // map to xpath node indexes (1-based)
20
21
  const xpathIndex = parseInt(indexStr, 10) + 1;
21
22
  return `*[${xpathIndex}]`;
22
23
  })
@@ -37,7 +38,7 @@ export function transformQuery (query, xmlStr, multiple) {
37
38
  return newSelector;
38
39
  }
39
40
 
40
- export function getNodeAttrVal (node, attr) {
41
+ export function getNodeAttrVal(node, attr) {
41
42
  const attrObjs = Object.values(node.attributes).filter((obj) => obj.name === attr);
42
43
  if (!attrObjs.length) {
43
44
  throw new Error(`Tried to retrieve a node attribute '${attr}' but the node didn't have it`);