askui 0.18.1 → 0.19.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 (256) hide show
  1. package/dist/cjs/core/ai-element/ai-element-collection.d.ts +10 -0
  2. package/dist/cjs/core/ai-element/ai-element-collection.js +78 -0
  3. package/dist/cjs/core/ai-element/ai-element-error.d.ts +2 -0
  4. package/dist/cjs/core/ai-element/ai-element-error.js +6 -0
  5. package/dist/cjs/core/ai-element/ai-element.d.ts +27 -0
  6. package/dist/cjs/core/ai-element/ai-element.js +31 -0
  7. package/dist/cjs/execution/dsl.d.ts +127 -17
  8. package/dist/cjs/execution/dsl.js +158 -17
  9. package/dist/cjs/execution/index.d.ts +1 -1
  10. package/dist/cjs/execution/index.js +11 -3
  11. package/dist/cjs/execution/ui-control-client-dependency-builder.d.ts +1 -0
  12. package/dist/cjs/execution/ui-control-client-dependency-builder.js +3 -0
  13. package/dist/cjs/execution/ui-control-client.d.ts +101 -16
  14. package/dist/cjs/execution/ui-control-client.js +142 -52
  15. package/dist/cjs/main.d.ts +1 -1
  16. package/dist/cjs/main.js +12 -3
  17. package/dist/cjs/utils/analytics/analytics.d.ts +1 -1
  18. package/dist/esm/core/ai-element/ai-element-collection.d.ts +10 -0
  19. package/dist/esm/core/ai-element/ai-element-collection.js +71 -0
  20. package/dist/esm/core/ai-element/ai-element-error.d.ts +2 -0
  21. package/dist/esm/core/ai-element/ai-element-error.js +2 -0
  22. package/dist/esm/core/ai-element/ai-element.d.ts +27 -0
  23. package/dist/esm/core/ai-element/ai-element.js +28 -0
  24. package/dist/esm/execution/dsl.d.ts +127 -17
  25. package/dist/esm/execution/dsl.js +158 -17
  26. package/dist/esm/execution/index.d.ts +1 -1
  27. package/dist/esm/execution/index.js +1 -1
  28. package/dist/esm/execution/ui-control-client-dependency-builder.d.ts +1 -0
  29. package/dist/esm/execution/ui-control-client-dependency-builder.js +3 -0
  30. package/dist/esm/execution/ui-control-client.d.ts +101 -16
  31. package/dist/esm/execution/ui-control-client.js +142 -49
  32. package/dist/esm/main.d.ts +1 -1
  33. package/dist/esm/main.js +1 -1
  34. package/dist/esm/utils/analytics/analytics.d.ts +1 -1
  35. package/package.json +1 -1
  36. package/dist/cjs/core/annotation/annotation-writer.js.map +0 -1
  37. package/dist/cjs/core/annotation/annotation.js.map +0 -1
  38. package/dist/cjs/core/inference-response/inference-response.js.map +0 -1
  39. package/dist/cjs/core/inference-response/invalid-model-type-error.js.map +0 -1
  40. package/dist/cjs/core/inference-response/model-type.js.map +0 -1
  41. package/dist/cjs/core/model/annotation-result/annotation-interface.js.map +0 -1
  42. package/dist/cjs/core/model/annotation-result/boundary-box.js.map +0 -1
  43. package/dist/cjs/core/model/annotation-result/detected-element.js.map +0 -1
  44. package/dist/cjs/core/model/custom-element-json.js.map +0 -1
  45. package/dist/cjs/core/model/custom-element.js.map +0 -1
  46. package/dist/cjs/core/reporting/default-step.js.map +0 -1
  47. package/dist/cjs/core/reporting/index.js.map +0 -1
  48. package/dist/cjs/core/reporting/instruction.js.map +0 -1
  49. package/dist/cjs/core/reporting/reporter-config.js.map +0 -1
  50. package/dist/cjs/core/reporting/reporter.js.map +0 -1
  51. package/dist/cjs/core/reporting/snapshot-detail-level.js.map +0 -1
  52. package/dist/cjs/core/reporting/snapshot.js.map +0 -1
  53. package/dist/cjs/core/reporting/step-reporter.js.map +0 -1
  54. package/dist/cjs/core/reporting/step-run.js.map +0 -1
  55. package/dist/cjs/core/reporting/step-status-end.js.map +0 -1
  56. package/dist/cjs/core/reporting/step-status.js.map +0 -1
  57. package/dist/cjs/core/reporting/step.js.map +0 -1
  58. package/dist/cjs/core/runner-protocol/index.js.map +0 -1
  59. package/dist/cjs/core/runner-protocol/request/capture-screenshot-request.js.map +0 -1
  60. package/dist/cjs/core/runner-protocol/request/control-request.js.map +0 -1
  61. package/dist/cjs/core/runner-protocol/request/get-server-process-pid.js.map +0 -1
  62. package/dist/cjs/core/runner-protocol/request/index.js.map +0 -1
  63. package/dist/cjs/core/runner-protocol/request/interactive-annotation-request.js.map +0 -1
  64. package/dist/cjs/core/runner-protocol/request/read-recording-request.js.map +0 -1
  65. package/dist/cjs/core/runner-protocol/request/runner-protocol-request.js.map +0 -1
  66. package/dist/cjs/core/runner-protocol/request/start-recording-request.js.map +0 -1
  67. package/dist/cjs/core/runner-protocol/request/stop-recording-request.js.map +0 -1
  68. package/dist/cjs/core/runner-protocol/response/index.js.map +0 -1
  69. package/dist/cjs/core/ui-control-commands/action.js.map +0 -1
  70. package/dist/cjs/core/ui-control-commands/control-command-code.js.map +0 -1
  71. package/dist/cjs/core/ui-control-commands/control-command.js.map +0 -1
  72. package/dist/cjs/core/ui-control-commands/index.js.map +0 -1
  73. package/dist/cjs/core/ui-control-commands/input-event.js.map +0 -1
  74. package/dist/cjs/execution/config-error.js.map +0 -1
  75. package/dist/cjs/execution/control-command-error.js.map +0 -1
  76. package/dist/cjs/execution/credentials-args.js.map +0 -1
  77. package/dist/cjs/execution/dsl.js.map +0 -1
  78. package/dist/cjs/execution/execution-runtime.js.map +0 -1
  79. package/dist/cjs/execution/index.js.map +0 -1
  80. package/dist/cjs/execution/inference-client.js.map +0 -1
  81. package/dist/cjs/execution/inference-response-error.js.map +0 -1
  82. package/dist/cjs/execution/is-image-required-interface.js.map +0 -1
  83. package/dist/cjs/execution/misc.js.map +0 -1
  84. package/dist/cjs/execution/model-composition-branch.js.map +0 -1
  85. package/dist/cjs/execution/read-environment-credentials.js.map +0 -1
  86. package/dist/cjs/execution/read-recording-response-stream-handler.js.map +0 -1
  87. package/dist/cjs/execution/repeat-error.js.map +0 -1
  88. package/dist/cjs/execution/ui-control-client-dependency-builder.js.map +0 -1
  89. package/dist/cjs/execution/ui-control-client.js.map +0 -1
  90. package/dist/cjs/execution/ui-controller-client-connection-state.js.map +0 -1
  91. package/dist/cjs/execution/ui-controller-client-error.js.map +0 -1
  92. package/dist/cjs/execution/ui-controller-client-interface.js.map +0 -1
  93. package/dist/cjs/execution/ui-controller-client.js.map +0 -1
  94. package/dist/cjs/lib/download-binaries.js.map +0 -1
  95. package/dist/cjs/lib/index.js.map +0 -1
  96. package/dist/cjs/lib/interactive_cli/add-script-package-json.d.ts +0 -1
  97. package/dist/cjs/lib/interactive_cli/add-script-package-json.js +0 -39
  98. package/dist/cjs/lib/interactive_cli/add-script-package-json.js.map +0 -1
  99. package/dist/cjs/lib/interactive_cli/cli-options-interface.js.map +0 -1
  100. package/dist/cjs/lib/interactive_cli/cli.js.map +0 -1
  101. package/dist/cjs/lib/interactive_cli/create-example-project.js.map +0 -1
  102. package/dist/cjs/lib/interactive_cli/index.js.map +0 -1
  103. package/dist/cjs/lib/libfuse-error.js.map +0 -1
  104. package/dist/cjs/lib/logger.js.map +0 -1
  105. package/dist/cjs/lib/timeout-error.js.map +0 -1
  106. package/dist/cjs/lib/ui-controller-args.js.map +0 -1
  107. package/dist/cjs/lib/ui-controller-darwin.js.map +0 -1
  108. package/dist/cjs/lib/ui-controller-facade.js.map +0 -1
  109. package/dist/cjs/lib/ui-controller-linux.js.map +0 -1
  110. package/dist/cjs/lib/ui-controller-win32.js.map +0 -1
  111. package/dist/cjs/lib/ui-controller.js.map +0 -1
  112. package/dist/cjs/lib/unkown-error.js.map +0 -1
  113. package/dist/cjs/lib/wayland-error.js.map +0 -1
  114. package/dist/cjs/main.js.map +0 -1
  115. package/dist/cjs/shared/index.js.map +0 -1
  116. package/dist/cjs/shared/log-levels.js.map +0 -1
  117. package/dist/cjs/shared/proxy-agent-args.js.map +0 -1
  118. package/dist/cjs/utils/analytics/analytics-interface.js.map +0 -1
  119. package/dist/cjs/utils/analytics/analytics.js.map +0 -1
  120. package/dist/cjs/utils/analytics/index.js.map +0 -1
  121. package/dist/cjs/utils/analytics/installation-timestamp-create-error.js.map +0 -1
  122. package/dist/cjs/utils/analytics/installation-timestamp-get-error.js.map +0 -1
  123. package/dist/cjs/utils/analytics/installation-timestamp.js.map +0 -1
  124. package/dist/cjs/utils/analytics/user-identifier-interface.js.map +0 -1
  125. package/dist/cjs/utils/analytics/user-identifier.js.map +0 -1
  126. package/dist/cjs/utils/base_64_image/base-64-image-error.js.map +0 -1
  127. package/dist/cjs/utils/base_64_image/base-64-image-string-error.js.map +0 -1
  128. package/dist/cjs/utils/base_64_image/base-64-image.js.map +0 -1
  129. package/dist/cjs/utils/base_64_image/sharp.js.map +0 -1
  130. package/dist/cjs/utils/http/credentials.js.map +0 -1
  131. package/dist/cjs/utils/http/custom-errors/authentication-http-client-error.js.map +0 -1
  132. package/dist/cjs/utils/http/custom-errors/client-http-client-error.js.map +0 -1
  133. package/dist/cjs/utils/http/custom-errors/general-http-client-error.js.map +0 -1
  134. package/dist/cjs/utils/http/custom-errors/http-client-error.js.map +0 -1
  135. package/dist/cjs/utils/http/custom-errors/index.js.map +0 -1
  136. package/dist/cjs/utils/http/custom-errors/server-http-client-error.js.map +0 -1
  137. package/dist/cjs/utils/http/custom-errors/unkown-http-client-error.js.map +0 -1
  138. package/dist/cjs/utils/http/http-client-got.js.map +0 -1
  139. package/dist/cjs/utils/http/index.js.map +0 -1
  140. package/dist/cjs/utils/image-resize-errors/image-resizing-base-error.js.map +0 -1
  141. package/dist/cjs/utils/image-resize-errors/index.js.map +0 -1
  142. package/dist/cjs/utils/path.js.map +0 -1
  143. package/dist/cjs/utils/proxy/proxy-builder.js.map +0 -1
  144. package/dist/cjs/utils/resized-image-interface.js.map +0 -1
  145. package/dist/cjs/utils/transformations.js.map +0 -1
  146. package/dist/esm/core/annotation/annotation-writer.js.map +0 -1
  147. package/dist/esm/core/annotation/annotation.js.map +0 -1
  148. package/dist/esm/core/inference-response/inference-response.js.map +0 -1
  149. package/dist/esm/core/inference-response/invalid-model-type-error.js.map +0 -1
  150. package/dist/esm/core/inference-response/model-type.js.map +0 -1
  151. package/dist/esm/core/model/annotation-result/annotation-interface.js.map +0 -1
  152. package/dist/esm/core/model/annotation-result/boundary-box.js.map +0 -1
  153. package/dist/esm/core/model/annotation-result/detected-element.js.map +0 -1
  154. package/dist/esm/core/model/custom-element-json.js.map +0 -1
  155. package/dist/esm/core/model/custom-element.js.map +0 -1
  156. package/dist/esm/core/reporting/default-step.js.map +0 -1
  157. package/dist/esm/core/reporting/index.js.map +0 -1
  158. package/dist/esm/core/reporting/instruction.js.map +0 -1
  159. package/dist/esm/core/reporting/reporter-config.js.map +0 -1
  160. package/dist/esm/core/reporting/reporter.js.map +0 -1
  161. package/dist/esm/core/reporting/snapshot-detail-level.js.map +0 -1
  162. package/dist/esm/core/reporting/snapshot.js.map +0 -1
  163. package/dist/esm/core/reporting/step-reporter.js.map +0 -1
  164. package/dist/esm/core/reporting/step-run.js.map +0 -1
  165. package/dist/esm/core/reporting/step-status-end.js.map +0 -1
  166. package/dist/esm/core/reporting/step-status.js.map +0 -1
  167. package/dist/esm/core/reporting/step.js.map +0 -1
  168. package/dist/esm/core/runner-protocol/index.js.map +0 -1
  169. package/dist/esm/core/runner-protocol/request/capture-screenshot-request.js.map +0 -1
  170. package/dist/esm/core/runner-protocol/request/control-request.js.map +0 -1
  171. package/dist/esm/core/runner-protocol/request/get-server-process-pid.js.map +0 -1
  172. package/dist/esm/core/runner-protocol/request/index.js.map +0 -1
  173. package/dist/esm/core/runner-protocol/request/interactive-annotation-request.js.map +0 -1
  174. package/dist/esm/core/runner-protocol/request/read-recording-request.js.map +0 -1
  175. package/dist/esm/core/runner-protocol/request/runner-protocol-request.js.map +0 -1
  176. package/dist/esm/core/runner-protocol/request/start-recording-request.js.map +0 -1
  177. package/dist/esm/core/runner-protocol/request/stop-recording-request.js.map +0 -1
  178. package/dist/esm/core/runner-protocol/response/index.js.map +0 -1
  179. package/dist/esm/core/ui-control-commands/action.js.map +0 -1
  180. package/dist/esm/core/ui-control-commands/control-command-code.js.map +0 -1
  181. package/dist/esm/core/ui-control-commands/control-command.js.map +0 -1
  182. package/dist/esm/core/ui-control-commands/index.js.map +0 -1
  183. package/dist/esm/core/ui-control-commands/input-event.js.map +0 -1
  184. package/dist/esm/execution/config-error.js.map +0 -1
  185. package/dist/esm/execution/control-command-error.js.map +0 -1
  186. package/dist/esm/execution/credentials-args.js.map +0 -1
  187. package/dist/esm/execution/dsl.js.map +0 -1
  188. package/dist/esm/execution/execution-runtime.js.map +0 -1
  189. package/dist/esm/execution/index.js.map +0 -1
  190. package/dist/esm/execution/inference-client.js.map +0 -1
  191. package/dist/esm/execution/inference-response-error.js.map +0 -1
  192. package/dist/esm/execution/is-image-required-interface.js.map +0 -1
  193. package/dist/esm/execution/misc.js.map +0 -1
  194. package/dist/esm/execution/model-composition-branch.js.map +0 -1
  195. package/dist/esm/execution/read-environment-credentials.js.map +0 -1
  196. package/dist/esm/execution/read-recording-response-stream-handler.js.map +0 -1
  197. package/dist/esm/execution/repeat-error.js.map +0 -1
  198. package/dist/esm/execution/ui-control-client-dependency-builder.js.map +0 -1
  199. package/dist/esm/execution/ui-control-client.js.map +0 -1
  200. package/dist/esm/execution/ui-controller-client-connection-state.js.map +0 -1
  201. package/dist/esm/execution/ui-controller-client-error.js.map +0 -1
  202. package/dist/esm/execution/ui-controller-client-interface.js.map +0 -1
  203. package/dist/esm/execution/ui-controller-client.js.map +0 -1
  204. package/dist/esm/lib/download-binaries.js.map +0 -1
  205. package/dist/esm/lib/index.js.map +0 -1
  206. package/dist/esm/lib/interactive_cli/add-script-package-json.d.ts +0 -1
  207. package/dist/esm/lib/interactive_cli/add-script-package-json.js +0 -32
  208. package/dist/esm/lib/interactive_cli/add-script-package-json.js.map +0 -1
  209. package/dist/esm/lib/interactive_cli/cli-options-interface.js.map +0 -1
  210. package/dist/esm/lib/interactive_cli/cli.js.map +0 -1
  211. package/dist/esm/lib/interactive_cli/create-example-project.js.map +0 -1
  212. package/dist/esm/lib/interactive_cli/index.js.map +0 -1
  213. package/dist/esm/lib/libfuse-error.js.map +0 -1
  214. package/dist/esm/lib/logger.js.map +0 -1
  215. package/dist/esm/lib/timeout-error.js.map +0 -1
  216. package/dist/esm/lib/ui-controller-args.js.map +0 -1
  217. package/dist/esm/lib/ui-controller-darwin.js.map +0 -1
  218. package/dist/esm/lib/ui-controller-facade.js.map +0 -1
  219. package/dist/esm/lib/ui-controller-linux.js.map +0 -1
  220. package/dist/esm/lib/ui-controller-win32.js.map +0 -1
  221. package/dist/esm/lib/ui-controller.js.map +0 -1
  222. package/dist/esm/lib/unkown-error.js.map +0 -1
  223. package/dist/esm/lib/wayland-error.js.map +0 -1
  224. package/dist/esm/main.js.map +0 -1
  225. package/dist/esm/shared/index.js.map +0 -1
  226. package/dist/esm/shared/log-levels.js.map +0 -1
  227. package/dist/esm/shared/proxy-agent-args.js.map +0 -1
  228. package/dist/esm/utils/analytics/analytics-interface.js.map +0 -1
  229. package/dist/esm/utils/analytics/analytics.js.map +0 -1
  230. package/dist/esm/utils/analytics/index.js.map +0 -1
  231. package/dist/esm/utils/analytics/installation-timestamp-create-error.js.map +0 -1
  232. package/dist/esm/utils/analytics/installation-timestamp-get-error.js.map +0 -1
  233. package/dist/esm/utils/analytics/installation-timestamp.js.map +0 -1
  234. package/dist/esm/utils/analytics/user-identifier-interface.js.map +0 -1
  235. package/dist/esm/utils/analytics/user-identifier.js.map +0 -1
  236. package/dist/esm/utils/base_64_image/base-64-image-error.js.map +0 -1
  237. package/dist/esm/utils/base_64_image/base-64-image-string-error.js.map +0 -1
  238. package/dist/esm/utils/base_64_image/base-64-image.js.map +0 -1
  239. package/dist/esm/utils/base_64_image/sharp.js.map +0 -1
  240. package/dist/esm/utils/http/credentials.js.map +0 -1
  241. package/dist/esm/utils/http/custom-errors/authentication-http-client-error.js.map +0 -1
  242. package/dist/esm/utils/http/custom-errors/client-http-client-error.js.map +0 -1
  243. package/dist/esm/utils/http/custom-errors/general-http-client-error.js.map +0 -1
  244. package/dist/esm/utils/http/custom-errors/http-client-error.js.map +0 -1
  245. package/dist/esm/utils/http/custom-errors/index.js.map +0 -1
  246. package/dist/esm/utils/http/custom-errors/server-http-client-error.js.map +0 -1
  247. package/dist/esm/utils/http/custom-errors/unkown-http-client-error.js.map +0 -1
  248. package/dist/esm/utils/http/http-client-got.js.map +0 -1
  249. package/dist/esm/utils/http/index.js.map +0 -1
  250. package/dist/esm/utils/image-resize-errors/image-resizing-base-error.js.map +0 -1
  251. package/dist/esm/utils/image-resize-errors/index.js.map +0 -1
  252. package/dist/esm/utils/path.js.map +0 -1
  253. package/dist/esm/utils/proxy/proxy-builder.js.map +0 -1
  254. package/dist/esm/utils/resized-image-interface.js.map +0 -1
  255. package/dist/esm/utils/transformations.js.map +0 -1
  256. package/dist/example_projects_templates/configs/jasmine.config.json +0 -12
