webdriverio 7.20.7 → 7.20.8-alpha.504

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 (229) hide show
  1. package/build/cjs/index.d.ts +3 -0
  2. package/build/cjs/index.d.ts.map +1 -0
  3. package/build/cjs/index.js +13 -0
  4. package/build/cjs/package.json +3 -0
  5. package/build/commands/browser/$$.d.ts +10 -1
  6. package/build/commands/browser/$$.d.ts.map +1 -1
  7. package/build/commands/browser/$$.js +16 -9
  8. package/build/commands/browser/$.js +8 -11
  9. package/build/commands/browser/action.d.ts +132 -0
  10. package/build/commands/browser/action.d.ts.map +1 -0
  11. package/build/commands/browser/action.js +13 -0
  12. package/build/commands/browser/actions.d.ts +29 -0
  13. package/build/commands/browser/actions.d.ts.map +1 -0
  14. package/build/commands/browser/actions.js +30 -0
  15. package/build/commands/browser/addCommand.d.ts +1 -1
  16. package/build/commands/browser/addCommand.js +1 -1
  17. package/build/commands/browser/call.d.ts +7 -5
  18. package/build/commands/browser/call.d.ts.map +1 -1
  19. package/build/commands/browser/call.js +8 -9
  20. package/build/commands/browser/custom$$.js +7 -10
  21. package/build/commands/browser/custom$.d.ts +1 -1
  22. package/build/commands/browser/custom$.js +6 -9
  23. package/build/commands/browser/debug.js +8 -14
  24. package/build/commands/browser/deleteCookies.d.ts +3 -3
  25. package/build/commands/browser/deleteCookies.js +4 -7
  26. package/build/commands/browser/execute.d.ts +2 -2
  27. package/build/commands/browser/execute.js +5 -8
  28. package/build/commands/browser/executeAsync.js +3 -6
  29. package/build/commands/browser/getCookies.d.ts +2 -2
  30. package/build/commands/browser/getCookies.js +3 -6
  31. package/build/commands/browser/getPuppeteer.d.ts +1 -1
  32. package/build/commands/browser/getPuppeteer.d.ts.map +1 -1
  33. package/build/commands/browser/getPuppeteer.js +14 -21
  34. package/build/commands/browser/getWindowSize.js +3 -6
  35. package/build/commands/browser/keys.d.ts +20 -10
  36. package/build/commands/browser/keys.d.ts.map +1 -1
  37. package/build/commands/browser/keys.js +29 -24
  38. package/build/commands/browser/mock.d.ts +5 -4
  39. package/build/commands/browser/mock.d.ts.map +1 -1
  40. package/build/commands/browser/mock.js +16 -22
  41. package/build/commands/browser/mockClearAll.js +5 -11
  42. package/build/commands/browser/mockRestoreAll.js +5 -11
  43. package/build/commands/browser/newWindow.js +5 -11
  44. package/build/commands/browser/pause.js +1 -4
  45. package/build/commands/browser/react$$.d.ts.map +1 -1
  46. package/build/commands/browser/react$$.js +16 -17
  47. package/build/commands/browser/react$.d.ts.map +1 -1
  48. package/build/commands/browser/react$.js +13 -14
  49. package/build/commands/browser/reloadSession.js +5 -12
  50. package/build/commands/browser/savePDF.d.ts +14 -14
  51. package/build/commands/browser/savePDF.js +21 -27
  52. package/build/commands/browser/saveRecordingScreen.js +6 -12
  53. package/build/commands/browser/saveScreenshot.js +6 -12
  54. package/build/commands/browser/scroll.d.ts +25 -0
  55. package/build/commands/browser/scroll.d.ts.map +1 -0
  56. package/build/commands/browser/scroll.js +41 -0
  57. package/build/commands/browser/setCookies.d.ts +1 -1
  58. package/build/commands/browser/setCookies.d.ts.map +1 -1
  59. package/build/commands/browser/setCookies.js +5 -7
  60. package/build/commands/browser/setTimeout.js +1 -4
  61. package/build/commands/browser/setWindowSize.js +3 -6
  62. package/build/commands/browser/switchWindow.js +1 -4
  63. package/build/commands/browser/throttle.js +3 -6
  64. package/build/commands/browser/touchAction.d.ts +1 -1
  65. package/build/commands/browser/touchAction.d.ts.map +1 -1
  66. package/build/commands/browser/touchAction.js +3 -6
  67. package/build/commands/browser/uploadFile.d.ts +1 -1
  68. package/build/commands/browser/uploadFile.d.ts.map +1 -1
  69. package/build/commands/browser/uploadFile.js +10 -15
  70. package/build/commands/browser/url.js +3 -6
  71. package/build/commands/browser/waitUntil.d.ts +1 -2
  72. package/build/commands/browser/waitUntil.d.ts.map +1 -1
  73. package/build/commands/browser/waitUntil.js +4 -11
  74. package/build/commands/browser.d.ts +37 -69
  75. package/build/commands/browser.d.ts.map +1 -1
  76. package/build/commands/browser.js +37 -44
  77. package/build/commands/constant.d.ts +1 -1
  78. package/build/commands/constant.d.ts.map +1 -1
  79. package/build/commands/constant.js +6 -12
  80. package/build/commands/element/$$.d.ts +1 -1
  81. package/build/commands/element/$$.d.ts.map +1 -1
  82. package/build/commands/element/$$.js +2 -7
  83. package/build/commands/element/$.d.ts +1 -1
  84. package/build/commands/element/$.d.ts.map +1 -1
  85. package/build/commands/element/$.js +2 -7
  86. package/build/commands/element/addValue.d.ts +10 -14
  87. package/build/commands/element/addValue.d.ts.map +1 -1
  88. package/build/commands/element/addValue.js +23 -27
  89. package/build/commands/element/clearValue.d.ts +1 -1
  90. package/build/commands/element/clearValue.js +2 -5
  91. package/build/commands/element/click.d.ts +1 -1
  92. package/build/commands/element/click.d.ts.map +1 -1
  93. package/build/commands/element/click.js +19 -34
  94. package/build/commands/element/custom$$.js +9 -11
  95. package/build/commands/element/custom$.js +8 -10
  96. package/build/commands/element/doubleClick.d.ts.map +1 -1
  97. package/build/commands/element/doubleClick.js +11 -17
  98. package/build/commands/element/dragAndDrop.d.ts.map +1 -1
  99. package/build/commands/element/dragAndDrop.js +13 -19
  100. package/build/commands/element/getAttribute.js +1 -4
  101. package/build/commands/element/getCSSProperty.d.ts +1 -1
  102. package/build/commands/element/getCSSProperty.d.ts.map +1 -1
  103. package/build/commands/element/getCSSProperty.js +7 -13
  104. package/build/commands/element/getComputedLabel.js +1 -4
  105. package/build/commands/element/getComputedRole.js +1 -4
  106. package/build/commands/element/getHTML.js +7 -13
  107. package/build/commands/element/getLocation.js +3 -5
  108. package/build/commands/element/getProperty.d.ts +5 -5
  109. package/build/commands/element/getProperty.d.ts.map +1 -1
  110. package/build/commands/element/getProperty.js +5 -11
  111. package/build/commands/element/getSize.js +3 -5
  112. package/build/commands/element/getTagName.js +1 -4
  113. package/build/commands/element/getText.js +1 -4
  114. package/build/commands/element/getValue.js +1 -4
  115. package/build/commands/element/isClickable.d.ts.map +1 -1
  116. package/build/commands/element/isClickable.js +10 -13
  117. package/build/commands/element/isDisplayed.js +9 -16
  118. package/build/commands/element/isDisplayedInViewport.js +7 -13
  119. package/build/commands/element/isEnabled.js +1 -4
  120. package/build/commands/element/isEqual.d.ts.map +1 -1
  121. package/build/commands/element/isEqual.js +9 -9
  122. package/build/commands/element/isExisting.js +1 -4
  123. package/build/commands/element/isFocused.js +7 -13
  124. package/build/commands/element/isSelected.js +1 -4
  125. package/build/commands/element/moveTo.d.ts.map +1 -1
  126. package/build/commands/element/moveTo.js +8 -13
  127. package/build/commands/element/nextElement.js +2 -5
  128. package/build/commands/element/parentElement.js +2 -5
  129. package/build/commands/element/previousElement.js +2 -5
  130. package/build/commands/element/react$$.d.ts.map +1 -1
  131. package/build/commands/element/react$$.js +16 -16
  132. package/build/commands/element/react$.d.ts.map +1 -1
  133. package/build/commands/element/react$.js +15 -14
  134. package/build/commands/element/saveScreenshot.js +6 -12
  135. package/build/commands/element/scrollIntoView.d.ts +4 -2
  136. package/build/commands/element/scrollIntoView.d.ts.map +1 -1
  137. package/build/commands/element/scrollIntoView.js +33 -12
  138. package/build/commands/element/selectByAttribute.js +3 -6
  139. package/build/commands/element/selectByIndex.js +3 -6
  140. package/build/commands/element/selectByVisibleText.js +3 -6
  141. package/build/commands/element/setValue.d.ts +13 -14
  142. package/build/commands/element/setValue.d.ts.map +1 -1
  143. package/build/commands/element/setValue.js +14 -17
  144. package/build/commands/element/shadow$$.d.ts +1 -1
  145. package/build/commands/element/shadow$$.d.ts.map +1 -1
  146. package/build/commands/element/shadow$$.js +3 -6
  147. package/build/commands/element/shadow$.js +3 -6
  148. package/build/commands/element/touchAction.js +3 -6
  149. package/build/commands/element/waitForClickable.js +1 -4
  150. package/build/commands/element/waitForDisplayed.js +1 -4
  151. package/build/commands/element/waitForEnabled.js +1 -4
  152. package/build/commands/element/waitForExist.js +1 -4
  153. package/build/commands/element/waitUntil.d.ts +2 -3
  154. package/build/commands/element/waitUntil.d.ts.map +1 -1
  155. package/build/commands/element/waitUntil.js +3 -9
  156. package/build/commands/element.d.ts +49 -99
  157. package/build/commands/element.d.ts.map +1 -1
  158. package/build/commands/element.js +49 -63
  159. package/build/constants.d.ts +67 -0
  160. package/build/constants.d.ts.map +1 -1
  161. package/build/constants.js +105 -12
  162. package/build/index.d.ts +65 -6
  163. package/build/index.d.ts.map +1 -1
  164. package/build/index.js +48 -86
  165. package/build/middlewares.d.ts +1 -1
  166. package/build/middlewares.js +11 -19
  167. package/build/multiremote.js +18 -24
  168. package/build/protocol-stub.d.ts.map +1 -1
  169. package/build/protocol-stub.js +4 -6
  170. package/build/scripts/getHTML.js +1 -4
  171. package/build/scripts/getProperty.d.ts +5 -5
  172. package/build/scripts/getProperty.d.ts.map +1 -1
  173. package/build/scripts/getProperty.js +1 -4
  174. package/build/scripts/isElementClickable.js +1 -4
  175. package/build/scripts/isElementDisplayed.js +2 -5
  176. package/build/scripts/isElementInViewport.js +1 -4
  177. package/build/scripts/isFocused.js +1 -4
  178. package/build/scripts/newWindow.js +1 -4
  179. package/build/scripts/resq.js +3 -9
  180. package/build/scripts/shadowFnFactory.js +2 -6
  181. package/build/types.d.ts +5 -9
  182. package/build/types.d.ts.map +1 -1
  183. package/build/types.js +1 -2
  184. package/build/utils/SevereServiceError.js +1 -4
  185. package/build/utils/Timer.d.ts.map +1 -1
  186. package/build/utils/Timer.js +13 -29
  187. package/build/utils/actions/base.d.ts +32 -0
  188. package/build/utils/actions/base.d.ts.map +1 -0
  189. package/build/utils/actions/base.js +66 -0
  190. package/build/utils/actions/index.d.ts +6 -0
  191. package/build/utils/actions/index.d.ts.map +1 -0
  192. package/build/utils/actions/index.js +5 -0
  193. package/build/utils/actions/key.d.ts +15 -0
  194. package/build/utils/actions/key.d.ts.map +1 -0
  195. package/build/utils/actions/key.js +22 -0
  196. package/build/utils/actions/pointer.d.ts +62 -0
  197. package/build/utils/actions/pointer.d.ts.map +1 -0
  198. package/build/utils/actions/pointer.js +76 -0
  199. package/build/utils/actions/wheel.d.ts +36 -0
  200. package/build/utils/actions/wheel.d.ts.map +1 -0
  201. package/build/utils/actions/wheel.js +20 -0
  202. package/build/utils/detectBackend.d.ts +1 -1
  203. package/build/utils/detectBackend.d.ts.map +1 -1
  204. package/build/utils/detectBackend.js +3 -7
  205. package/build/utils/findStrategy.d.ts.map +1 -1
  206. package/build/utils/findStrategy.js +50 -19
  207. package/build/utils/getElementObject.d.ts +1 -1
  208. package/build/utils/getElementObject.d.ts.map +1 -1
  209. package/build/utils/getElementObject.js +51 -32
  210. package/build/utils/implicitWait.js +3 -9
  211. package/build/utils/index.d.ts +8 -7
  212. package/build/utils/index.d.ts.map +1 -1
  213. package/build/utils/index.js +125 -148
  214. package/build/utils/interception/devtools.d.ts +1 -1
  215. package/build/utils/interception/devtools.d.ts.map +1 -1
  216. package/build/utils/interception/devtools.js +17 -36
  217. package/build/utils/interception/index.d.ts +2 -2
  218. package/build/utils/interception/index.d.ts.map +1 -1
  219. package/build/utils/interception/index.js +10 -13
  220. package/build/utils/interception/types.d.ts +1 -1
  221. package/build/utils/interception/types.d.ts.map +1 -1
  222. package/build/utils/interception/types.js +1 -2
  223. package/build/utils/interception/webdriver.d.ts +1 -1
  224. package/build/utils/interception/webdriver.d.ts.map +1 -1
  225. package/build/utils/interception/webdriver.js +6 -11
  226. package/build/utils/refetchElement.js +3 -9
  227. package/package.json +27 -17
  228. package/async.d.ts +0 -24
  229. package/sync.d.ts +0 -24
