@sun-asterisk/sungen 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/bin/sungen.js +12 -0
  4. package/dist/cli/commands/auto-tag-command.d.ts +8 -0
  5. package/dist/cli/commands/auto-tag-command.d.ts.map +1 -0
  6. package/dist/cli/commands/auto-tag-command.js +104 -0
  7. package/dist/cli/commands/auto-tag-command.js.map +1 -0
  8. package/dist/cli/index.d.ts +7 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +196 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/config/ai-providers.yaml +56 -0
  13. package/dist/config/config-loader.d.ts +51 -0
  14. package/dist/config/config-loader.d.ts.map +1 -0
  15. package/dist/config/config-loader.js +216 -0
  16. package/dist/config/config-loader.js.map +1 -0
  17. package/dist/config/config-schema.d.ts +121 -0
  18. package/dist/config/config-schema.d.ts.map +1 -0
  19. package/dist/config/config-schema.js +7 -0
  20. package/dist/config/config-schema.js.map +1 -0
  21. package/dist/config/default.config.yaml +101 -0
  22. package/dist/config/framework.config.yaml +52 -0
  23. package/dist/config/routes.yaml +31 -0
  24. package/dist/core/selector-base/annotation-handler.d.ts +45 -0
  25. package/dist/core/selector-base/annotation-handler.d.ts.map +1 -0
  26. package/dist/core/selector-base/annotation-handler.js +102 -0
  27. package/dist/core/selector-base/annotation-handler.js.map +1 -0
  28. package/dist/core/selector-base/base-generator.d.ts +49 -0
  29. package/dist/core/selector-base/base-generator.d.ts.map +1 -0
  30. package/dist/core/selector-base/base-generator.js +214 -0
  31. package/dist/core/selector-base/base-generator.js.map +1 -0
  32. package/dist/core/selector-base/gherkin-parser.d.ts +24 -0
  33. package/dist/core/selector-base/gherkin-parser.d.ts.map +1 -0
  34. package/dist/core/selector-base/gherkin-parser.js +42 -0
  35. package/dist/core/selector-base/gherkin-parser.js.map +1 -0
  36. package/dist/core/selector-mapper/priority-mapper.d.ts +74 -0
  37. package/dist/core/selector-mapper/priority-mapper.d.ts.map +1 -0
  38. package/dist/core/selector-mapper/priority-mapper.js +477 -0
  39. package/dist/core/selector-mapper/priority-mapper.js.map +1 -0
  40. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +91 -0
  41. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +1 -0
  42. package/dist/core/ui-scanner/heuristics/base-heuristic.js +175 -0
  43. package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +1 -0
  44. package/dist/core/ui-scanner/react-scanner.d.ts +32 -0
  45. package/dist/core/ui-scanner/react-scanner.d.ts.map +1 -0
  46. package/dist/core/ui-scanner/react-scanner.js +163 -0
  47. package/dist/core/ui-scanner/react-scanner.js.map +1 -0
  48. package/dist/core/ui-scanner/scanner-interface.d.ts +94 -0
  49. package/dist/core/ui-scanner/scanner-interface.d.ts.map +1 -0
  50. package/dist/core/ui-scanner/scanner-interface.js +33 -0
  51. package/dist/core/ui-scanner/scanner-interface.js.map +1 -0
  52. package/dist/core/ui-scanner/strict-scanner.d.ts +81 -0
  53. package/dist/core/ui-scanner/strict-scanner.d.ts.map +1 -0
  54. package/dist/core/ui-scanner/strict-scanner.js +511 -0
  55. package/dist/core/ui-scanner/strict-scanner.js.map +1 -0
  56. package/dist/executor/playwright/playwright-generator.d.ts +33 -0
  57. package/dist/executor/playwright/playwright-generator.d.ts.map +1 -0
  58. package/dist/executor/playwright/playwright-generator.js +136 -0
  59. package/dist/executor/playwright/playwright-generator.js.map +1 -0
  60. package/dist/executor/test-generator.d.ts +63 -0
  61. package/dist/executor/test-generator.d.ts.map +1 -0
  62. package/dist/executor/test-generator.js +30 -0
  63. package/dist/executor/test-generator.js.map +1 -0
  64. package/dist/external/ai-provider.d.ts +60 -0
  65. package/dist/external/ai-provider.d.ts.map +1 -0
  66. package/dist/external/ai-provider.js +30 -0
  67. package/dist/external/ai-provider.js.map +1 -0
  68. package/dist/external/anthropic-provider.d.ts +29 -0
  69. package/dist/external/anthropic-provider.d.ts.map +1 -0
  70. package/dist/external/anthropic-provider.js +85 -0
  71. package/dist/external/anthropic-provider.js.map +1 -0
  72. package/dist/generators/cache/cache-manager.d.ts +66 -0
  73. package/dist/generators/cache/cache-manager.d.ts.map +1 -0
  74. package/dist/generators/cache/cache-manager.js +286 -0
  75. package/dist/generators/cache/cache-manager.js.map +1 -0
  76. package/dist/generators/cli.d.ts +7 -0
  77. package/dist/generators/cli.d.ts.map +1 -0
  78. package/dist/generators/cli.js +570 -0
  79. package/dist/generators/cli.js.map +1 -0
  80. package/dist/generators/dsl-writer/index.d.ts +33 -0
  81. package/dist/generators/dsl-writer/index.d.ts.map +1 -0
  82. package/dist/generators/dsl-writer/index.js +226 -0
  83. package/dist/generators/dsl-writer/index.js.map +1 -0
  84. package/dist/generators/gherkin-parser/index.d.ts +47 -0
  85. package/dist/generators/gherkin-parser/index.d.ts.map +1 -0
  86. package/dist/generators/gherkin-parser/index.js +149 -0
  87. package/dist/generators/gherkin-parser/index.js.map +1 -0
  88. package/dist/generators/gherkin-parser/selector-extractor.d.ts +37 -0
  89. package/dist/generators/gherkin-parser/selector-extractor.d.ts.map +1 -0
  90. package/dist/generators/gherkin-parser/selector-extractor.js +108 -0
  91. package/dist/generators/gherkin-parser/selector-extractor.js.map +1 -0
  92. package/dist/generators/scaffold-generator/index.d.ts +111 -0
  93. package/dist/generators/scaffold-generator/index.d.ts.map +1 -0
  94. package/dist/generators/scaffold-generator/index.js +408 -0
  95. package/dist/generators/scaffold-generator/index.js.map +1 -0
  96. package/dist/generators/selector-mapper/ai-mapper.d.ts +56 -0
  97. package/dist/generators/selector-mapper/ai-mapper.d.ts.map +1 -0
  98. package/dist/generators/selector-mapper/ai-mapper.js +457 -0
  99. package/dist/generators/selector-mapper/ai-mapper.js.map +1 -0
  100. package/dist/generators/selector-mapper/hybrid-mapper.d.ts +67 -0
  101. package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +1 -0
  102. package/dist/generators/selector-mapper/hybrid-mapper.js +349 -0
  103. package/dist/generators/selector-mapper/hybrid-mapper.js.map +1 -0
  104. package/dist/generators/selector-mapper/index.d.ts +8 -0
  105. package/dist/generators/selector-mapper/index.d.ts.map +1 -0
  106. package/dist/generators/selector-mapper/index.js +12 -0
  107. package/dist/generators/selector-mapper/index.js.map +1 -0
  108. package/dist/generators/selector-mapper/intelligent-mapper.d.ts +125 -0
  109. package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +1 -0
  110. package/dist/generators/selector-mapper/intelligent-mapper.js +391 -0
  111. package/dist/generators/selector-mapper/intelligent-mapper.js.map +1 -0
  112. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +49 -0
  113. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -0
  114. package/dist/generators/test-generator/adapters/adapter-interface.js +7 -0
  115. package/dist/generators/test-generator/adapters/adapter-interface.js.map +1 -0
  116. package/dist/generators/test-generator/adapters/adapter-registry.d.ts +29 -0
  117. package/dist/generators/test-generator/adapters/adapter-registry.d.ts.map +1 -0
  118. package/dist/generators/test-generator/adapters/adapter-registry.js +50 -0
  119. package/dist/generators/test-generator/adapters/adapter-registry.js.map +1 -0
  120. package/dist/generators/test-generator/adapters/index.d.ts +4 -0
  121. package/dist/generators/test-generator/adapters/index.d.ts.map +1 -0
  122. package/dist/generators/test-generator/adapters/index.js +13 -0
  123. package/dist/generators/test-generator/adapters/index.js.map +1 -0
  124. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +23 -0
  125. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -0
  126. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js +38 -0
  127. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -0
  128. package/dist/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
  129. package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
  130. package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
  131. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
  132. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
  133. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
  134. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
  135. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
  136. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
  137. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
  138. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
  139. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
  140. package/dist/generators/test-generator/adapters/playwright/templates/steps/active-state-assertion.hbs +2 -0
  141. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-selector.hbs +5 -0
  142. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-simple.hbs +1 -0
  143. package/dist/generators/test-generator/adapters/playwright/templates/steps/application-running.hbs +1 -0
  144. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
  145. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
  146. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
  147. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
  148. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
  149. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
  150. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
  151. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
  152. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
  153. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
  154. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
  155. package/dist/generators/test-generator/adapters/playwright/templates/steps/check-action.hbs +1 -0
  156. package/dist/generators/test-generator/adapters/playwright/templates/steps/checkbox.hbs +2 -0
  157. package/dist/generators/test-generator/adapters/playwright/templates/steps/checked-assertion.hbs +1 -0
  158. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-action.hbs +1 -0
  159. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-auth.hbs +6 -0
  160. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-browser-state.hbs +6 -0
  161. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-database.hbs +4 -0
  162. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear.hbs +2 -0
  163. package/dist/generators/test-generator/adapters/playwright/templates/steps/click-action.hbs +1 -0
  164. package/dist/generators/test-generator/adapters/playwright/templates/steps/click.hbs +2 -0
  165. package/dist/generators/test-generator/adapters/playwright/templates/steps/contain-text-assertion.hbs +1 -0
  166. package/dist/generators/test-generator/adapters/playwright/templates/steps/contains-text-assertion.hbs +2 -0
  167. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-assertion.hbs +1 -0
  168. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-greater-than.hbs +3 -0
  169. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-less-than.hbs +3 -0
  170. package/dist/generators/test-generator/adapters/playwright/templates/steps/disabled-assertion.hbs +2 -0
  171. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-containing-text.hbs +3 -0
  172. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-with-text.hbs +3 -0
  173. package/dist/generators/test-generator/adapters/playwright/templates/steps/double-click-action.hbs +1 -0
  174. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion-advanced.hbs +3 -0
  175. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion.hbs +2 -0
  176. package/dist/generators/test-generator/adapters/playwright/templates/steps/enabled-assertion.hbs +2 -0
  177. package/dist/generators/test-generator/adapters/playwright/templates/steps/error-message-assertion.hbs +3 -0
  178. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill-action.hbs +1 -0
  179. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill.hbs +2 -0
  180. package/dist/generators/test-generator/adapters/playwright/templates/steps/focused-assertion.hbs +1 -0
  181. package/dist/generators/test-generator/adapters/playwright/templates/steps/generic-message-assertion.hbs +3 -0
  182. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-attribute.hbs +2 -0
  183. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-class.hbs +2 -0
  184. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-count.hbs +2 -0
  185. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-image-src.hbs +3 -0
  186. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-link.hbs +3 -0
  187. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-placeholder.hbs +3 -0
  188. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-value.hbs +2 -0
  189. package/dist/generators/test-generator/adapters/playwright/templates/steps/have-text-assertion.hbs +1 -0
  190. package/dist/generators/test-generator/adapters/playwright/templates/steps/hover-action.hbs +1 -0
  191. package/dist/generators/test-generator/adapters/playwright/templates/steps/html5-validation-check.hbs +4 -0
  192. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-checked.hbs +2 -0
  193. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-editable.hbs +2 -0
  194. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-focused.hbs +2 -0
  195. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-hidden.hbs +2 -0
  196. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-unchecked.hbs +2 -0
  197. package/dist/generators/test-generator/adapters/playwright/templates/steps/locator.hbs +1 -0
  198. package/dist/generators/test-generator/adapters/playwright/templates/steps/login.hbs +8 -0
  199. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-body.hbs +1 -0
  200. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-selector.hbs +2 -0
  201. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-count-assertion.hbs +3 -0
  202. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
  203. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
  204. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
  205. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
  206. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation.hbs +1 -0
  207. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-checked-assertion.hbs +1 -0
  208. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible-assertion.hbs +1 -0
  209. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible.hbs +2 -0
  210. package/dist/generators/test-generator/adapters/playwright/templates/steps/notification-assertion.hbs +4 -0
  211. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
  212. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-action.hbs +1 -0
  213. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-enter.hbs +2 -0
  214. package/dist/generators/test-generator/adapters/playwright/templates/steps/redirect-assertion.hbs +3 -0
  215. package/dist/generators/test-generator/adapters/playwright/templates/steps/route-assertion.hbs +2 -0
  216. package/dist/generators/test-generator/adapters/playwright/templates/steps/screen-navigation.hbs +3 -0
  217. package/dist/generators/test-generator/adapters/playwright/templates/steps/scroll-bottom-assertion.hbs +5 -0
  218. package/dist/generators/test-generator/adapters/playwright/templates/steps/select-action.hbs +1 -0
  219. package/dist/generators/test-generator/adapters/playwright/templates/steps/select.hbs +2 -0
  220. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
  221. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
  222. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
  223. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
  224. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
  225. package/dist/generators/test-generator/adapters/playwright/templates/steps/text-matches-pattern.hbs +3 -0
  226. package/dist/generators/test-generator/adapters/playwright/templates/steps/uncheck-action.hbs +1 -0
  227. package/dist/generators/test-generator/adapters/playwright/templates/steps/user-login-todo.hbs +6 -0
  228. package/dist/generators/test-generator/adapters/playwright/templates/steps/visibility-assertion.hbs +2 -0
  229. package/dist/generators/test-generator/adapters/playwright/templates/steps/visible-assertion.hbs +1 -0
  230. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-for-element.hbs +1 -0
  231. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-timeout.hbs +1 -0
  232. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait.hbs +1 -0
  233. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
  234. package/dist/generators/test-generator/ai-step-mapper.d.ts +27 -0
  235. package/dist/generators/test-generator/ai-step-mapper.d.ts.map +1 -0
  236. package/dist/generators/test-generator/ai-step-mapper.js +204 -0
  237. package/dist/generators/test-generator/ai-step-mapper.js.map +1 -0
  238. package/dist/generators/test-generator/code-generator.d.ts +52 -0
  239. package/dist/generators/test-generator/code-generator.d.ts.map +1 -0
  240. package/dist/generators/test-generator/code-generator.js +191 -0
  241. package/dist/generators/test-generator/code-generator.js.map +1 -0
  242. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts +7 -0
  243. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -0
  244. package/dist/generators/test-generator/patterns/assertion-patterns.js +173 -0
  245. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -0
  246. package/dist/generators/test-generator/patterns/form-patterns.d.ts +8 -0
  247. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -0
  248. package/dist/generators/test-generator/patterns/form-patterns.js +110 -0
  249. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -0
  250. package/dist/generators/test-generator/patterns/index.d.ts +45 -0
  251. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -0
  252. package/dist/generators/test-generator/patterns/index.js +106 -0
  253. package/dist/generators/test-generator/patterns/index.js.map +1 -0
  254. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +7 -0
  255. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -0
  256. package/dist/generators/test-generator/patterns/interaction-patterns.js +100 -0
  257. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -0
  258. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +8 -0
  259. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -0
  260. package/dist/generators/test-generator/patterns/navigation-patterns.js +92 -0
  261. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -0
  262. package/dist/generators/test-generator/patterns/setup-patterns.d.ts +7 -0
  263. package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -0
  264. package/dist/generators/test-generator/patterns/setup-patterns.js +84 -0
  265. package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -0
  266. package/dist/generators/test-generator/patterns/types.d.ts +38 -0
  267. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -0
  268. package/dist/generators/test-generator/patterns/types.js +3 -0
  269. package/dist/generators/test-generator/patterns/types.js.map +1 -0
  270. package/dist/generators/test-generator/step-mapper-old.d.ts +180 -0
  271. package/dist/generators/test-generator/step-mapper-old.d.ts.map +1 -0
  272. package/dist/generators/test-generator/step-mapper-old.js +752 -0
  273. package/dist/generators/test-generator/step-mapper-old.js.map +1 -0
  274. package/dist/generators/test-generator/step-mapper-refactored.d.ts +47 -0
  275. package/dist/generators/test-generator/step-mapper-refactored.d.ts.map +1 -0
  276. package/dist/generators/test-generator/step-mapper-refactored.js +182 -0
  277. package/dist/generators/test-generator/step-mapper-refactored.js.map +1 -0
  278. package/dist/generators/test-generator/step-mapper.d.ts +66 -0
  279. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -0
  280. package/dist/generators/test-generator/step-mapper.js +248 -0
  281. package/dist/generators/test-generator/step-mapper.js.map +1 -0
  282. package/dist/generators/test-generator/template-engine.d.ts +33 -0
  283. package/dist/generators/test-generator/template-engine.d.ts.map +1 -0
  284. package/dist/generators/test-generator/template-engine.js +129 -0
  285. package/dist/generators/test-generator/template-engine.js.map +1 -0
  286. package/dist/generators/test-generator/utils/data-resolver.d.ts +39 -0
  287. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -0
  288. package/dist/generators/test-generator/utils/data-resolver.js +162 -0
  289. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -0
  290. package/dist/generators/test-generator/utils/path-inference.d.ts +49 -0
  291. package/dist/generators/test-generator/utils/path-inference.d.ts.map +1 -0
  292. package/dist/generators/test-generator/utils/path-inference.js +286 -0
  293. package/dist/generators/test-generator/utils/path-inference.js.map +1 -0
  294. package/dist/generators/test-generator/utils/selector-resolver.d.ts +93 -0
  295. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -0
  296. package/dist/generators/test-generator/utils/selector-resolver.js +408 -0
  297. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -0
  298. package/dist/generators/types.d.ts +118 -0
  299. package/dist/generators/types.d.ts.map +1 -0
  300. package/dist/generators/types.js +48 -0
  301. package/dist/generators/types.js.map +1 -0
  302. package/dist/generators/ui-model-builder/deep-scanner.d.ts +121 -0
  303. package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +1 -0
  304. package/dist/generators/ui-model-builder/deep-scanner.js +1113 -0
  305. package/dist/generators/ui-model-builder/deep-scanner.js.map +1 -0
  306. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +110 -0
  307. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +1 -0
  308. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +608 -0
  309. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +1 -0
  310. package/dist/generators/ui-model-builder/react-scanner.d.ts +107 -0
  311. package/dist/generators/ui-model-builder/react-scanner.d.ts.map +1 -0
  312. package/dist/generators/ui-model-builder/react-scanner.js +797 -0
  313. package/dist/generators/ui-model-builder/react-scanner.js.map +1 -0
  314. package/dist/input/cli-adapter.d.ts +63 -0
  315. package/dist/input/cli-adapter.d.ts.map +1 -0
  316. package/dist/input/cli-adapter.js +173 -0
  317. package/dist/input/cli-adapter.js.map +1 -0
  318. package/dist/input/config-adapter.d.ts +25 -0
  319. package/dist/input/config-adapter.d.ts.map +1 -0
  320. package/dist/input/config-adapter.js +70 -0
  321. package/dist/input/config-adapter.js.map +1 -0
  322. package/dist/input/input-adapter.d.ts +28 -0
  323. package/dist/input/input-adapter.d.ts.map +1 -0
  324. package/dist/input/input-adapter.js +17 -0
  325. package/dist/input/input-adapter.js.map +1 -0
  326. package/dist/input/vscode-adapter.d.ts +62 -0
  327. package/dist/input/vscode-adapter.d.ts.map +1 -0
  328. package/dist/input/vscode-adapter.js +64 -0
  329. package/dist/input/vscode-adapter.js.map +1 -0
  330. package/dist/orchestrator/cache-manager.d.ts +37 -0
  331. package/dist/orchestrator/cache-manager.d.ts.map +1 -0
  332. package/dist/orchestrator/cache-manager.js +148 -0
  333. package/dist/orchestrator/cache-manager.js.map +1 -0
  334. package/dist/orchestrator/pipeline.d.ts +73 -0
  335. package/dist/orchestrator/pipeline.d.ts.map +1 -0
  336. package/dist/orchestrator/pipeline.js +607 -0
  337. package/dist/orchestrator/pipeline.js.map +1 -0
  338. package/dist/orchestrator/project-initializer.d.ts +51 -0
  339. package/dist/orchestrator/project-initializer.d.ts.map +1 -0
  340. package/dist/orchestrator/project-initializer.js +326 -0
  341. package/dist/orchestrator/project-initializer.js.map +1 -0
  342. package/dist/orchestrator/reporter.d.ts +15 -0
  343. package/dist/orchestrator/reporter.d.ts.map +1 -0
  344. package/dist/orchestrator/reporter.js +30 -0
  345. package/dist/orchestrator/reporter.js.map +1 -0
  346. package/dist/orchestrator/screen-manager.d.ts +47 -0
  347. package/dist/orchestrator/screen-manager.d.ts.map +1 -0
  348. package/dist/orchestrator/screen-manager.js +271 -0
  349. package/dist/orchestrator/screen-manager.js.map +1 -0
  350. package/dist/tools/auto-tagger.d.ts +107 -0
  351. package/dist/tools/auto-tagger.d.ts.map +1 -0
  352. package/dist/tools/auto-tagger.js +502 -0
  353. package/dist/tools/auto-tagger.js.map +1 -0
  354. package/package.json +73 -0
  355. package/src/cli/commands/auto-tag-command.ts +80 -0
  356. package/src/cli/index.ts +205 -0
  357. package/src/config/ai-providers.yaml +56 -0
  358. package/src/config/config-loader.ts +248 -0
  359. package/src/config/config-schema.ts +148 -0
  360. package/src/config/default.config.yaml +101 -0
  361. package/src/config/framework.config.yaml +52 -0
  362. package/src/config/routes.yaml +31 -0
  363. package/src/core/selector-base/annotation-handler.ts +127 -0
  364. package/src/core/selector-base/base-generator.ts +234 -0
  365. package/src/core/selector-base/gherkin-parser.ts +57 -0
  366. package/src/core/selector-mapper/priority-mapper.ts +607 -0
  367. package/src/core/ui-scanner/heuristics/base-heuristic.ts +216 -0
  368. package/src/core/ui-scanner/react-scanner.ts +156 -0
  369. package/src/core/ui-scanner/scanner-interface.ts +133 -0
  370. package/src/core/ui-scanner/strict-scanner.ts +629 -0
  371. package/src/executor/playwright/playwright-generator.ts +125 -0
  372. package/src/executor/test-generator.ts +90 -0
  373. package/src/external/ai-provider.ts +90 -0
  374. package/src/external/anthropic-provider.ts +114 -0
  375. package/src/generators/README.md +410 -0
  376. package/src/generators/cache/cache-manager.ts +322 -0
  377. package/src/generators/cli.ts +640 -0
  378. package/src/generators/dsl-writer/index.ts +253 -0
  379. package/src/generators/gherkin-parser/index.ts +155 -0
  380. package/src/generators/gherkin-parser/selector-extractor.ts +142 -0
  381. package/src/generators/scaffold-generator/index.ts +524 -0
  382. package/src/generators/selector-mapper/ai-mapper.ts +528 -0
  383. package/src/generators/selector-mapper/hybrid-mapper.ts +427 -0
  384. package/src/generators/selector-mapper/index.ts +10 -0
  385. package/src/generators/selector-mapper/intelligent-mapper.ts +530 -0
  386. package/src/generators/test-generator/adapters/adapter-interface.ts +49 -0
  387. package/src/generators/test-generator/adapters/adapter-registry.ts +56 -0
  388. package/src/generators/test-generator/adapters/index.ts +9 -0
  389. package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +40 -0
  390. package/src/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
  391. package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
  392. package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
  393. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
  394. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
  395. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
  396. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
  397. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
  398. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
  399. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
  400. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
  401. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
  402. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
  403. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
  404. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
  405. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
  406. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
  407. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
  408. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
  409. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
  410. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
  411. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
  412. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
  413. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
  414. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
  415. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
  416. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
  417. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
  418. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
  419. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
  420. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
  421. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
  422. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
  423. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
  424. package/src/generators/test-generator/ai-step-mapper.ts +224 -0
  425. package/src/generators/test-generator/code-generator.ts +235 -0
  426. package/src/generators/test-generator/patterns/assertion-patterns.ts +183 -0
  427. package/src/generators/test-generator/patterns/form-patterns.ts +124 -0
  428. package/src/generators/test-generator/patterns/index.ts +97 -0
  429. package/src/generators/test-generator/patterns/interaction-patterns.ts +119 -0
  430. package/src/generators/test-generator/patterns/navigation-patterns.ts +110 -0
  431. package/src/generators/test-generator/patterns/setup-patterns.ts +94 -0
  432. package/src/generators/test-generator/patterns/types.ts +41 -0
  433. package/src/generators/test-generator/step-mapper.ts +254 -0
  434. package/src/generators/test-generator/template-engine.ts +160 -0
  435. package/src/generators/test-generator/utils/data-resolver.ts +147 -0
  436. package/src/generators/test-generator/utils/path-inference.ts +344 -0
  437. package/src/generators/test-generator/utils/selector-resolver.ts +480 -0
  438. package/src/generators/types.ts +226 -0
  439. package/src/generators/ui-model-builder/deep-scanner.ts +1244 -0
  440. package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +731 -0
  441. package/src/generators/ui-model-builder/react-scanner.ts +959 -0
  442. package/src/input/cli-adapter.ts +185 -0
  443. package/src/input/config-adapter.ts +71 -0
  444. package/src/input/input-adapter.ts +32 -0
  445. package/src/input/vscode-adapter.ts +90 -0
  446. package/src/orchestrator/cache-manager.ts +138 -0
  447. package/src/orchestrator/pipeline.ts +713 -0
  448. package/src/orchestrator/project-initializer.ts +315 -0
  449. package/src/orchestrator/reporter.ts +36 -0
  450. package/src/orchestrator/screen-manager.ts +268 -0
  451. package/src/tools/auto-tagger.ts +572 -0