@@ -1,12 +1,34 @@
1
- import { CustomElementJson } from '../core/model/custom-element-json';
2
- import { Exec, Executable, FluentFilters, ApiCommands, PC_AND_MODIFIER_KEY } from './dsl';
1
+ import { Exec, Executable, FluentFilters, ApiCommands, PC_AND_MODIFIER_KEY, CommandExecutorContext } from './dsl';
3
2
  import { UiControllerClientConnectionState } from './ui-controller-client-connection-state';
4
3
  import { Annotation } from '../core/annotation/annotation';
5
4
  import { AnnotationRequest } from '../core/model/annotation-result/annotation-interface';
6
5
  import { DetectedElement } from '../core/model/annotation-result/detected-element';
7
6
  import { ClientArgs } from './ui-controller-client-interface';
8
7
  export declare type RelationsForConvenienceMethods = 'nearestTo' | 'leftOf' | 'above' | 'rightOf' | 'below' | 'contains';
8
+ export declare type TextMatchingOption = 'similar' | 'exact' | 'regex';
9
+ export declare type ElementExistsQueryType = 'otherElement' | 'switch' | 'element' | 'container' | 'checkbox' | 'element' | 'button' | 'table' | 'text' | 'icon' | 'image' | 'textfield';
10
+ export interface ElementExistsQueryText {
11
+ value: string;
12
+ matching?: TextMatchingOption;
13
+ }
14
+ export interface ElementExistsQueryRelation {
15
+ type: RelationsForConvenienceMethods;
16
+ text: string;
17
+ }
18
+ export interface ElementExistsQuery {
19
+ type: keyof Pick<FluentFilters, ElementExistsQueryType>;
20
+ text?: ElementExistsQueryText;
21
+ relation?: ElementExistsQueryRelation;
22
+ }
23
+ export interface ExpectExistenceElement extends ElementExistsQuery {
24
+ exists: boolean;
25
+ }
26
+ export interface ExpectAllExistResult {
27
+ allExist: boolean;
28
+ elements: ExpectExistenceElement[];
29
+ }
9
30
  export declare class UiControlClient extends ApiCommands {
31
+ private workspaceId;
10
32
  private executionRuntime;
11
33
  private stepReporter;
12
34
  private constructor();
@@ -34,8 +56,9 @@ export declare class UiControlClient extends ApiCommands {
34
56
  annotateInteractively(): Promise<void>;
35
57
  private escapeSeparatorString;
36
58
  private buildInstruction;
37
- fluentCommandExecutor(instructionString: string, customElementJson?: CustomElementJson[]): Promise<void>;
38
- getterExecutor(instruction: string, customElementJson?: CustomElementJson[]): Promise<DetectedElement[]>;
59
+ private getAIElementsByNames;
60
+ fluentCommandExecutor(instructionString: string, context?: CommandExecutorContext): Promise<void>;
61
+ getterExecutor(instruction: string, context?: CommandExecutorContext): Promise<DetectedElement[]>;
39
62
  private secretText;
40
63
  private getAndResetSecretText;
41
64
  /**
@@ -190,8 +213,8 @@ export declare class UiControlClient extends ApiCommands {
190
213
  * @param {Object} params - Object containing required `label` property and
191
214
  * optional `relation` property.
192
215
  * @property {string} params.label - The label for the checkbox.
193
- * @property {Object} params.relation - Object describing the relationship between
194
- * the clicked checkbox and another element.
216
+ * @property {Object} [params.relation] - Object describing the relationship between
217
+ * the clicked checkbox and another element.
195
218
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
196
219
  */
197
220
  clickCheckbox(params: {
@@ -213,7 +236,7 @@ export declare class UiControlClient extends ApiCommands {
213
236
  * @param {Object} params - Object containing required `label` property and
214
237
  * optional `relation` property.
215
238
  * @property {string} params.label - The label for the checkbox.
216
- * @property {Object} params.relation - Object describing the relationship between
239
+ * @property {Object} [params.relation] - Object describing the relationship between
217
240
  * the clicked checkbox and another element.
218
241
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
219
242
  */
@@ -266,41 +289,103 @@ export declare class UiControlClient extends ApiCommands {
266
289
  }): Promise<void>;
267
290
  /**
268
291
  * Click on a specific text.
269
- * You can also use a RegEx or match the text exactly by specifyicing the specific flag.
292
+ * You can also use a RegEx or match the text exactly by specifying the specific flag.
270
293
  * Use a relation to find the text in relation to a specific text.
271
294
  *
272
295
  * **Examples:**
273
296
  * ```typescript
274
297
  * // Click text that matches exactly
275
- * await aui.clickText({text: 'askui', type: 'similar'})
298
+ * await aui.clickText({text: 'askui', matching: 'similar'})
276
299
  *
277
300
  * // Click text that contains 'pie' or 'cake' or 'Pie' or 'Cake'
278
- * await aui.clickText({text: '.*([Pp]ie|[Cc]ake).*', type: 'regex'})
301
+ * await aui.clickText({text: '.*([Pp]ie|[Cc]ake).*', matching: 'regex'})
279
302
  *
280
303
  * // Click the text 'TERMINAL' that is left of the text 'Ports'
281
304
  * await aui.clickText({
282
305
  * text: 'TERMINAL',
283
- * type: "exact",
306
+ * matching: "exact",
284
307
  * relation: { type: 'leftOf', text: 'PORTS' }
285
308
  * })
286
309
  * ```
310
+ *
287
311
  * @param {Object} params - Object containing required `text` property and optional properties
288
312
  * for regular expression matching and relation.
289
313
  * @property {string} params.text - The text to be clicked.
290
- * @property {string} params.type - Whether the text is matched using similarity,
291
- * exact match or a regular expression.
292
- * @property {Object} params.relation - Object describing the relationship between the
293
- * clicked text and another element.
314
+ * @property {string} params.matching - Whether the text is matched using similarity,
315
+ * exact match or a regular expression.
316
+ * @property {Object} [params.relation] - Object describing the relationship between the
317
+ * clicked text and another element.
294
318
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
295
319
  * @property {string} params.relation.text - The label or text associated with the
296
320
  * related element or state.
297
321
  */
298
322
  clickText(params: {
299
323
  text: string;
300
- type: 'similar' | 'exact' | 'regex';
324
+ matching: TextMatchingOption;
301
325
  relation?: {
302
326
  type: RelationsForConvenienceMethods;
303
327
  text: string;
304
328
  };
305
329
  }): Promise<void>;
330
+ private evaluateMatchingProperty;
331
+ /**
332
+ * Check if one or multiple elements are detected.
333
+ *
334
+ * **Examples:**
335
+ * ```typescript
336
+ * await aui.expectAllExist([
337
+ * {
338
+ * type: 'text',
339
+ * text: {
340
+ * value: 'Switch to Dark',
341
+ * matching: 'similar'
342
+ * }
343
+ * },
344
+ * ]);
345
+ *
346
+ * // Check for existence of multiple elements
347
+ * await aui.expectAllExist([
348
+ * {
349
+ * type: 'textfield',
350
+ * relation: {
351
+ * type: 'rightOf',
352
+ * text: 'Email:'
353
+ * }
354
+ * },
355
+ * {
356
+ * type: 'element',
357
+ * text: {
358
+ * value: 'Switch to Dark'
359
+ * }
360
+ * },
361
+ * ]);
362
+ *
363
+ * // Validate existence
364
+ * const exists = await aui.expectAllExist([...]);
365
+ * exists.allExist // true when every element exists
366
+ *
367
+ * // Check which elements do not exist
368
+ * // with the elements property
369
+ * const nonExistentElements = exists.elements.filter((e) => e.exists===false)
370
+ * ```
371
+ *
372
+ * @param {ElementExistsQuery[]} query - Objects containing the required property
373
+ * 'type' and the optional properties
374
+ * 'text' and 'relation'.
375
+ * @property {string} query.type - The type of the element: 'otherElement' | 'switch' |
376
+ * 'element' | 'container' | 'checkbox' | 'element' |
377
+ * 'button' | 'table' | 'text' | 'icon' | 'image' | 'textfield'
378
+ * @property {Object} [query.text] - Object containing value and matching strategy.
379
+ * @property {string} query.text.value - The text to match for.
380
+ * @property {string} [query.text.matching] - Whether the text is matched using similarity,
381
+ * exact match or a regular expression.
382
+ * @property {Object} [query.relation] - Object describing the relationship between the
383
+ * clicked text and another element.
384
+ * @property {RelationsForConvenienceMethods} query.relation.type - The type of relation.
385
+ * @property {string} query.relation.text - The label or text associated with the
386
+ * related element or state.
387
+ * @returns {ExpectAllExistResult.allExist} - If every element exists.
388
+ * @returns {ExpectAllExistResult.elements} - ExpectExistenceElement[].
389
+ */
390
+ expectAllExist(query: ElementExistsQuery[]): Promise<ExpectAllExistResult>;
306
391
  }
@@ -8,20 +8,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
12
  exports.UiControlClient = void 0;
16
- const ValidationError_1 = __importDefault(require("yup/lib/ValidationError"));
13
+ const yup_1 = require("yup");
17
14
  const custom_element_1 = require("../core/model/custom-element");
18
15
  const dsl_1 = require("./dsl");
19
16
  const annotation_writer_1 = require("../core/annotation/annotation-writer");
20
17
  const logger_1 = require("../lib/logger");
21
18
  const ui_control_client_dependency_builder_1 = require("./ui-control-client-dependency-builder");
19
+ const ai_element_collection_1 = require("../core/ai-element/ai-element-collection");
22
20
  class UiControlClient extends dsl_1.ApiCommands {
23
- constructor(executionRuntime, stepReporter) {
21
+ constructor(workspaceId, executionRuntime, stepReporter) {
24
22
  super();
23
+ this.workspaceId = workspaceId;
25
24
  this.executionRuntime = executionRuntime;
26
25
  this.stepReporter = stepReporter;
27
26
  this.secretText = undefined;
@@ -30,8 +29,8 @@ class UiControlClient extends dsl_1.ApiCommands {
30
29
  return __awaiter(this, void 0, void 0, function* () {
31
30
  const builder = ui_control_client_dependency_builder_1.UiControlClientDependencyBuilder;
32
31
  const clientArgsWithDefaults = yield builder.getClientArgsWithDefaults(clientArgs);
33
- const { executionRuntime, stepReporter } = yield builder.build(clientArgsWithDefaults);
34
- return new UiControlClient(executionRuntime, stepReporter);
32
+ const { workspaceId, executionRuntime, stepReporter, } = yield builder.build(clientArgsWithDefaults);
33
+ return new UiControlClient(workspaceId, executionRuntime, stepReporter);
35
34
  });
36
35
  }
37
36
  /**
@@ -125,9 +124,20 @@ class UiControlClient extends dsl_1.ApiCommands {
125
124
  };
126
125
  });
127
126
  }
128
- fluentCommandExecutor(instructionString, customElementJson = []) {
127
+ getAIElementsByNames(names) {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ // eslint-disable-next-line max-len
130
+ const workspaceAIElementCollection = yield ai_element_collection_1.AIElementCollection.collectForWorkspaceId(this.workspaceId);
131
+ return workspaceAIElementCollection.getByNames(names);
132
+ });
133
+ }
134
+ fluentCommandExecutor(instructionString, context = { customElementsJson: [], aiElementNames: [] }) {
129
135
  return __awaiter(this, void 0, void 0, function* () {
130
- const instruction = yield this.buildInstruction(instructionString, customElementJson);
136
+ const aiElements = yield this.getAIElementsByNames(context.aiElementNames);
137
+ const instruction = yield this.buildInstruction(instructionString, [
138
+ ...context.customElementsJson,
139
+ ...aiElements,
140
+ ]);
131
141
  logger_1.logger.debug(instruction);
132
142
  try {
133
143
  yield this.stepReporter.resetStep(instruction);
@@ -141,12 +151,16 @@ class UiControlClient extends dsl_1.ApiCommands {
141
151
  }
142
152
  });
143
153
  }
144
- getterExecutor(instruction, customElementJson = []) {
154
+ getterExecutor(instruction, context = { customElementsJson: [], aiElementNames: [] }) {
145
155
  return __awaiter(this, void 0, void 0, function* () {
146
- const customElements = yield custom_element_1.CustomElement.fromJsonListWithImagePathOrImage(customElementJson);
156
+ const aiElements = yield this.getAIElementsByNames(context.aiElementNames);
157
+ const customElements = yield custom_element_1.CustomElement.fromJsonListWithImagePathOrImage(context.customElementsJson);
147
158
  const stringWithoutSeparators = this.escapeSeparatorString(instruction);
148
159
  logger_1.logger.debug(stringWithoutSeparators);
149
- return this.executionRuntime.getDetectedElements(instruction, customElements);
160
+ return this.executionRuntime.getDetectedElements(instruction, [
161
+ ...customElements,
162
+ ...aiElements,
163
+ ]);
150
164
  });
151
165
  }
152
166
  getAndResetSecretText() {
@@ -331,30 +345,22 @@ class UiControlClient extends dsl_1.ApiCommands {
331
345
  }
332
346
  // eslint-disable-next-line class-methods-use-this
333
347
  evaluateRelation(command, relation, text) {
334
- let commando = command;
335
348
  switch (relation) {
336
- case 'nearestTo':
337
- commando = command.nearestTo().text(text);
338
- break;
339
349
  case 'leftOf':
340
- commando = command.leftOf().text(text);
341
- break;
350
+ return command.leftOf().text(text);
342
351
  case 'above':
343
- commando = command.above().text(text);
344
- break;
352
+ return command.above().text(text);
345
353
  case 'rightOf':
346
- commando = command.rightOf().text(text);
347
- break;
354
+ return command.rightOf().text(text);
348
355
  case 'below':
349
- commando = command.below().text(text);
350
- break;
356
+ return command.below().text(text);
351
357
  case 'contains':
352
- commando = command.contains().text(text);
353
- break;
358
+ return command.contains().text(text);
359
+ case 'nearestTo':
360
+ return command.nearestTo().text(text);
354
361
  default:
355
- throw new ValidationError_1.default('No valid Relation.Type was passed.');
362
+ throw new yup_1.ValidationError(`'relation' has to be 'nearestTo', 'leftOf', 'above', 'rightOf', 'below' or 'contains' but was '${relation}'`);
356
363
  }
357
- return commando;
358
364
  }
359
365
  /**
360
366
  * Click a button with a specific label.
@@ -400,8 +406,8 @@ class UiControlClient extends dsl_1.ApiCommands {
400
406
  * @param {Object} params - Object containing required `label` property and
401
407
  * optional `relation` property.
402
408
  * @property {string} params.label - The label for the checkbox.
403
- * @property {Object} params.relation - Object describing the relationship between
404
- * the clicked checkbox and another element.
409
+ * @property {Object} [params.relation] - Object describing the relationship between
410
+ * the clicked checkbox and another element.
405
411
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
406
412
  */
407
413
  clickCheckbox(params) {
@@ -429,7 +435,7 @@ class UiControlClient extends dsl_1.ApiCommands {
429
435
  * @param {Object} params - Object containing required `label` property and
430
436
  * optional `relation` property.
431
437
  * @property {string} params.label - The label for the checkbox.
432
- * @property {Object} params.relation - Object describing the relationship between
438
+ * @property {Object} [params.relation] - Object describing the relationship between
433
439
  * the clicked checkbox and another element.
434
440
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
435
441
  */
@@ -493,31 +499,32 @@ class UiControlClient extends dsl_1.ApiCommands {
493
499
  }
494
500
  /**
495
501
  * Click on a specific text.
496
- * You can also use a RegEx or match the text exactly by specifyicing the specific flag.
502
+ * You can also use a RegEx or match the text exactly by specifying the specific flag.
497
503
  * Use a relation to find the text in relation to a specific text.
498
504
  *
499
505
  * **Examples:**
500
506
  * ```typescript
501
507
  * // Click text that matches exactly
502
- * await aui.clickText({text: 'askui', type: 'similar'})
508
+ * await aui.clickText({text: 'askui', matching: 'similar'})
503
509
  *
504
510
  * // Click text that contains 'pie' or 'cake' or 'Pie' or 'Cake'
505
- * await aui.clickText({text: '.*([Pp]ie|[Cc]ake).*', type: 'regex'})
511
+ * await aui.clickText({text: '.*([Pp]ie|[Cc]ake).*', matching: 'regex'})
506
512
  *
507
513
  * // Click the text 'TERMINAL' that is left of the text 'Ports'
508
514
  * await aui.clickText({
509
515
  * text: 'TERMINAL',
510
- * type: "exact",
516
+ * matching: "exact",
511
517
  * relation: { type: 'leftOf', text: 'PORTS' }
512
518
  * })
513
519
  * ```
520
+ *
514
521
  * @param {Object} params - Object containing required `text` property and optional properties
515
522
  * for regular expression matching and relation.
516
523
  * @property {string} params.text - The text to be clicked.
517
- * @property {string} params.type - Whether the text is matched using similarity,
518
- * exact match or a regular expression.
519
- * @property {Object} params.relation - Object describing the relationship between the
520
- * clicked text and another element.
524
+ * @property {string} params.matching - Whether the text is matched using similarity,
525
+ * exact match or a regular expression.
526
+ * @property {Object} [params.relation] - Object describing the relationship between the
527
+ * clicked text and another element.
521
528
  * @property {RelationsForConvenienceMethods} params.relation.type - The type of relation.
522
529
  * @property {string} params.relation.text - The label or text associated with the
523
530
  * related element or state.
@@ -525,24 +532,107 @@ class UiControlClient extends dsl_1.ApiCommands {
525
532
  clickText(params) {
526
533
  return __awaiter(this, void 0, void 0, function* () {
527
534
  let command = this.click().text();
528
- switch (params.type) {
529
- case 'similar':
530
- command = command.withText(params.text);
531
- break;
532
- case 'exact':
533
- command = command.withExactText(params.text);
534
- break;
535
- case 'regex':
536
- command = command.withTextRegex(params.text);
537
- break;
538
- default:
539
- throw new ValidationError_1.default('"type" must be "similar", "exact" or "regex"');
540
- }
535
+ command = this.evaluateMatchingProperty(command, { value: params.text, matching: params.matching });
541
536
  if (params.relation) {
542
537
  command = this.evaluateRelation(command, params.relation.type, params.relation.text);
543
538
  }
544
539
  yield command.exec();
545
540
  });
546
541
  }
542
+ // eslint-disable-next-line class-methods-use-this
543
+ evaluateMatchingProperty(command, text) {
544
+ var _a;
545
+ switch ((_a = text.matching) !== null && _a !== void 0 ? _a : 'similar') {
546
+ case 'exact':
547
+ return command.withExactText(text.value);
548
+ case 'regex':
549
+ return command.withTextRegex(text.value);
550
+ case 'similar':
551
+ return command.withText(text.value);
552
+ default:
553
+ throw new yup_1.ValidationError(`'text.matching' property has to be 'similar', 'exact' or 'regex' but was '${text.matching}'`);
554
+ }
555
+ }
556
+ /**
557
+ * Check if one or multiple elements are detected.
558
+ *
559
+ * **Examples:**
560
+ * ```typescript
561
+ * await aui.expectAllExist([
562
+ * {
563
+ * type: 'text',
564
+ * text: {
565
+ * value: 'Switch to Dark',
566
+ * matching: 'similar'
567
+ * }
568
+ * },
569
+ * ]);
570
+ *
571
+ * // Check for existence of multiple elements
572
+ * await aui.expectAllExist([
573
+ * {
574
+ * type: 'textfield',
575
+ * relation: {
576
+ * type: 'rightOf',
577
+ * text: 'Email:'
578
+ * }
579
+ * },
580
+ * {
581
+ * type: 'element',
582
+ * text: {
583
+ * value: 'Switch to Dark'
584
+ * }
585
+ * },
586
+ * ]);
587
+ *
588
+ * // Validate existence
589
+ * const exists = await aui.expectAllExist([...]);
590
+ * exists.allExist // true when every element exists
591
+ *
592
+ * // Check which elements do not exist
593
+ * // with the elements property
594
+ * const nonExistentElements = exists.elements.filter((e) => e.exists===false)
595
+ * ```
596
+ *
597
+ * @param {ElementExistsQuery[]} query - Objects containing the required property
598
+ * 'type' and the optional properties
599
+ * 'text' and 'relation'.
600
+ * @property {string} query.type - The type of the element: 'otherElement' | 'switch' |
601
+ * 'element' | 'container' | 'checkbox' | 'element' |
602
+ * 'button' | 'table' | 'text' | 'icon' | 'image' | 'textfield'
603
+ * @property {Object} [query.text] - Object containing value and matching strategy.
604
+ * @property {string} query.text.value - The text to match for.
605
+ * @property {string} [query.text.matching] - Whether the text is matched using similarity,
606
+ * exact match or a regular expression.
607
+ * @property {Object} [query.relation] - Object describing the relationship between the
608
+ * clicked text and another element.
609
+ * @property {RelationsForConvenienceMethods} query.relation.type - The type of relation.
610
+ * @property {string} query.relation.text - The label or text associated with the
611
+ * related element or state.
612
+ * @returns {ExpectAllExistResult.allExist} - If every element exists.
613
+ * @returns {ExpectAllExistResult.elements} - ExpectExistenceElement[].
614
+ */
615
+ expectAllExist(query) {
616
+ return __awaiter(this, void 0, void 0, function* () {
617
+ const elements = yield query.reduce((accumulatorPromise, subquery) => __awaiter(this, void 0, void 0, function* () {
618
+ const acc = yield accumulatorPromise;
619
+ const command = this.get()[subquery.type]();
620
+ let finalCommand = subquery.text !== undefined
621
+ ? this.evaluateMatchingProperty(command, subquery.text)
622
+ : command;
623
+ if (subquery.relation) {
624
+ finalCommand = this.evaluateRelation(finalCommand, subquery.relation.type, subquery.relation.text);
625
+ }
626
+ return [
627
+ ...acc,
628
+ Object.assign(Object.assign({}, subquery), { exists: (yield finalCommand.exec()).length > 0 }),
629
+ ];
630
+ }), Promise.resolve([]));
631
+ return {
632
+ elements,
633
+ allExist: elements.every((el) => el.exists),
634
+ };
635
+ });
636
+ }
547
637
  }
548
638
  exports.UiControlClient = UiControlClient;
@@ -1,5 +1,5 @@
1
1
  export { UiController } from './lib';
2
- export { UiControlClient, RelationsForConvenienceMethods } from './execution';
2
+ export * from './execution';
3
3
  export { Instruction, Reporter, ReporterConfig, Snapshot, SnapshotDetailLevel, Step, StepStatus, StepStatusEnd, } from './core/reporting';
4
4
  export { Annotation } from './core/annotation/annotation';
5
5
  export { DetectedElement } from './core/model/annotation-result/detected-element';
package/dist/cjs/main.js CHANGED
@@ -1,10 +1,19 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
2
12
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogLevels = exports.DetectedElement = exports.Annotation = exports.UiControlClient = exports.UiController = void 0;
13
+ exports.LogLevels = exports.DetectedElement = exports.Annotation = exports.UiController = void 0;
4
14
  var lib_1 = require("./lib");
5
15
  Object.defineProperty(exports, "UiController", { enumerable: true, get: function () { return lib_1.UiController; } });
6
- var execution_1 = require("./execution");
7
- Object.defineProperty(exports, "UiControlClient", { enumerable: true, get: function () { return execution_1.UiControlClient; } });
16
+ __exportStar(require("./execution"), exports);
8
17
  var annotation_1 = require("./core/annotation/annotation");
9
18
  Object.defineProperty(exports, "Annotation", { enumerable: true, get: function () { return annotation_1.Annotation; } });
10
19
  var detected_element_1 = require("./core/model/annotation-result/detected-element");
@@ -1,5 +1,5 @@
1
1
  import { AnalyticsInterface } from './analytics-interface';
2
- import { Context } from '@/execution/context';
2
+ import { Context } from '../../execution/context';
3
3
  export declare class Analytics implements AnalyticsInterface {
4
4
  private static clientSessionId;
5
5
  private clientId;
@@ -0,0 +1,10 @@
1
+ import { AIElement } from './ai-element';
2
+ import { CustomElementJson } from '../model/custom-element-json';
3
+ export declare class AIElementCollection {
4
+ private elements;
5
+ static AI_ELEMENT_FOLDER: string;
6
+ constructor(elements: AIElement[]);
7
+ static collectForWorkspaceId(workspaceId: string | undefined): Promise<AIElementCollection>;
8
+ getByName(name: string): CustomElementJson[];
9
+ getByNames(names: string[]): CustomElementJson[];
10
+ }
@@ -0,0 +1,71 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import os from 'os';
11
+ import path from 'path';
12
+ import fs from 'fs-extra';
13
+ import { AIElement } from './ai-element';
14
+ import { logger } from '../../lib';
15
+ import { AIElementError } from './ai-element-error';
16
+ export class AIElementCollection {
17
+ constructor(elements) {
18
+ this.elements = elements;
19
+ }
20
+ static collectForWorkspaceId(workspaceId) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ logger.debug(`Collecting AIElements for workspace '${workspaceId}' ...`);
23
+ if (workspaceId === undefined) {
24
+ throw new AIElementError("Value of 'workspaceId' must be defined.");
25
+ }
26
+ const workspaceAIElementFolder = path.join(AIElementCollection.AI_ELEMENT_FOLDER, workspaceId);
27
+ if (!(yield fs.pathExists(workspaceAIElementFolder))) {
28
+ throw new AIElementError(`Missing AIElement folder for workspace '${workspaceId}' at '${workspaceAIElementFolder}'.`);
29
+ }
30
+ const files = yield fs.readdir(workspaceAIElementFolder);
31
+ if (files.length === 0) {
32
+ throw new AIElementError(`'${workspaceAIElementFolder}' is empty. No AIElement files found for workspace '${workspaceId}'.`);
33
+ }
34
+ const aiElements = yield Promise.all(files
35
+ .filter((file) => path.extname(file) === '.json')
36
+ .map((file) => __awaiter(this, void 0, void 0, function* () {
37
+ const jsonFile = path.join(workspaceAIElementFolder, file);
38
+ const baseName = path.basename(jsonFile, '.json');
39
+ const pngFile = path.join(workspaceAIElementFolder, `${baseName}.png`);
40
+ if (yield fs.pathExists(pngFile)) {
41
+ const metadata = JSON.parse(yield fs.readFile(jsonFile, 'utf-8'));
42
+ return AIElement.fromJson(metadata, pngFile);
43
+ }
44
+ return null;
45
+ })));
46
+ const validAIElements = aiElements.filter((element) => element !== null);
47
+ if (validAIElements.length === 0) {
48
+ throw new AIElementError(`No AIElement files found for workspace '${workspaceId}' at '${workspaceAIElementFolder}'.`);
49
+ }
50
+ return new AIElementCollection(validAIElements);
51
+ });
52
+ }
53
+ getByName(name) {
54
+ if (name === '') {
55
+ throw new AIElementError("Parameter 'name' must be non-empty. This might be due to corrupted metadata.");
56
+ }
57
+ logger.debug(`Getting all CustomElementJson with the name '${name}' ...`);
58
+ const elements = this.elements.filter((element) => element.hasName(name));
59
+ if (elements.length === 0) {
60
+ throw new AIElementError(`No AIElement with the name '${name}' was found.`);
61
+ }
62
+ return elements.map((element) => element.toCustomElement());
63
+ }
64
+ getByNames(names) {
65
+ if (names.length === 0) {
66
+ return [];
67
+ }
68
+ return names.flatMap((name) => this.getByName(name));
69
+ }
70
+ }
71
+ AIElementCollection.AI_ELEMENT_FOLDER = path.join(os.homedir(), '.askui', 'SnippingTool', 'AIElement');
@@ -0,0 +1,2 @@
1
+ export declare class AIElementError extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class AIElementError extends Error {
2
+ }
@@ -0,0 +1,27 @@
1
+ import { CustomElementJson } from '../model/custom-element-json';
2
+ interface AIElementJson {
3
+ version: number;
4
+ name: string;
5
+ image?: {
6
+ mask?: {
7
+ x: number;
8
+ y: number;
9
+ }[];
10
+ };
11
+ }
12
+ declare class AIElement {
13
+ name: string;
14
+ imagePath: string;
15
+ mask?: {
16
+ x: number;
17
+ y: number;
18
+ }[] | undefined;
19
+ constructor(name: string, imagePath: string, mask?: {
20
+ x: number;
21
+ y: number;
22
+ }[] | undefined);
23
+ static fromJson(json: AIElementJson, imagePath: string): AIElement;
24
+ toCustomElement(): CustomElementJson;
25
+ hasName(name: string): boolean;
26
+ }
27
+ export { AIElement, AIElementJson };