@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,204 @@
1
+ "use strict";
2
+ /**
3
+ * AI-Based Step Mapper
4
+ * Fallback for dictionary when Gherkin patterns are ambiguous or unknown
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AIStepMapper = void 0;
11
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
12
+ class AIStepMapper {
13
+ constructor(verbose = false) {
14
+ const apiKey = process.env.ANTHROPIC_API_KEY;
15
+ if (!apiKey) {
16
+ throw new Error('ANTHROPIC_API_KEY environment variable is required for AI step mapping');
17
+ }
18
+ this.client = new sdk_1.default({ apiKey });
19
+ this.verbose = verbose;
20
+ }
21
+ /**
22
+ * Map a Gherkin step to Playwright code using AI
23
+ * Provides rich context to help AI understand the intent
24
+ */
25
+ async mapStep(step) {
26
+ if (this.verbose) {
27
+ console.log(` [AI] Mapping step: "${step.text}"`);
28
+ }
29
+ const prompt = this.buildPrompt(step);
30
+ try {
31
+ const message = await this.client.messages.create({
32
+ model: 'claude-3-5-haiku-20241022', // Fast & cheap for code generation
33
+ max_tokens: 500,
34
+ temperature: 0, // Deterministic for code generation
35
+ messages: [{
36
+ role: 'user',
37
+ content: prompt
38
+ }]
39
+ });
40
+ const content = message.content[0];
41
+ if (content.type !== 'text') {
42
+ throw new Error('Unexpected response type from AI');
43
+ }
44
+ const code = this.extractCode(content.text);
45
+ if (this.verbose) {
46
+ console.log(` [AI] Generated code (${code.split('\n').length} lines)`);
47
+ }
48
+ return {
49
+ code,
50
+ comment: `AI-generated from: ${step.text}`
51
+ };
52
+ }
53
+ catch (error) {
54
+ console.error(`[AI] Failed to map step: ${error}`);
55
+ // Fallback to TODO comment
56
+ return {
57
+ code: `// TODO: AI mapping failed - implement manually: ${step.text}`,
58
+ comment: `AI mapping error: ${error instanceof Error ? error.message : 'Unknown error'}`
59
+ };
60
+ }
61
+ }
62
+ /**
63
+ * Build context-rich prompt for AI
64
+ * Includes examples, patterns, and clear instructions
65
+ */
66
+ buildPrompt(step) {
67
+ const { keyword, text, selectorRef, dataRef, value } = step;
68
+ return `You are an expert Playwright test code generator.
69
+
70
+ **Task**: Convert this Gherkin step into Playwright TypeScript code.
71
+
72
+ **Gherkin Step**:
73
+ ${keyword} ${text}
74
+
75
+ **Parsed Information**:
76
+ - Element ID: ${selectorRef || 'N/A'}
77
+ - Data Reference: ${dataRef || 'N/A'}
78
+ - Value: ${value || 'N/A'}
79
+
80
+ **Context**:
81
+ - We use a custom selector helper: \`pw.fill(elementId, value, screenId)\`
82
+ - Element IDs are in format: [screen.element-name]
83
+ - Screen ID is extracted from element ID (e.g., "chat" from "[chat.input]")
84
+ - For assertions, use: \`await pw.getElement(elementId, screenId)\` then \`expect(element)...\`
85
+
86
+ **Common Patterns & Examples**:
87
+
88
+ 1. **Fill/Input Actions**:
89
+ - "user fills/inputs/enters [element] with value"
90
+ - "user types value in/into [element]"
91
+ → \`await pw.fill('[element]', 'value', 'screen');\`
92
+
93
+ 2. **Click Actions**:
94
+ - "user clicks/taps/presses [element]"
95
+ - "user clicks on [element]"
96
+ → \`await pw.click('[element]', 'screen');\`
97
+
98
+ 3. **Keyboard Actions**:
99
+ - "user presses Enter in [element]"
100
+ - "user hits Tab key in [element]"
101
+ → \`const el = await pw.getElement('[element]', 'screen');\n await el.press('Enter');\`
102
+
103
+ 4. **Visibility Assertions**:
104
+ - "user should see [element]"
105
+ - "[element] is/should be visible"
106
+ - "[element] appears/shows"
107
+ → \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeVisible();\`
108
+
109
+ 5. **State Assertions**:
110
+ - "[element] should be disabled/enabled"
111
+ - "[element] is checked/unchecked"
112
+ → \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeDisabled();\`
113
+
114
+ 6. **Text Content Assertions**:
115
+ - "[element] should contain text \\"value\\""
116
+ - "[element] has/displays text \\"value\\""
117
+ → \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toContainText('value');\`
118
+
119
+ 7. **Collection State**:
120
+ - "[element] should be empty"
121
+ - "[element] has no items"
122
+ → \`const el = await pw.getElement('[element]', 'screen');\n const items = await el.locator('> *').all();\n expect(items.length).toBe(0);\`
123
+
124
+ 8. **Scroll State**:
125
+ - "[element] should be scrolled to bottom"
126
+ → \`const el = await pw.getElement('[element]', 'screen');\n const scrollHeight = await el.evaluate(el => el.scrollHeight);\n const scrollTop = await el.evaluate(el => el.scrollTop);\n const clientHeight = await el.evaluate(el => el.clientHeight);\n expect(scrollTop + clientHeight).toBeGreaterThanOrEqual(scrollHeight - 10);\`
127
+
128
+ **Important Rules**:
129
+ 1. Extract screen ID from element ID: "[chat.input]" → screen="chat"
130
+ 2. Use proper TypeScript syntax with await
131
+ 3. Use descriptive variable names (element, el, container, etc.)
132
+ 4. Add helpful comments for complex assertions
133
+ 5. NEVER use page.evaluate() unless absolutely necessary
134
+ 6. NEVER generate partial or incomplete statements
135
+ 7. Each step should generate COMPLETE, SELF-CONTAINED code
136
+ 8. If you can't map the step, return a comment: // TODO: Implement step
137
+
138
+ **Output Format**:
139
+ Return ONLY complete Playwright TypeScript statements, no explanations, no markdown blocks.
140
+ Each statement must be syntactically complete and can be inserted directly into a test function.
141
+
142
+ **Example Output**:
143
+ const chat_input_123 = await pw.getElement('[chat.input]', 'chat');
144
+ await expect(chat_input_123).toBeVisible();
145
+
146
+ Now generate code for the given step.`;
147
+ }
148
+ /**
149
+ * Extract clean code from AI response
150
+ * Remove markdown code blocks, explanations, etc.
151
+ */
152
+ extractCode(response) {
153
+ let code = response.trim();
154
+ // Remove markdown code blocks
155
+ code = code.replace(/```(?:typescript|ts|javascript|js)?\n?/g, '');
156
+ code = code.replace(/```\n?/g, '');
157
+ // Remove leading/trailing whitespace
158
+ code = code.trim();
159
+ // If response contains explanations, try to extract only code
160
+ const lines = code.split('\n');
161
+ const codeLines = lines.filter(line => {
162
+ const trimmed = line.trim();
163
+ // Skip lines that are clearly explanations (start with text, not code)
164
+ // But keep all valid TypeScript/JavaScript syntax
165
+ if (trimmed === '')
166
+ return true; // Keep empty lines
167
+ if (trimmed.startsWith('//'))
168
+ return true; // Keep comments
169
+ // Exclude lines that look like natural language explanations
170
+ // (start with capital letter and contain spaces, no semicolons/operators)
171
+ if (/^[A-Z][a-z]+ [\w\s]+$/.test(trimmed) && !trimmed.includes(';')) {
172
+ return false; // This looks like an explanation
173
+ }
174
+ // Keep lines that contain code-like patterns
175
+ const codePatterns = [
176
+ 'await ', 'const ', 'let ', 'var ', 'return ', 'expect(', 'if ', 'else',
177
+ 'for ', 'while ', 'function ', '=>', 'pw.', 'page.',
178
+ ')', '}', '];', '});', '})', 'import ', 'export ',
179
+ '.', '(', '[', '=', '+', '-', '*', '/', '%', '&&', '||'
180
+ ];
181
+ return codePatterns.some(pattern => trimmed.includes(pattern));
182
+ });
183
+ // If we filtered too much, return original
184
+ if (codeLines.length === 0) {
185
+ return code;
186
+ }
187
+ let finalCode = codeLines.join('\n');
188
+ // Safety check: Remove incomplete page.evaluate statements
189
+ // If we find "page.evaluate(" without proper closing, remove it
190
+ const evaluatePattern = /await\s+page\.evaluate\(\(\)\s*=>\s*\{\s*$/gm;
191
+ if (evaluatePattern.test(finalCode)) {
192
+ // Has unclosed page.evaluate at end - this is incomplete, return TODO
193
+ return '// TODO: Implement step (AI generated incomplete code)';
194
+ }
195
+ // Safety check: If code ends with an opening brace/paren, it's incomplete
196
+ const endsIncomplete = /[\({]\s*$/.test(finalCode);
197
+ if (endsIncomplete) {
198
+ return '// TODO: Implement step (AI generated incomplete code)';
199
+ }
200
+ return finalCode;
201
+ }
202
+ }
203
+ exports.AIStepMapper = AIStepMapper;
204
+ //# sourceMappingURL=ai-step-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-step-mapper.js","sourceRoot":"","sources":["../../../src/generators/test-generator/ai-step-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { ParsedFeature } from '../gherkin-parser';
2
+ /**
3
+ * Result of test generation for a single feature file
4
+ */
5
+ export interface GeneratedTest {
6
+ featureName: string;
7
+ filePath: string;
8
+ code: string;
9
+ sourceFile?: string;
10
+ stepCount?: number;
11
+ }
12
+ export declare class CodeGenerator {
13
+ private stepMapper;
14
+ private adapter;
15
+ private screenName?;
16
+ constructor(options?: {
17
+ useAI?: boolean;
18
+ verbose?: boolean;
19
+ framework?: string;
20
+ baseURL?: string;
21
+ screenName?: string;
22
+ });
23
+ /**
24
+ * Generate test file from parsed feature
25
+ */
26
+ generateTest(feature: ParsedFeature, outputDir: string): Promise<GeneratedTest>;
27
+ /**
28
+ * Count total steps in feature (excluding background)
29
+ */
30
+ private countSteps;
31
+ /**
32
+ * Write generated test to file
33
+ */
34
+ writeTest(generatedTest: GeneratedTest): void;
35
+ private generateTestCode;
36
+ private generateBeforeEach;
37
+ private generateScenario;
38
+ /**
39
+ * Indent code lines with specified number of spaces
40
+ */
41
+ private indentCode;
42
+ /**
43
+ * Convert feature name to file name
44
+ * Example: "User Login" → "user-login.spec.ts"
45
+ */
46
+ private featureNameToFileName;
47
+ /**
48
+ * Generate tests for all features in a directory
49
+ */
50
+ generateAllTests(featuresDir: string, outputDir: string, featureFiles: string[]): Promise<GeneratedTest[]>;
51
+ }
52
+ //# sourceMappingURL=code-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8B,MAAM,mBAAmB,CAAC;AAI9E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAa3H;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC;IA+CzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;YAS/B,gBAAgB;YAoChB,kBAAkB;YAiBlB,gBAAgB;IAqB9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC;CAqB5B"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CodeGenerator = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const step_mapper_1 = require("./step-mapper");
10
+ const adapters_1 = require("./adapters");
11
+ class CodeGenerator {
12
+ constructor(options = {}) {
13
+ this.screenName = options.screenName;
14
+ this.stepMapper = new step_mapper_1.StepMapper(options);
15
+ // Get adapter from registry (default: playwright)
16
+ const frameworkName = options.framework || 'playwright';
17
+ this.adapter = adapters_1.adapterRegistry.getAdapter(frameworkName);
18
+ if (options.verbose) {
19
+ console.log(`[CodeGenerator] Using ${this.adapter.frameworkName} adapter`);
20
+ }
21
+ }
22
+ /**
23
+ * Generate test file from parsed feature
24
+ */
25
+ async generateTest(feature, outputDir) {
26
+ // Use source file name if available, otherwise derive from feature name
27
+ let fileName;
28
+ if (feature.sourceFile) {
29
+ // Extract filename and replace .feature with .spec.ts
30
+ const baseName = path_1.default.basename(feature.sourceFile, path_1.default.extname(feature.sourceFile));
31
+ fileName = `${baseName}.spec.ts`;
32
+ }
33
+ else {
34
+ // Fallback to converting feature name
35
+ fileName = this.featureNameToFileName(feature.name);
36
+ }
37
+ // Extract screen name from source file path if available
38
+ // qa/screens/{screenName}/features/{featureName}.feature -> screenName
39
+ let screenSubdir = '';
40
+ if (feature.sourceFile) {
41
+ const sourceDir = path_1.default.dirname(feature.sourceFile);
42
+ const parts = sourceDir.split(path_1.default.sep);
43
+ const screensIndex = parts.indexOf('screens');
44
+ if (screensIndex >= 0 && screensIndex < parts.length - 2) {
45
+ screenSubdir = parts[screensIndex + 1]; // screen name after 'screens'
46
+ }
47
+ }
48
+ // Build output path with screen subdirectory
49
+ const filePath = screenSubdir
50
+ ? path_1.default.join(outputDir, screenSubdir, fileName)
51
+ : path_1.default.join(outputDir, fileName);
52
+ // Generate imports using adapter
53
+ const imports = this.adapter.renderImports();
54
+ // Generate test code (async now to support AI mapping)
55
+ const testCode = await this.generateTestCode(feature);
56
+ // Combine
57
+ const code = `${imports}\n\n${testCode}`;
58
+ return {
59
+ featureName: feature.name,
60
+ filePath,
61
+ code,
62
+ sourceFile: feature.sourceFile,
63
+ stepCount: this.countSteps(feature),
64
+ };
65
+ }
66
+ /**
67
+ * Count total steps in feature (excluding background)
68
+ */
69
+ countSteps(feature) {
70
+ let total = 0;
71
+ for (const scenario of feature.scenarios) {
72
+ total += scenario.steps.length;
73
+ }
74
+ return total;
75
+ }
76
+ /**
77
+ * Write generated test to file
78
+ */
79
+ writeTest(generatedTest) {
80
+ const dir = path_1.default.dirname(generatedTest.filePath);
81
+ if (!fs_1.default.existsSync(dir)) {
82
+ fs_1.default.mkdirSync(dir, { recursive: true });
83
+ }
84
+ fs_1.default.writeFileSync(generatedTest.filePath, generatedTest.code, 'utf-8');
85
+ }
86
+ async generateTestCode(feature) {
87
+ // Extract feature name from source file if available, otherwise derive from feature name
88
+ let featureName;
89
+ if (feature.sourceFile) {
90
+ // Extract filename without extension: "/path/to/login.feature" -> "login"
91
+ featureName = path_1.default.basename(feature.sourceFile, path_1.default.extname(feature.sourceFile));
92
+ }
93
+ else {
94
+ // Fallback: derive from feature name (e.g., "User Authentication - Login" -> "login")
95
+ featureName = this.featureNameToFileName(feature.name).replace('.spec.ts', '');
96
+ }
97
+ // Set feature context for data resolution and navigation
98
+ this.stepMapper.setFeatureContext(featureName, feature.path);
99
+ // Generate background if exists
100
+ let background;
101
+ if (feature.background) {
102
+ background = await this.generateBeforeEach(feature.background);
103
+ }
104
+ // Generate all scenarios
105
+ const scenarios = [];
106
+ for (const scenario of feature.scenarios) {
107
+ scenarios.push(await this.generateScenario(scenario, !!feature.background));
108
+ }
109
+ // Use adapter to render the complete test file structure
110
+ return this.adapter.renderTestFile({
111
+ imports: '', // Not used in template as it's rendered separately
112
+ featureName: feature.name,
113
+ featureDescription: feature.description,
114
+ background,
115
+ scenarios,
116
+ });
117
+ }
118
+ async generateBeforeEach(background) {
119
+ // Map all steps
120
+ const steps = [];
121
+ for (const step of background.steps) {
122
+ const mapped = await Promise.resolve(this.stepMapper.mapStep(step));
123
+ steps.push({
124
+ comment: mapped.comment,
125
+ code: this.indentCode(mapped.code, 4),
126
+ });
127
+ }
128
+ // Use adapter to render beforeEach
129
+ return this.adapter.renderBeforeEach({
130
+ steps,
131
+ });
132
+ }
133
+ async generateScenario(scenario, hasBackground) {
134
+ // Set scenario context for path variable resolution
135
+ this.stepMapper.setScenarioContext(scenario.steps);
136
+ // Map all steps
137
+ const steps = [];
138
+ for (const step of scenario.steps) {
139
+ const mapped = await Promise.resolve(this.stepMapper.mapStep(step));
140
+ steps.push({
141
+ comment: mapped.comment,
142
+ code: this.indentCode(mapped.code, 4),
143
+ });
144
+ }
145
+ // Use adapter to render scenario
146
+ return this.adapter.renderScenario({
147
+ scenarioName: scenario.name,
148
+ steps,
149
+ });
150
+ }
151
+ /**
152
+ * Indent code lines with specified number of spaces
153
+ */
154
+ indentCode(code, spaces) {
155
+ const indentation = ' '.repeat(spaces);
156
+ return code.split('\n').map(line => indentation + line).join('\n');
157
+ }
158
+ /**
159
+ * Convert feature name to file name
160
+ * Example: "User Login" → "user-login.spec.ts"
161
+ */
162
+ featureNameToFileName(featureName) {
163
+ return (featureName
164
+ .toLowerCase()
165
+ .replace(/[^a-z0-9]+/g, '-')
166
+ .replace(/^-|-$/g, '') + '.spec.ts');
167
+ }
168
+ /**
169
+ * Generate tests for all features in a directory
170
+ */
171
+ async generateAllTests(featuresDir, outputDir, featureFiles) {
172
+ const { GherkinParser } = require('../gherkin-parser');
173
+ const parser = new GherkinParser();
174
+ const results = [];
175
+ for (const featureFile of featureFiles) {
176
+ try {
177
+ const feature = parser.parseFeatureFile(featureFile);
178
+ const generatedTest = await this.generateTest(feature, outputDir);
179
+ this.writeTest(generatedTest);
180
+ results.push(generatedTest);
181
+ console.log(`✓ Generated: ${path_1.default.basename(generatedTest.filePath)}`);
182
+ }
183
+ catch (error) {
184
+ console.error(`✗ Failed to generate test for ${featureFile}:`, error);
185
+ }
186
+ }
187
+ return results;
188
+ }
189
+ }
190
+ exports.CodeGenerator = CodeGenerator;
191
+ //# sourceMappingURL=code-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../../src/generators/test-generator/code-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { StepPattern } from './types';
2
+ /**
3
+ * Assertion patterns: visibility, text content, state, attributes
4
+ * Uses template engine for framework-agnostic code generation
5
+ */
6
+ export declare const assertionPatterns: StepPattern[];
7
+ //# sourceMappingURL=assertion-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/assertion-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EA+K1C,CAAC"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertionPatterns = void 0;
4
+ /**
5
+ * Assertion patterns: visibility, text content, state, attributes
6
+ * Uses template engine for framework-agnostic code generation
7
+ */
8
+ exports.assertionPatterns = [
9
+ {
10
+ name: 'should-be-visible',
11
+ matcher: (step) => (step.text.includes('should be visible') ||
12
+ step.text.includes('should be displayed') ||
13
+ step.text.includes('should see') ||
14
+ step.text.match(/\b(see|sees)\s+\[/)) &&
15
+ !!step.selectorRef,
16
+ generator: (step, context) => {
17
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
18
+ const code = context.templateEngine.renderStep('visible-assertion', resolved);
19
+ return {
20
+ code,
21
+ comment: `Assert ${step.selectorRef} is visible`,
22
+ };
23
+ },
24
+ priority: 10,
25
+ },
26
+ {
27
+ name: 'should-not-be-visible',
28
+ matcher: (step) => (step.text.includes('should not be visible') ||
29
+ step.text.includes('should be hidden') ||
30
+ step.text.includes('should not see')) &&
31
+ !!step.selectorRef,
32
+ generator: (step, context) => {
33
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
34
+ const code = context.templateEngine.renderStep('not-visible-assertion', resolved);
35
+ return {
36
+ code,
37
+ comment: `Assert ${step.selectorRef} is not visible`,
38
+ };
39
+ },
40
+ priority: 11,
41
+ },
42
+ {
43
+ name: 'should-be-enabled',
44
+ matcher: (step) => step.text.includes('should be enabled') && !!step.selectorRef,
45
+ generator: (step, context) => {
46
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
47
+ const code = context.templateEngine.renderStep('enabled-assertion', resolved);
48
+ return {
49
+ code,
50
+ comment: `Assert ${step.selectorRef} is enabled`,
51
+ };
52
+ },
53
+ priority: 9,
54
+ },
55
+ {
56
+ name: 'should-be-disabled',
57
+ matcher: (step) => step.text.includes('should be disabled') && !!step.selectorRef,
58
+ generator: (step, context) => {
59
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
60
+ const code = context.templateEngine.renderStep('disabled-assertion', resolved);
61
+ return {
62
+ code,
63
+ comment: `Assert ${step.selectorRef} is disabled`,
64
+ };
65
+ },
66
+ priority: 9,
67
+ },
68
+ {
69
+ name: 'should-contain-text',
70
+ matcher: (step) => step.text.includes('should contain') && !!step.selectorRef && !!(step.value || step.dataRef),
71
+ generator: (step, context) => {
72
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
73
+ const expectedText = step.value || `\${${step.dataRef}}`;
74
+ const code = context.templateEngine.renderStep('contain-text-assertion', {
75
+ ...resolved,
76
+ expectedText,
77
+ });
78
+ return {
79
+ code,
80
+ comment: `Assert ${step.selectorRef} contains "${step.value || step.dataRef}"`,
81
+ };
82
+ },
83
+ priority: 9,
84
+ },
85
+ {
86
+ name: 'should-have-text',
87
+ matcher: (step) => step.text.includes('should have text') && !!step.selectorRef && !!(step.value || step.dataRef),
88
+ generator: (step, context) => {
89
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
90
+ const expectedText = step.value || `\${${step.dataRef}}`;
91
+ const code = context.templateEngine.renderStep('have-text-assertion', {
92
+ ...resolved,
93
+ expectedText,
94
+ });
95
+ return {
96
+ code,
97
+ comment: `Assert ${step.selectorRef} has text "${step.value || step.dataRef}"`,
98
+ };
99
+ },
100
+ priority: 10,
101
+ },
102
+ {
103
+ name: 'should-be-empty',
104
+ matcher: (step) => step.text.includes('should be empty') && !!step.selectorRef,
105
+ generator: (step, context) => {
106
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
107
+ const code = context.templateEngine.renderStep('empty-assertion', resolved);
108
+ return {
109
+ code,
110
+ comment: `Assert ${step.selectorRef} is empty`,
111
+ };
112
+ },
113
+ priority: 8,
114
+ },
115
+ {
116
+ name: 'should-be-checked',
117
+ matcher: (step) => step.text.includes('should be checked') && !!step.selectorRef,
118
+ generator: (step, context) => {
119
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
120
+ const code = context.templateEngine.renderStep('checked-assertion', resolved);
121
+ return {
122
+ code,
123
+ comment: `Assert ${step.selectorRef} is checked`,
124
+ };
125
+ },
126
+ priority: 8,
127
+ },
128
+ {
129
+ name: 'should-be-unchecked',
130
+ matcher: (step) => step.text.includes('should be unchecked') && !!step.selectorRef,
131
+ generator: (step, context) => {
132
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
133
+ const code = context.templateEngine.renderStep('not-checked-assertion', resolved);
134
+ return {
135
+ code,
136
+ comment: `Assert ${step.selectorRef} is unchecked`,
137
+ };
138
+ },
139
+ priority: 8,
140
+ },
141
+ {
142
+ name: 'should-be-focused',
143
+ matcher: (step) => step.text.includes('should be focused') && !!step.selectorRef,
144
+ generator: (step, context) => {
145
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
146
+ const code = context.templateEngine.renderStep('focused-assertion', resolved);
147
+ return {
148
+ code,
149
+ comment: `Assert ${step.selectorRef} is focused`,
150
+ };
151
+ },
152
+ priority: 7,
153
+ },
154
+ {
155
+ name: 'should-have-count',
156
+ matcher: (step) => step.text.includes('should have') && step.text.includes('count') && !!step.selectorRef,
157
+ generator: (step, context) => {
158
+ const match = step.text.match(/count\s+(\d+)/);
159
+ const expectedCount = match ? parseInt(match[1]) : 1;
160
+ const resolved = context.selectorResolver.resolveSelector(step.selectorRef);
161
+ const code = context.templateEngine.renderStep('count-assertion', {
162
+ ...resolved,
163
+ expectedCount,
164
+ });
165
+ return {
166
+ code,
167
+ comment: `Assert ${step.selectorRef} has count ${expectedCount}`,
168
+ };
169
+ },
170
+ priority: 8,
171
+ },
172
+ ];
173
+ //# sourceMappingURL=assertion-patterns.js.map