@@ -0,0 +1,752 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StepMapper = void 0;
4
+ const ai_step_mapper_1 = require("./ai-step-mapper");
5
+ const template_engine_1 = require("./template-engine");
6
+ class StepMapper {
7
+ constructor(options = {}) {
8
+ this.stepCounter = 0;
9
+ this.aiMapper = null;
10
+ this.useAI = false;
11
+ this.verbose = false;
12
+ this.useAI = options.useAI ?? false;
13
+ this.verbose = options.verbose ?? false;
14
+ this.templateEngine = new template_engine_1.TemplateEngine();
15
+ // Initialize AI mapper if enabled
16
+ if (this.useAI) {
17
+ try {
18
+ this.aiMapper = new ai_step_mapper_1.AIStepMapper(this.verbose);
19
+ if (this.verbose) {
20
+ console.log(' [StepMapper] AI fallback enabled');
21
+ }
22
+ }
23
+ catch (error) {
24
+ console.warn('[StepMapper] AI mapper initialization failed:', error);
25
+ this.useAI = false;
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Map a Gherkin step to Playwright code
31
+ * Uses dictionary patterns first, falls back to AI if enabled
32
+ */
33
+ mapStep(step) {
34
+ this.stepCounter++;
35
+ const { keyword, text, selectorRef, dataRef, value } = step;
36
+ // Normalize keyword (And, But → use previous context, default to When)
37
+ const normalizedKeyword = ['Given', 'When', 'Then'].includes(keyword)
38
+ ? keyword
39
+ : 'When';
40
+ // Match step patterns
41
+ // Pattern: user navigates to [screen] or user navigates to route <route>
42
+ if ((text.includes('navigates to') || text.includes('is on')) && (selectorRef || dataRef)) {
43
+ const route = selectorRef || dataRef;
44
+ return this.mapNavigationStep(route);
45
+ }
46
+ if (text.includes('user is logged in as')) {
47
+ return this.mapLoginStep(dataRef);
48
+ }
49
+ // Pattern: [element] should be visible/displayed
50
+ if ((text.includes('should be visible') || text.includes('should be displayed')) && selectorRef) {
51
+ return this.mapVisibilityAssertionStep(selectorRef);
52
+ }
53
+ // Pattern: [element] should be enabled
54
+ if (text.includes('should be enabled') && selectorRef) {
55
+ return this.mapEnabledAssertion(selectorRef);
56
+ }
57
+ // Pattern: user fills [element] with value (with or without "the")
58
+ if (text.includes('fills') && selectorRef && (dataRef || value)) {
59
+ return this.mapFillStep(selectorRef, dataRef, value);
60
+ }
61
+ // Pattern: user clicks [element] (with or without "the")
62
+ if (text.includes('clicks') && selectorRef) {
63
+ return this.mapClickStep(selectorRef);
64
+ }
65
+ if (text.includes('user waits for')) {
66
+ return this.mapWaitStep(text);
67
+ }
68
+ // Pattern: user should see route OR user should remain on [screen]
69
+ if ((text.includes('should see route') || text.includes('should remain on')) && (selectorRef || dataRef)) {
70
+ const route = selectorRef || dataRef;
71
+ return this.mapRouteAssertionStep(route);
72
+ }
73
+ if (text.includes('user should see') && selectorRef) {
74
+ return this.mapVisibilityAssertionStep(selectorRef);
75
+ }
76
+ if (text.includes('error message') && text.includes('should')) {
77
+ return this.mapErrorMessageAssertion();
78
+ }
79
+ // Pattern: welcome/success/any message should be displayed
80
+ if (text.includes('message') && text.includes('should be displayed')) {
81
+ return this.mapGenericMessageAssertion(text);
82
+ }
83
+ if (text.includes('should see message') && value) {
84
+ return this.mapMessageAssertion(value, selectorRef);
85
+ }
86
+ if (text.includes('user should see') && text.includes('AI response')) {
87
+ return this.mapAIResponseAssertion(selectorRef);
88
+ }
89
+ if (text.includes('messages in') && selectorRef) {
90
+ return this.mapMessageCountAssertion(text, selectorRef);
91
+ }
92
+ // Pattern: user presses Enter in [element]
93
+ if (text.includes('user presses') && text.includes('Enter') && selectorRef) {
94
+ return this.mapPressEnterStep(selectorRef);
95
+ }
96
+ // Pattern: [element] should be empty
97
+ if (text.includes('should be empty') && selectorRef) {
98
+ return this.mapEmptyAssertion(selectorRef);
99
+ }
100
+ // Pattern: [element] should contain N messages
101
+ if (text.includes('should contain') && text.includes('messages') && selectorRef) {
102
+ return this.mapMessageCountAssertion(text, selectorRef);
103
+ }
104
+ // Pattern: [element] should be scrolled to bottom
105
+ if (text.includes('should be scrolled to bottom') && selectorRef) {
106
+ return this.mapScrollBottomAssertion(selectorRef);
107
+ }
108
+ // Pattern: [element] should be displayed with "text"
109
+ if (text.includes('should be displayed with') && selectorRef && value) {
110
+ return this.mapDisplayedWithTextAssertion(selectorRef, value);
111
+ }
112
+ // Pattern: [element] should contain "text" (alternative to above)
113
+ if (text.includes('should contain') && selectorRef && value && !text.includes('messages')) {
114
+ return this.mapDisplayedContainingTextAssertion(selectorRef, value);
115
+ }
116
+ // Pattern: [element] should have attribute "attr" with value "val"
117
+ if (text.includes('should have attribute') && selectorRef) {
118
+ const attrMatch = text.match(/attribute\s+['"]([\w-]+)['"]\s+with\s+(?:value\s+)?['"](.*?)['"]/);
119
+ if (attrMatch) {
120
+ return this.mapHasAttributeAssertion(selectorRef, attrMatch[1], attrMatch[2]);
121
+ }
122
+ }
123
+ // Pattern: [element] should have class "className"
124
+ if (text.includes('should have class') && selectorRef && value) {
125
+ return this.mapHasClassAssertion(selectorRef, value);
126
+ }
127
+ // Pattern: [element] should have value "value"
128
+ if (text.includes('should have value') && selectorRef && value) {
129
+ return this.mapHasValueAssertion(selectorRef, value);
130
+ }
131
+ // Pattern: [element] should be checked
132
+ if (text.includes('should be checked') && selectorRef) {
133
+ return this.mapIsCheckedAssertion(selectorRef);
134
+ }
135
+ // Pattern: [element] should not be checked / should be unchecked
136
+ if ((text.includes('should not be checked') || text.includes('should be unchecked')) && selectorRef) {
137
+ return this.mapIsUncheckedAssertion(selectorRef);
138
+ }
139
+ // Pattern: [element] should not be visible / should be hidden
140
+ if ((text.includes('should not be visible') || text.includes('should be hidden')) && selectorRef) {
141
+ return this.mapNotVisibleAssertion(selectorRef);
142
+ }
143
+ // Pattern: [element] should be focused
144
+ if (text.includes('should be focused') && selectorRef) {
145
+ return this.mapIsFocusedAssertion(selectorRef);
146
+ }
147
+ // Pattern: [element] should be editable
148
+ if (text.includes('should be editable') && selectorRef) {
149
+ return this.mapIsEditableAssertion(selectorRef);
150
+ }
151
+ // Pattern: [element] should have count N
152
+ if (text.includes('should have count') && selectorRef) {
153
+ const countMatch = text.match(/(\d+)/);
154
+ if (countMatch) {
155
+ return this.mapHasCountAssertion(selectorRef, parseInt(countMatch[1]));
156
+ }
157
+ }
158
+ // Pattern: user should see notification "text"
159
+ if (text.includes('user should see notification') && value) {
160
+ return this.mapNotificationAssertion(value);
161
+ }
162
+ // Pattern: [element] should be disabled
163
+ if (text.includes('should be disabled') && selectorRef) {
164
+ return this.mapDisabledAssertion(selectorRef);
165
+ }
166
+ // Pattern: user is not logged in
167
+ if (text.includes('user is not logged in')) {
168
+ return this.mapNotLoggedInStep();
169
+ }
170
+ // Pattern: user navigates to route <route>
171
+ if (text.includes('user navigates to route')) {
172
+ const route = selectorRef || dataRef;
173
+ return this.mapNavigationStep(route);
174
+ }
175
+ // Pattern: user should be redirected to [screen] or screen name
176
+ if (text.includes('should be redirected to')) {
177
+ // Can use selectorRef [screen] or extract from text
178
+ if (selectorRef) {
179
+ return this.mapRedirectAssertion(selectorRef);
180
+ }
181
+ else {
182
+ // Extract screen name from text like "redirected to the dashboard"
183
+ const screenMatch = text.match(/redirected to (?:the )?(\w+)/);
184
+ if (screenMatch) {
185
+ return this.mapRedirectAssertion(screenMatch[1]);
186
+ }
187
+ }
188
+ }
189
+ // Pattern: [element] should contain text "..."
190
+ if (text.includes('should contain text') && selectorRef && value) {
191
+ return this.mapContainsTextAssertion(selectorRef, value);
192
+ }
193
+ // Pattern: HTML5 validation is disabled
194
+ if (text.includes('HTML5 validation is disabled')) {
195
+ return this.mapHTML5ValidationCheck();
196
+ }
197
+ // ========================================
198
+ // NEW PATTERNS - Admin Dashboard Support
199
+ // ========================================
200
+ // Pattern: user selects [element] with "value"
201
+ if (text.includes('user selects') && selectorRef && (dataRef || value)) {
202
+ return this.mapSelectStep(selectorRef, dataRef, value);
203
+ }
204
+ // Pattern: user checks [element] checkbox
205
+ if (text.includes('user checks') && text.includes('checkbox') && selectorRef) {
206
+ return this.mapCheckboxStep(selectorRef, true);
207
+ }
208
+ // Pattern: user unchecks [element] checkbox
209
+ if (text.includes('user unchecks') && text.includes('checkbox') && selectorRef) {
210
+ return this.mapCheckboxStep(selectorRef, false);
211
+ }
212
+ // Pattern: user clears [element]
213
+ if (text.includes('user clears') && selectorRef) {
214
+ return this.mapClearStep(selectorRef);
215
+ }
216
+ // Pattern: [element] should be active
217
+ if (text.includes('should be active') && selectorRef) {
218
+ return this.mapActiveStateAssertion(selectorRef);
219
+ }
220
+ // Pattern: I am on the "screen-name" screen
221
+ if (text.includes('I am on the') && text.includes('screen')) {
222
+ // Extract screen name from quotes
223
+ const screenMatch = text.match(/"([^"]+)"/);
224
+ if (screenMatch) {
225
+ return this.mapScreenNavigationStep(screenMatch[1]);
226
+ }
227
+ }
228
+ // Fallback: Use AI if enabled, otherwise TODO
229
+ if (this.useAI && this.aiMapper) {
230
+ if (this.verbose) {
231
+ console.log(` [Dictionary] No match for: "${text}" - falling back to AI`);
232
+ }
233
+ return this.aiMapper.mapStep(step); // Returns Promise<MappedStep>
234
+ }
235
+ // Final fallback: TODO comment
236
+ return {
237
+ code: `// TODO: Implement step: ${text}`,
238
+ comment: `Unrecognized step pattern (AI fallback disabled)`,
239
+ };
240
+ }
241
+ mapNavigationStep(route) {
242
+ // Extract route name from data ref <auth-login> or legacy selector ref [auth-login]
243
+ const routeName = route ? route.replace(/[<>\[\]]/g, '') : '';
244
+ // Use route loader to get actual path
245
+ // For now, use simple conversion (will be improved in Phase 2)
246
+ const routePath = this.selectorToRoutePath(routeName);
247
+ return {
248
+ code: this.templateEngine.renderStep('navigation', { routePath }),
249
+ comment: `Navigate to ${routeName}`,
250
+ };
251
+ }
252
+ mapLoginStep(userDataRef) {
253
+ // Parse data ref like "valid_user" from <valid_user>
254
+ const userKey = userDataRef.split('.')[0];
255
+ return {
256
+ code: this.templateEngine.renderStep('login', { userKey }),
257
+ imports: ['getUser'],
258
+ };
259
+ }
260
+ mapFillStep(selectorRef, dataRef, value) {
261
+ const screenId = this.extractScreenId(selectorRef);
262
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
263
+ const fillValue = dataRef
264
+ ? this.resolveDataRef(dataRef)
265
+ : `'${value}'`;
266
+ return {
267
+ code: this.templateEngine.renderStep('fill', { varName, selectorRef, screenId, fillValue }),
268
+ comment: `Fill ${selectorRef}`,
269
+ };
270
+ }
271
+ mapClickStep(selectorRef) {
272
+ const screenId = this.extractScreenId(selectorRef);
273
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
274
+ return {
275
+ code: this.templateEngine.renderStep('click', { varName, selectorRef, screenId }),
276
+ comment: `Click ${selectorRef}`,
277
+ };
278
+ }
279
+ mapWaitStep(text) {
280
+ const duration = text.includes('AI response') ? 2000 : 1000;
281
+ return {
282
+ code: this.templateEngine.renderStep('wait', { duration }),
283
+ };
284
+ }
285
+ mapRouteAssertionStep(route) {
286
+ const routePath = this.selectorToRoutePath(route);
287
+ return {
288
+ code: this.templateEngine.renderStep('route-assertion', { routePath }),
289
+ comment: `Assert route is ${route}`,
290
+ };
291
+ }
292
+ mapVisibilityAssertionStep(selectorRef) {
293
+ const screenId = this.extractScreenId(selectorRef);
294
+ // Generate unique variable name from selector ref + counter
295
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
296
+ return {
297
+ code: this.templateEngine.renderStep('visibility-assertion', { varName, selectorRef, screenId }),
298
+ comment: `Assert ${selectorRef} is visible`,
299
+ };
300
+ }
301
+ mapErrorMessageAssertion() {
302
+ return {
303
+ code: this.templateEngine.renderStep('error-message-assertion', {}),
304
+ comment: 'Assert error message is shown',
305
+ };
306
+ }
307
+ mapMessageAssertion(message, selectorRef) {
308
+ if (selectorRef) {
309
+ const screenId = this.extractScreenId(selectorRef);
310
+ const varName = 'msgContainer_' + selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
311
+ return {
312
+ code: this.templateEngine.renderStep('message-assertion-selector', { varName, selectorRef, screenId, message }),
313
+ };
314
+ }
315
+ return {
316
+ code: this.templateEngine.renderStep('message-assertion-body', { message }),
317
+ };
318
+ }
319
+ mapGenericMessageAssertion(text) {
320
+ // Extract message type (welcome, error, success, etc.)
321
+ const typeMatch = text.match(/(\w+)\s+message/);
322
+ const messageType = typeMatch ? typeMatch[1] : 'message';
323
+ return {
324
+ code: this.templateEngine.renderStep('generic-message-assertion', { messageType }),
325
+ comment: `Assert ${messageType} message is displayed`,
326
+ };
327
+ }
328
+ mapAIResponseAssertion(selectorRef) {
329
+ if (selectorRef) {
330
+ const screenId = this.extractScreenId(selectorRef);
331
+ const containerVar = 'aiRespContainer_' + selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
332
+ const messagesVar = 'aiMessages_' + selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
333
+ return {
334
+ code: this.templateEngine.renderStep('ai-response-assertion-selector', { containerVar, messagesVar, selectorRef, screenId }),
335
+ };
336
+ }
337
+ return {
338
+ code: this.templateEngine.renderStep('ai-response-assertion-simple', {}),
339
+ };
340
+ }
341
+ mapMessageCountAssertion(text, selectorRef) {
342
+ const countMatch = text.match(/(\d+)/);
343
+ const expectedCount = countMatch ? parseInt(countMatch[1]) : 1;
344
+ const messageType = text.includes('user messages') ? 'user' : 'AI';
345
+ const screenId = this.extractScreenId(selectorRef);
346
+ const containerVar = 'msgCountContainer_' + selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
347
+ const messagesVar = `${messageType}Messages_${selectorRef.replace(/[^a-zA-Z0-9]/g, '_')}_${this.stepCounter}`;
348
+ return {
349
+ code: this.templateEngine.renderStep('message-count-assertion', { containerVar, messagesVar, selectorRef, screenId, messageType, expectedCount }),
350
+ comment: `Assert ${expectedCount} ${messageType} messages`,
351
+ };
352
+ }
353
+ /**
354
+ * Extract screen ID from selector ref
355
+ * Example: auth-login.email → auth-login
356
+ */
357
+ extractScreenId(selectorRef) {
358
+ const parts = selectorRef.split('.');
359
+ return parts[0];
360
+ }
361
+ /**
362
+ * Resolve data reference to code
363
+ * Example: valid_user.email → user.email
364
+ */
365
+ resolveDataRef(dataRef) {
366
+ const parts = dataRef.split('.');
367
+ const userKey = parts[0];
368
+ const field = parts.slice(1).join('.');
369
+ return `user.${field}`;
370
+ }
371
+ /**
372
+ * Convert route name to route path
373
+ * Example: chat → /chat, auth-login → /auth/login, home → /
374
+ * Note: Route name should already be cleaned (no brackets/angle brackets)
375
+ */
376
+ selectorToRoutePath(routeName) {
377
+ // Handle null/undefined
378
+ if (!routeName) {
379
+ return '/';
380
+ }
381
+ // Special case: home → / (root)
382
+ if (routeName === 'home') {
383
+ return '/';
384
+ }
385
+ // Convert auth-login → /auth/login (replace ALL hyphens with slashes)
386
+ return '/' + routeName.replace(/-/g, '/');
387
+ }
388
+ /**
389
+ * Map "user presses Enter in [element]" step
390
+ */
391
+ mapPressEnterStep(selectorRef) {
392
+ const screenId = this.extractScreenId(selectorRef);
393
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
394
+ return {
395
+ code: this.templateEngine.renderStep('press-enter', { varName, selectorRef, screenId }),
396
+ comment: `Press Enter in ${selectorRef}`,
397
+ };
398
+ }
399
+ /**
400
+ * Map "[element] should be empty" step
401
+ */
402
+ mapEmptyAssertion(selectorRef) {
403
+ const screenId = this.extractScreenId(selectorRef);
404
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
405
+ return {
406
+ code: this.templateEngine.renderStep('empty-assertion-advanced', { varName, selectorRef, screenId }),
407
+ comment: `Assert ${selectorRef} is empty`,
408
+ };
409
+ }
410
+ /**
411
+ * Map "[element] should be scrolled to bottom" step
412
+ */
413
+ mapScrollBottomAssertion(selectorRef) {
414
+ const screenId = this.extractScreenId(selectorRef);
415
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
416
+ return {
417
+ code: this.templateEngine.renderStep('scroll-bottom-assertion', { varName, selectorRef, screenId }),
418
+ comment: `Assert ${selectorRef} scrolled to bottom`,
419
+ };
420
+ }
421
+ /**
422
+ * Map "user should see notification 'text'" step
423
+ */
424
+ mapNotificationAssertion(message) {
425
+ return {
426
+ code: this.templateEngine.renderStep('notification-assertion', { message }),
427
+ comment: `Assert notification: "${message}"`,
428
+ };
429
+ }
430
+ /**
431
+ * Map "[element] should be disabled" step
432
+ */
433
+ mapDisabledAssertion(selectorRef) {
434
+ const screenId = this.extractScreenId(selectorRef);
435
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
436
+ return {
437
+ code: this.templateEngine.renderStep('disabled-assertion', { varName, selectorRef, screenId }),
438
+ comment: `Assert ${selectorRef} is disabled`,
439
+ };
440
+ }
441
+ /**
442
+ * Map "[element] should be enabled" step
443
+ */
444
+ mapEnabledAssertion(selectorRef) {
445
+ const screenId = this.extractScreenId(selectorRef);
446
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
447
+ return {
448
+ code: this.templateEngine.renderStep('enabled-assertion', { varName, selectorRef, screenId }),
449
+ comment: `Assert ${selectorRef} is enabled`,
450
+ };
451
+ }
452
+ /**
453
+ * Map "user is not logged in" step
454
+ */
455
+ mapNotLoggedInStep() {
456
+ return {
457
+ code: this.templateEngine.renderStep('clear-auth', {}),
458
+ comment: 'Clear authentication',
459
+ };
460
+ }
461
+ /**
462
+ * Map "user should be redirected to [screen]" step
463
+ */
464
+ mapRedirectAssertion(selectorRef) {
465
+ // Extract screen from selector ref like [auth-login]
466
+ const screenName = selectorRef.split('.')[0];
467
+ const routePath = this.selectorToRoutePath(screenName);
468
+ return {
469
+ code: this.templateEngine.renderStep('redirect-assertion', { routePath }),
470
+ comment: `Assert redirected to ${screenName}`,
471
+ };
472
+ }
473
+ /**
474
+ * Map "[element] should contain text '...'" step
475
+ */
476
+ mapContainsTextAssertion(selectorRef, expectedText) {
477
+ const screenId = this.extractScreenId(selectorRef);
478
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
479
+ return {
480
+ code: this.templateEngine.renderStep('contains-text-assertion', { varName, selectorRef, screenId, expectedText }),
481
+ comment: `Assert ${selectorRef} contains "${expectedText}"`,
482
+ };
483
+ }
484
+ /**
485
+ * Map "HTML5 validation is disabled" step
486
+ */
487
+ mapHTML5ValidationCheck() {
488
+ return {
489
+ code: this.templateEngine.renderStep('html5-validation-check', {}),
490
+ comment: 'Assert HTML5 validation disabled',
491
+ };
492
+ }
493
+ // ========================================
494
+ // NEW METHODS - Admin Dashboard Support
495
+ // ========================================
496
+ /**
497
+ * Map "user selects [element] with 'value'" step
498
+ * Handles dropdown/select elements
499
+ */
500
+ mapSelectStep(selectorRef, dataRef, value) {
501
+ const screenId = this.extractScreenId(selectorRef);
502
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
503
+ const selectValue = dataRef
504
+ ? this.resolveDataRef(dataRef)
505
+ : `'${value}'`;
506
+ return {
507
+ code: this.templateEngine.renderStep('select', { varName, selectorRef, screenId, selectValue }),
508
+ comment: `Select ${value || dataRef} from ${selectorRef}`,
509
+ };
510
+ }
511
+ /**
512
+ * Map "user checks/unchecks [element] checkbox" step
513
+ */
514
+ mapCheckboxStep(selectorRef, checked) {
515
+ const screenId = this.extractScreenId(selectorRef);
516
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
517
+ const action = checked ? 'check' : 'uncheck';
518
+ return {
519
+ code: this.templateEngine.renderStep('checkbox', { varName, selectorRef, screenId, action }),
520
+ comment: `${checked ? 'Check' : 'Uncheck'} ${selectorRef}`,
521
+ };
522
+ }
523
+ /**
524
+ * Map "user clears [element]" step
525
+ */
526
+ mapClearStep(selectorRef) {
527
+ const screenId = this.extractScreenId(selectorRef);
528
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
529
+ return {
530
+ code: this.templateEngine.renderStep('clear', { varName, selectorRef, screenId }),
531
+ comment: `Clear ${selectorRef}`,
532
+ };
533
+ }
534
+ /**
535
+ * Map "[element] should be active" step
536
+ * Checks for aria-selected="true" or active class
537
+ */
538
+ mapActiveStateAssertion(selectorRef) {
539
+ const screenId = this.extractScreenId(selectorRef);
540
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
541
+ return {
542
+ code: this.templateEngine.renderStep('active-state-assertion', { varName, selectorRef, screenId }),
543
+ comment: `Assert ${selectorRef} is active`,
544
+ };
545
+ }
546
+ /**
547
+ * Map "I am on the 'screen-name' screen" step
548
+ * Navigation to a specific screen
549
+ */
550
+ mapScreenNavigationStep(screenName) {
551
+ const routePath = this.selectorToRoutePath(screenName);
552
+ return {
553
+ code: this.templateEngine.renderStep('screen-navigation', { screenName, routePath }),
554
+ comment: `Navigate to ${screenName}`,
555
+ };
556
+ }
557
+ // ========================================
558
+ // ASSERTION METHODS - Display & Content
559
+ // ========================================
560
+ /**
561
+ * Map "[element] should be displayed with 'text'" step
562
+ * Checks both visibility and exact text match
563
+ */
564
+ mapDisplayedWithTextAssertion(selectorRef, expectedText) {
565
+ const screenId = this.extractScreenId(selectorRef);
566
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
567
+ return {
568
+ code: this.templateEngine.renderStep('displayed-with-text', { varName, selectorRef, screenId, expectedText }),
569
+ comment: `Assert ${selectorRef} is displayed with "${expectedText}"`,
570
+ };
571
+ }
572
+ /**
573
+ * Map "[element] should contain 'text'" step
574
+ * Checks visibility and partial text match
575
+ */
576
+ mapDisplayedContainingTextAssertion(selectorRef, expectedText) {
577
+ const screenId = this.extractScreenId(selectorRef);
578
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
579
+ return {
580
+ code: this.templateEngine.renderStep('displayed-containing-text', { varName, selectorRef, screenId, expectedText }),
581
+ comment: `Assert ${selectorRef} contains "${expectedText}"`,
582
+ };
583
+ }
584
+ // ========================================
585
+ // ASSERTION METHODS - Attributes & Properties
586
+ // ========================================
587
+ /**
588
+ * Map "[element] should have attribute 'attr' with value 'val'" step
589
+ */
590
+ mapHasAttributeAssertion(selectorRef, attributeName, expectedValue) {
591
+ const screenId = this.extractScreenId(selectorRef);
592
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
593
+ return {
594
+ code: this.templateEngine.renderStep('has-attribute', { varName, selectorRef, screenId, attributeName, expectedValue }),
595
+ comment: `Assert ${selectorRef} has attribute ${attributeName}="${expectedValue}"`,
596
+ };
597
+ }
598
+ /**
599
+ * Map "[element] should have class 'className'" step
600
+ */
601
+ mapHasClassAssertion(selectorRef, className) {
602
+ const screenId = this.extractScreenId(selectorRef);
603
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
604
+ return {
605
+ code: this.templateEngine.renderStep('has-class', { varName, selectorRef, screenId, className }),
606
+ comment: `Assert ${selectorRef} has class "${className}"`,
607
+ };
608
+ }
609
+ /**
610
+ * Map "[element] should have value 'value'" step
611
+ */
612
+ mapHasValueAssertion(selectorRef, expectedValue) {
613
+ const screenId = this.extractScreenId(selectorRef);
614
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
615
+ return {
616
+ code: this.templateEngine.renderStep('has-value', { varName, selectorRef, screenId, expectedValue }),
617
+ comment: `Assert ${selectorRef} has value "${expectedValue}"`,
618
+ };
619
+ }
620
+ /**
621
+ * Map "[element] should have placeholder 'text'" step
622
+ */
623
+ mapHasPlaceholderAssertion(selectorRef, expectedPlaceholder) {
624
+ const screenId = this.extractScreenId(selectorRef);
625
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
626
+ return {
627
+ code: this.templateEngine.renderStep('has-placeholder', { varName, selectorRef, screenId, expectedPlaceholder }),
628
+ comment: `Assert ${selectorRef} has placeholder "${expectedPlaceholder}"`,
629
+ };
630
+ }
631
+ // ========================================
632
+ // ASSERTION METHODS - State Checks
633
+ // ========================================
634
+ /**
635
+ * Map "[element] should be checked" step
636
+ */
637
+ mapIsCheckedAssertion(selectorRef) {
638
+ const screenId = this.extractScreenId(selectorRef);
639
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
640
+ return {
641
+ code: this.templateEngine.renderStep('is-checked', { varName, selectorRef, screenId }),
642
+ comment: `Assert ${selectorRef} is checked`,
643
+ };
644
+ }
645
+ /**
646
+ * Map "[element] should be unchecked" step
647
+ */
648
+ mapIsUncheckedAssertion(selectorRef) {
649
+ const screenId = this.extractScreenId(selectorRef);
650
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
651
+ return {
652
+ code: this.templateEngine.renderStep('is-unchecked', { varName, selectorRef, screenId }),
653
+ comment: `Assert ${selectorRef} is unchecked`,
654
+ };
655
+ }
656
+ /**
657
+ * Map "[element] should not be visible" or "should be hidden" step
658
+ */
659
+ mapNotVisibleAssertion(selectorRef) {
660
+ const screenId = this.extractScreenId(selectorRef);
661
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
662
+ return {
663
+ code: this.templateEngine.renderStep('not-visible', { varName, selectorRef, screenId }),
664
+ comment: `Assert ${selectorRef} is not visible`,
665
+ };
666
+ }
667
+ /**
668
+ * Map "[element] should be focused" step
669
+ */
670
+ mapIsFocusedAssertion(selectorRef) {
671
+ const screenId = this.extractScreenId(selectorRef);
672
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
673
+ return {
674
+ code: this.templateEngine.renderStep('is-focused', { varName, selectorRef, screenId }),
675
+ comment: `Assert ${selectorRef} is focused`,
676
+ };
677
+ }
678
+ /**
679
+ * Map "[element] should be editable" step
680
+ */
681
+ mapIsEditableAssertion(selectorRef) {
682
+ const screenId = this.extractScreenId(selectorRef);
683
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
684
+ return {
685
+ code: this.templateEngine.renderStep('is-editable', { varName, selectorRef, screenId }),
686
+ comment: `Assert ${selectorRef} is editable`,
687
+ };
688
+ }
689
+ // ========================================
690
+ // ASSERTION METHODS - Count & Collections
691
+ // ========================================
692
+ /**
693
+ * Map "[element] should have count N" step
694
+ */
695
+ mapHasCountAssertion(selectorRef, expectedCount) {
696
+ const screenId = this.extractScreenId(selectorRef);
697
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
698
+ return {
699
+ code: this.templateEngine.renderStep('has-count', { varName, selectorRef, screenId, expectedCount }),
700
+ comment: `Assert ${selectorRef} has count ${expectedCount}`,
701
+ };
702
+ }
703
+ /**
704
+ * Map "[element] count should be greater than N" step
705
+ */
706
+ mapCountGreaterThanAssertion(selectorRef, minCount) {
707
+ const screenId = this.extractScreenId(selectorRef);
708
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
709
+ return {
710
+ code: this.templateEngine.renderStep('count-greater-than', { varName, selectorRef, screenId, minCount }),
711
+ comment: `Assert ${selectorRef} count > ${minCount}`,
712
+ };
713
+ }
714
+ /**
715
+ * Map "[element] count should be less than N" step
716
+ */
717
+ mapCountLessThanAssertion(selectorRef, maxCount) {
718
+ const screenId = this.extractScreenId(selectorRef);
719
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
720
+ return {
721
+ code: this.templateEngine.renderStep('count-less-than', { varName, selectorRef, screenId, maxCount }),
722
+ comment: `Assert ${selectorRef} count < ${maxCount}`,
723
+ };
724
+ }
725
+ // ========================================
726
+ // ASSERTION METHODS - Link & Image
727
+ // ========================================
728
+ /**
729
+ * Map "[element] should have link 'url'" step
730
+ */
731
+ mapHasLinkAssertion(selectorRef, expectedUrl) {
732
+ const screenId = this.extractScreenId(selectorRef);
733
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
734
+ return {
735
+ code: this.templateEngine.renderStep('has-link', { varName, selectorRef, screenId, expectedUrl }),
736
+ comment: `Assert ${selectorRef} links to "${expectedUrl}"`,
737
+ };
738
+ }
739
+ /**
740
+ * Map "[element] should have image source 'src'" step
741
+ */
742
+ mapHasImageSrcAssertion(selectorRef, expectedSrc) {
743
+ const screenId = this.extractScreenId(selectorRef);
744
+ const varName = selectorRef.replace(/[^a-zA-Z0-9]/g, '_') + '_' + this.stepCounter;
745
+ return {
746
+ code: this.templateEngine.renderStep('has-image-src', { varName, selectorRef, screenId, expectedSrc }),
747
+ comment: `Assert ${selectorRef} has image src "${expectedSrc}"`,
748
+ };
749
+ }
750
+ }
751
+ exports.StepMapper = StepMapper;
752
+ //# sourceMappingURL=step-mapper-old.js.map