@@ -0,0 +1,32 @@
1
+ export declare type ActionType = 'key' | 'pointer' | 'wheel';
2
+ export declare type KeyActionType = 'mouse' | 'pen' | 'touch';
3
+ export interface ActionParameters {
4
+ pointerType?: KeyActionType;
5
+ }
6
+ export interface BaseActionParams {
7
+ id?: string;
8
+ parameters?: ActionParameters;
9
+ }
10
+ export default class BaseAction {
11
+ #private;
12
+ protected instance: WebdriverIO.Browser;
13
+ protected sequence: any[];
14
+ constructor(instance: WebdriverIO.Browser, type: ActionType, params?: BaseActionParams);
15
+ toJSON(): {
16
+ id: string;
17
+ type: ActionType;
18
+ parameters: ActionParameters;
19
+ actions: any[];
20
+ };
21
+ /**
22
+ * Inserts a pause action for the specified device, ensuring it idles for a tick.
23
+ * @param duration idle time of tick
24
+ */
25
+ pause(duration: number): this;
26
+ /**
27
+ * Perform action sequence
28
+ * @param skipRelease set to true if `releaseActions` command should not be invoked
29
+ */
30
+ perform(skipRelease?: boolean): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/base.ts"],"names":[],"mappings":"AAEA,oBAAY,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;AACpD,oBAAY,aAAa,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;AACrD,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,aAAa,CAAA;CAC9B;AACD,MAAM,WAAW,gBAAgB;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAChC;AAID,MAAM,CAAC,OAAO,OAAO,UAAU;;IAQvB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO;IAH3C,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAK;gBAGhB,QAAQ,EAAE,WAAW,CAAC,OAAO,EACvC,IAAI,EAAE,UAAU,EAChB,MAAM,CAAC,EAAE,gBAAgB;IAQ7B,MAAM;;;;;;IASN;;;OAGG;IACH,KAAK,CAAE,QAAQ,EAAE,MAAM;IAKvB;;;OAGG;IACG,OAAO,CAAE,WAAW,UAAQ;CAiCrC"}
@@ -0,0 +1,66 @@
1
+ import { ELEMENT_KEY } from '../../constants.js';
2
+ let actionIds = 0;
3
+ export default class BaseAction {
4
+ instance;
5
+ #id;
6
+ #type;
7
+ #parameters;
8
+ #instance;
9
+ sequence = [];
10
+ constructor(instance, type, params) {
11
+ this.instance = instance;
12
+ this.#instance = instance;
13
+ this.#id = params?.id || `action${++actionIds}`;
14
+ this.#type = type;
15
+ this.#parameters = params?.parameters || {};
16
+ }
17
+ toJSON() {
18
+ return {
19
+ id: this.#id,
20
+ type: this.#type,
21
+ parameters: this.#parameters,
22
+ actions: this.sequence
23
+ };
24
+ }
25
+ /**
26
+ * Inserts a pause action for the specified device, ensuring it idles for a tick.
27
+ * @param duration idle time of tick
28
+ */
29
+ pause(duration) {
30
+ this.sequence.push({ type: 'pause', duration });
31
+ return this;
32
+ }
33
+ /**
34
+ * Perform action sequence
35
+ * @param skipRelease set to true if `releaseActions` command should not be invoked
36
+ */
37
+ async perform(skipRelease = false) {
38
+ /**
39
+ * transform chainable / not resolved elements into WDIO elements
40
+ */
41
+ for (const seq of this.sequence) {
42
+ /**
43
+ * continue if we don't deal with origin or elements within
44
+ * origin at all
45
+ */
46
+ if (!seq.origin || typeof seq.origin === 'string') {
47
+ continue;
48
+ }
49
+ /**
50
+ * resolve promise element
51
+ */
52
+ if (typeof seq.origin.then === 'function') {
53
+ await seq.origin.waitForExist();
54
+ seq.origin = await seq.origin;
55
+ }
56
+ if (!seq.origin[ELEMENT_KEY]) {
57
+ throw new Error(`Couldn't find element for "${seq.type}" action sequence`);
58
+ }
59
+ seq.origin = { [ELEMENT_KEY]: seq.origin[ELEMENT_KEY] };
60
+ }
61
+ await this.#instance.performActions([this.toJSON()]);
62
+ if (!skipRelease) {
63
+ await this.#instance.releaseActions();
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,6 @@
1
+ export { default as KeyAction } from './key.js';
2
+ export { default as PointerAction } from './pointer.js';
3
+ export { default as WheelAction } from './wheel.js';
4
+ export * from './base.js';
5
+ export * from './pointer.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,YAAY,CAAA;AACnD,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { default as KeyAction } from './key.js';
2
+ export { default as PointerAction } from './pointer.js';
3
+ export { default as WheelAction } from './wheel.js';
4
+ export * from './base.js';
5
+ export * from './pointer.js';
@@ -0,0 +1,15 @@
1
+ import BaseAction, { BaseActionParams } from './base.js';
2
+ export default class KeyAction extends BaseAction {
3
+ constructor(instance: WebdriverIO.Browser, params?: BaseActionParams);
4
+ /**
5
+ * Generates a key up action.
6
+ * @param value key value
7
+ */
8
+ up(value: string): this;
9
+ /**
10
+ * Generates a key down action.
11
+ * @param value key value
12
+ */
13
+ down(value: string): this;
14
+ }
15
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/key.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAExD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,UAAU;gBAChC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAIrE;;;OAGG;IACH,EAAE,CAAE,KAAK,EAAE,MAAM;IAKjB;;;OAGG;IACH,IAAI,CAAE,KAAK,EAAE,MAAM;CAItB"}
@@ -0,0 +1,22 @@
1
+ import BaseAction from './base.js';
2
+ export default class KeyAction extends BaseAction {
3
+ constructor(instance, params) {
4
+ super(instance, 'key', params);
5
+ }
6
+ /**
7
+ * Generates a key up action.
8
+ * @param value key value
9
+ */
10
+ up(value) {
11
+ this.sequence.push({ type: 'keyUp', value });
12
+ return this;
13
+ }
14
+ /**
15
+ * Generates a key down action.
16
+ * @param value key value
17
+ */
18
+ down(value) {
19
+ this.sequence.push({ type: 'keyDown', value });
20
+ return this;
21
+ }
22
+ }
@@ -0,0 +1,62 @@
1
+ import { ElementReference } from '@wdio/protocols';
2
+ import BaseAction, { BaseActionParams } from './base.js';
3
+ import type { ChainablePromiseElement } from '../../types';
4
+ export declare type ButtonNames = 'left' | 'middle' | 'right';
5
+ export declare type Button = 0 | 1 | 2;
6
+ export declare type Origin = 'pointer' | 'viewport';
7
+ interface PointerActionUpParams {
8
+ /**
9
+ * The button to press (e.g. 0 for left, 1 for middle or 2 for right)
10
+ * @default 0
11
+ */
12
+ button: Button;
13
+ }
14
+ declare const PARAM_DEFAULTS: {
15
+ width: number;
16
+ height: number;
17
+ pressure: number;
18
+ tangentialPressure: number;
19
+ tiltX: number;
20
+ tiltY: number;
21
+ twist: number;
22
+ altitudeAngle: number;
23
+ azimuthAngle: number;
24
+ button: Button;
25
+ };
26
+ declare const MOVE_PARAM_DEFAULTS: {
27
+ x: number;
28
+ y: number;
29
+ duration: number;
30
+ origin: ElementReference | ChainablePromiseElement<WebdriverIO.Element> | Origin;
31
+ };
32
+ declare type PointerActionParams = Partial<typeof PARAM_DEFAULTS> & Partial<PointerActionUpParams>;
33
+ declare type PointerActionMoveParams = Partial<typeof MOVE_PARAM_DEFAULTS> & PointerActionParams;
34
+ export default class PointerAction extends BaseAction {
35
+ constructor(instance: WebdriverIO.Browser, params?: BaseActionParams);
36
+ /**
37
+ * Creates an action for moving the pointer `x` and `y` pixels from the specified
38
+ * `origin`. The `origin` may be defined as the pointers current position (e.g. "pointer"),
39
+ * the viewport (e.g. "viewport") or the center of a specific element.
40
+ * @param params PointerActionMoveParams
41
+ */
42
+ move(params: PointerActionMoveParams): PointerAction;
43
+ move(x: number, y: number): PointerAction;
44
+ /**
45
+ * Creates an action to release a single key.
46
+ * @param params PointerActionUpParams
47
+ */
48
+ up(button?: ButtonNames): PointerAction;
49
+ up(params?: PointerActionUpParams): PointerAction;
50
+ /**
51
+ * Creates an action to press a single key
52
+ * @param params PointerActionParams
53
+ */
54
+ down(button?: ButtonNames): PointerAction;
55
+ down(params?: PointerActionParams): PointerAction;
56
+ /**
57
+ * An action that cancels this pointer's current input.
58
+ */
59
+ cancel(): this;
60
+ }
61
+ export {};
62
+ //# sourceMappingURL=pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/pointer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAiB,MAAM,WAAW,CAAA;AACvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D,oBAAY,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AACrD,oBAAY,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC9B,oBAAY,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAM3C,UAAU,qBAAqB;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;CACjB;AAKD,QAAA,MAAM,cAAc;;;;;;;;;;;CAWnB,CAAA;AACD,QAAA,MAAM,mBAAmB;;;;;CAKxB,CAAA;AAED,aAAK,mBAAmB,GAAG,OAAO,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC1F,aAAK,uBAAuB,GAAG,OAAO,CAAC,OAAO,mBAAmB,CAAC,GAAG,mBAAmB,CAAA;AAExF,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;gBACpC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAE,gBAAqB;IAQzE;;;;;OAKG;IACH,IAAI,CAAE,MAAM,EAAE,uBAAuB,GAAG,aAAa;IACrD,IAAI,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa;IAoB1C;;;OAGG;IACH,EAAE,CAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa;IACxC,EAAE,CAAE,MAAM,CAAC,EAAE,qBAAqB,GAAG,aAAa;IAWlD;;;OAGG;IACH,IAAI,CAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa;IAC1C,IAAI,CAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,aAAa;IAalD;;OAEG;IACH,MAAM;CAIT"}
@@ -0,0 +1,76 @@
1
+ import BaseAction from './base.js';
2
+ const ORIGIN_DEFAULT = 'viewport';
3
+ const BUTTON_DEFAULT = 0;
4
+ const POINTER_TYPE_DEFAULT = 'mouse';
5
+ const UP_PARAM_DEFAULTS = {
6
+ button: BUTTON_DEFAULT
7
+ };
8
+ const PARAM_DEFAULTS = {
9
+ ...UP_PARAM_DEFAULTS,
10
+ width: 0,
11
+ height: 0,
12
+ pressure: 0,
13
+ tangentialPressure: 0,
14
+ tiltX: 0,
15
+ tiltY: 0,
16
+ twist: 0,
17
+ altitudeAngle: 0,
18
+ azimuthAngle: 0
19
+ };
20
+ const MOVE_PARAM_DEFAULTS = {
21
+ x: 0,
22
+ y: 0,
23
+ duration: 100,
24
+ origin: ORIGIN_DEFAULT
25
+ };
26
+ export default class PointerAction extends BaseAction {
27
+ constructor(instance, params = {}) {
28
+ if (!params.parameters) {
29
+ params.parameters = { pointerType: POINTER_TYPE_DEFAULT };
30
+ }
31
+ super(instance, 'pointer', params);
32
+ }
33
+ move(params = {}, y) {
34
+ const seq = {
35
+ type: 'pointerMove',
36
+ // default params
37
+ ...PARAM_DEFAULTS,
38
+ ...UP_PARAM_DEFAULTS,
39
+ ...MOVE_PARAM_DEFAULTS,
40
+ };
41
+ if (typeof params === 'number') {
42
+ Object.assign(seq, { x: params, y });
43
+ }
44
+ else if (params) {
45
+ Object.assign(seq, params);
46
+ }
47
+ this.sequence.push(seq);
48
+ return this;
49
+ }
50
+ up(params = UP_PARAM_DEFAULTS) {
51
+ this.sequence.push({
52
+ type: 'pointerUp',
53
+ button: typeof params === 'string'
54
+ ? params === 'right' ? 2 : (params === 'middle' ? 1 : 0)
55
+ : params.button
56
+ });
57
+ return this;
58
+ }
59
+ down(params = {}) {
60
+ this.sequence.push({
61
+ type: 'pointerDown',
62
+ ...PARAM_DEFAULTS,
63
+ ...(typeof params === 'string'
64
+ ? { button: params === 'right' ? 2 : (params === 'middle' ? 1 : 0) }
65
+ : params)
66
+ });
67
+ return this;
68
+ }
69
+ /**
70
+ * An action that cancels this pointer's current input.
71
+ */
72
+ cancel() {
73
+ this.sequence.push({ type: 'pointerCancel' });
74
+ return this;
75
+ }
76
+ }
@@ -0,0 +1,36 @@
1
+ import BaseAction, { BaseActionParams } from './base.js';
2
+ import type { ChainablePromiseElement } from '../../types';
3
+ export interface ScrollParams {
4
+ /**
5
+ * starting x coordinate
6
+ */
7
+ x: number;
8
+ /**
9
+ * starting y coordinate
10
+ */
11
+ y: number;
12
+ /**
13
+ * Delta X to scroll to target
14
+ */
15
+ deltaX: number;
16
+ /**
17
+ * Delta Y to scroll to target
18
+ */
19
+ deltaY: number;
20
+ /**
21
+ * element origin
22
+ */
23
+ origin?: WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element>;
24
+ /**
25
+ * duration ratio be the ratio of time delta and duration
26
+ */
27
+ duration: number;
28
+ }
29
+ export default class WheelAction extends BaseAction {
30
+ constructor(instance: WebdriverIO.Browser, params?: BaseActionParams);
31
+ /**
32
+ * Scrolls a page to given coordinates or origin.
33
+ */
34
+ scroll(params?: Partial<ScrollParams>): this;
35
+ }
36
+ //# sourceMappingURL=wheel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/wheel.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D,MAAM,WAAW,YAAY;IACzB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;IACT;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAC3E;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACnB;AAUD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,UAAU;gBACnC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAIpE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;CAIxC"}
@@ -0,0 +1,20 @@
1
+ import BaseAction from './base.js';
2
+ const DEFAULT_SCROLL_PARAMS = {
3
+ x: 0,
4
+ y: 0,
5
+ deltaX: 0,
6
+ deltaY: 0,
7
+ duration: 0
8
+ };
9
+ export default class WheelAction extends BaseAction {
10
+ constructor(instance, params) {
11
+ super(instance, 'wheel', params);
12
+ }
13
+ /**
14
+ * Scrolls a page to given coordinates or origin.
15
+ */
16
+ scroll(params) {
17
+ this.sequence.push({ type: 'scroll', ...DEFAULT_SCROLL_PARAMS, ...params });
18
+ return this;
19
+ }
20
+ }
@@ -1,4 +1,4 @@
1
- import { Capabilities, Options } from '@wdio/types';
1
+ import type { Capabilities, Options } from '@wdio/types';
2
2
  interface BackendConfigurations {
3
3
  port?: number;
4
4
  hostname?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"detectBackend.d.ts","sourceRoot":"","sources":["../../src/utils/detectBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAiBnD,UAAU,qBAAqB;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,gBAAgB,CAAA;CACjF;AAgBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,GAAE,qBAA0B;;;;;EAoGxE"}
1
+ {"version":3,"file":"detectBackend.d.ts","sourceRoot":"","sources":["../../src/utils/detectBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAiBxD,UAAU,qBAAqB;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,gBAAgB,CAAA;CACjF;AAgBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,GAAE,qBAA0B;;;;;EAoGxE"}
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
1
  const DEFAULT_HOSTNAME = '127.0.0.1';
4
2
  const DEFAULT_PORT = 4444;
5
3
  const DEFAULT_PROTOCOL = 'http';
@@ -26,8 +24,7 @@ function getSauceEndpoint(region, { isRDC, isVisual } = {}) {
26
24
  /**
27
25
  * helper to detect the Selenium backend according to given capabilities
28
26
  */
29
- function detectBackend(options = {}) {
30
- var _a;
27
+ export default function detectBackend(options = {}) {
31
28
  let { port, hostname, user, key, protocol, region, headless, path, capabilities } = options;
32
29
  /**
33
30
  * browserstack
@@ -60,8 +57,8 @@ function detectBackend(options = {}) {
60
57
  * For Sauce Labs Legacy RDC we only need to determine if the sauce option has a `testobject_api_key`.
61
58
  * Same for Sauce Visual where an apiKey can be passed in through the capabilities (soon to be legacy too).
62
59
  */
63
- const isRDC = Boolean(!Array.isArray(capabilities) && (capabilities === null || capabilities === void 0 ? void 0 : capabilities.testobject_api_key));
64
- const isVisual = Boolean(!Array.isArray(capabilities) && capabilities && ((_a = capabilities['sauce:visual']) === null || _a === void 0 ? void 0 : _a.apiKey));
60
+ const isRDC = Boolean(!Array.isArray(capabilities) && capabilities?.testobject_api_key);
61
+ const isVisual = Boolean(!Array.isArray(capabilities) && capabilities && capabilities['sauce:visual']?.apiKey);
65
62
  if ((typeof user === 'string' && typeof key === 'string' && key.length === 36) ||
66
63
  // Or only RDC or visual
67
64
  (isRDC || isVisual)) {
@@ -116,4 +113,3 @@ function detectBackend(options = {}) {
116
113
  */
117
114
  return { hostname, port, protocol, path };
118
115
  }
119
- exports.default = detectBackend;
@@ -1 +1 @@
1
- {"version":3,"file":"findStrategy.d.ts","sourceRoot":"","sources":["../../src/utils/findStrategy.ts"],"names":[],"mappings":"AA4BA,aAAK,gBAAgB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAuF/D,eAAO,MAAM,YAAY,aAAuB,gBAAgB,UAAU,OAAO,aAAa,OAAO;;;CAoIpG,CAAA"}
1
+ {"version":3,"file":"findStrategy.d.ts","sourceRoot":"","sources":["../../src/utils/findStrategy.ts"],"names":[],"mappings":"AA4BA,aAAK,gBAAgB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AA2F/D,eAAO,MAAM,YAAY,aAAuB,gBAAgB,UAAU,OAAO,aAAa,OAAO;;;CAuKpG,CAAA"}
@@ -1,13 +1,7 @@
1
- "use strict";
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
- exports.findStrategy = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const lodash_isplainobject_1 = __importDefault(require("lodash.isplainobject"));
9
- const aria_query_1 = require("aria-query");
10
- const constants_1 = require("../constants");
1
+ import fs from 'node:fs';
2
+ import isPlainObject from 'lodash.isplainobject';
3
+ import { roleElements } from 'aria-query';
4
+ import { DEEP_SELECTOR, ARIA_SELECTOR } from '../constants.js';
11
5
  const DEFAULT_STRATEGY = 'css selector';
12
6
  const DIRECT_SELECTOR_REGEXP = /^(id|css selector|xpath|link text|partial link text|name|tag name|class name|-android uiautomator|-android datamatcher|-android viewmatcher|-android viewtag|-ios uiautomation|-ios predicate string|-ios class chain|accessibility id):(.+)/;
13
7
  const XPATH_SELECTORS_START = [
@@ -34,7 +28,7 @@ const defineStrategy = function (selector) {
34
28
  // in case of "selector" argument is a plain object then .match() will cause
35
29
  // an error like "selector.match is not a function"
36
30
  // Use '-android datamatcher' or '-android viewmatcher' strategy if selector is a plain object (Android only)
37
- if ((0, lodash_isplainobject_1.default)(selector)) {
31
+ if (isPlainObject(selector)) {
38
32
  if (JSON.stringify(selector).indexOf('test.espresso.matcher.ViewMatchers') < 0)
39
33
  return '-android datamatcher';
40
34
  return '-android viewmatcher';
@@ -68,9 +62,13 @@ const defineStrategy = function (selector) {
68
62
  return 'id';
69
63
  }
70
64
  // use shadow dom selector
71
- if (stringSelector.startsWith(constants_1.DEEP_SELECTOR)) {
65
+ if (stringSelector.startsWith(DEEP_SELECTOR)) {
72
66
  return 'shadow';
73
67
  }
68
+ // use aria selector
69
+ if (stringSelector.startsWith(ARIA_SELECTOR)) {
70
+ return 'aria';
71
+ }
74
72
  // Recursive element search using the UiAutomator library (Android only)
75
73
  if (stringSelector.startsWith('android=')) {
76
74
  return '-android uiautomator';
@@ -113,7 +111,7 @@ const defineStrategy = function (selector) {
113
111
  return 'role';
114
112
  }
115
113
  };
116
- const findStrategy = function (selector, isW3C, isMobile) {
114
+ export const findStrategy = function (selector, isW3C, isMobile) {
117
115
  const stringSelector = selector;
118
116
  let using = DEFAULT_STRATEGY;
119
117
  let value = selector;
@@ -121,7 +119,7 @@ const findStrategy = function (selector, isW3C, isMobile) {
121
119
  // user has specified locator strategy directly
122
120
  case 'directly': {
123
121
  const match = stringSelector.match(DIRECT_SELECTOR_REGEXP);
124
- if (!match || !isMobile && isW3C && !constants_1.W3C_SELECTOR_STRATEGIES.includes(match[1])) {
122
+ if (!match) {
125
123
  throw new Error('InvalidSelectorStrategy'); // ToDo: move error to wdio-error package
126
124
  }
127
125
  using = match[1];
@@ -149,8 +147,43 @@ const findStrategy = function (selector, isW3C, isMobile) {
149
147
  }
150
148
  case 'shadow':
151
149
  using = 'shadow';
152
- value = stringSelector.slice(constants_1.DEEP_SELECTOR.length);
150
+ value = stringSelector.slice(DEEP_SELECTOR.length);
153
151
  break;
152
+ case 'aria': {
153
+ const label = stringSelector.slice(ARIA_SELECTOR.length);
154
+ const conditions = [
155
+ // aria label is recevied by other element with aria-labelledBy
156
+ // https://www.w3.org/TR/accname-1.1/#step2B
157
+ `.//*[@aria-labelledby=(//*[normalize-space() = "${label}"]/@id)]`,
158
+ // aria label is recevied by other element with aria-labelledBy
159
+ // https://www.w3.org/TR/accname-1.1/#step2B
160
+ `.//*[@aria-describedby=(//*[normalize-space() = "${label}"]/@id)]`,
161
+ // element has direct aria label
162
+ // https://www.w3.org/TR/accname-1.1/#step2C
163
+ `.//*[@aria-label = "${label}"]`,
164
+ // inputs with a label
165
+ // https://www.w3.org/TR/accname-1.1/#step2D
166
+ `.//input[@id = (//label[normalize-space() = "${label}"]/@for)]`,
167
+ // aria label is received by an input placeholder
168
+ // https://www.w3.org/TR/accname-1.1/#step2D
169
+ `.//input[@placeholder="${label}"]`,
170
+ // aria label is received by an input placeholder
171
+ // https://www.w3.org/TR/accname-1.1/#step2D
172
+ `.//input[@aria-placeholder="${label}"]`,
173
+ // aria label is received by its title attribute
174
+ // https://www.w3.org/TR/accname-1.1/#step2D
175
+ `.//*[@title="${label}"]`,
176
+ // images with an alt tag
177
+ // https://www.w3.org/TR/accname-1.1/#step2D
178
+ `.//img[@alt="${label}"]`,
179
+ // aria label is received from element content
180
+ // https://www.w3.org/TR/accname-1.1/#step2G
181
+ `.//*[normalize-space() = "${label}"]`
182
+ ];
183
+ using = 'xpath';
184
+ value = `(${conditions.join(' | ')})[1]`;
185
+ break;
186
+ }
154
187
  case '-android uiautomator': {
155
188
  using = '-android uiautomator';
156
189
  value = stringSelector.slice(8);
@@ -219,7 +252,7 @@ const findStrategy = function (selector, isW3C, isMobile) {
219
252
  }
220
253
  case '-image': {
221
254
  using = '-image';
222
- value = fs_1.default.readFileSync(stringSelector, { encoding: 'base64' });
255
+ value = fs.readFileSync(stringSelector, { encoding: 'base64' });
223
256
  break;
224
257
  }
225
258
  case 'role': {
@@ -234,11 +267,9 @@ const findStrategy = function (selector, isW3C, isMobile) {
234
267
  }
235
268
  return { using, value };
236
269
  };
237
- exports.findStrategy = findStrategy;
238
270
  const createRoleBaseXpathSelector = (role) => {
239
- var _a;
240
271
  const locatorArr = [];
241
- (_a = aria_query_1.roleElements.get(role)) === null || _a === void 0 ? void 0 : _a.forEach((value) => {
272
+ roleElements.get(role)?.forEach((value) => {
242
273
  let locator;
243
274
  let tagname, tagAttribute, tagAttributevalue;
244
275
  tagname = value.name;
@@ -13,5 +13,5 @@ export declare const getElement: (this: WebdriverIO.Browser | WebdriverIO.Elemen
13
13
  * @param {Object} res findElements response
14
14
  * @return {Array} array of WDIO elements
15
15
  */
16
- export declare const getElements: (this: WebdriverIO.Browser | WebdriverIO.Element, selector: Selector, elemResponse: ElementReference[], isReactElement?: boolean) => ElementArray;
16
+ export declare const getElements: (this: WebdriverIO.Browser | WebdriverIO.Element, selector: Selector | ElementReference[] | WebdriverIO.Element[], elemResponse: ElementReference[], isReactElement?: boolean) => ElementArray;
17
17
  //# sourceMappingURL=getElementObject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getElementObject.d.ts","sourceRoot":"","sources":["../../src/utils/getElementObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAKvD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SACb,YAAY,OAAO,GAAG,mBAAmB,aACpC,QAAQ,QACb,gBAAgB,GAAG,KAAK,+BAE/B,mBA8CF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SACd,YAAY,OAAO,GAAG,mBAAmB,YACrC,QAAQ,gBACJ,gBAAgB,EAAE,+BAEjC,YA+CF,CAAA"}
1
+ {"version":3,"file":"getElementObject.d.ts","sourceRoot":"","sources":["../../src/utils/getElementObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAMvD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SACb,YAAY,OAAO,GAAG,mBAAmB,aACpC,QAAQ,QACb,gBAAgB,GAAG,KAAK,+BAE/B,mBAuDF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SACd,YAAY,OAAO,GAAG,mBAAmB,YACrC,QAAQ,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,gBACjD,gBAAgB,EAAE,+BAEjC,YAiEF,CAAA"}