@sun-asterisk/sungen 1.0.19 → 1.0.21

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 (295) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/commands/add.d.ts +3 -0
  3. package/dist/cli/commands/add.d.ts.map +1 -0
  4. package/dist/cli/commands/add.js +27 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/cache-clear.d.ts +3 -0
  7. package/dist/cli/commands/cache-clear.d.ts.map +1 -0
  8. package/dist/cli/commands/cache-clear.js +24 -0
  9. package/dist/cli/commands/cache-clear.js.map +1 -0
  10. package/dist/cli/commands/full.d.ts +3 -0
  11. package/dist/cli/commands/full.d.ts.map +1 -0
  12. package/dist/cli/commands/full.js +37 -0
  13. package/dist/cli/commands/full.js.map +1 -0
  14. package/dist/cli/commands/generate.d.ts +3 -0
  15. package/dist/cli/commands/generate.d.ts.map +1 -0
  16. package/dist/cli/commands/generate.js +53 -0
  17. package/dist/cli/commands/generate.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +3 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +20 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/live-scan.d.ts +3 -0
  23. package/dist/cli/commands/live-scan.d.ts.map +1 -0
  24. package/dist/cli/commands/{live-scan-command.js → live-scan.js} +22 -16
  25. package/dist/cli/commands/live-scan.js.map +1 -0
  26. package/dist/cli/commands/makeauth.d.ts +3 -0
  27. package/dist/cli/commands/makeauth.d.ts.map +1 -0
  28. package/dist/cli/commands/makeauth.js +76 -0
  29. package/dist/cli/commands/makeauth.js.map +1 -0
  30. package/dist/cli/commands/map.d.ts +3 -0
  31. package/dist/cli/commands/map.d.ts.map +1 -0
  32. package/dist/cli/commands/map.js +93 -0
  33. package/dist/cli/commands/map.js.map +1 -0
  34. package/dist/cli/commands/validate.d.ts +3 -0
  35. package/dist/cli/commands/validate.d.ts.map +1 -0
  36. package/dist/cli/commands/validate.js +43 -0
  37. package/dist/cli/commands/validate.js.map +1 -0
  38. package/dist/cli/index.js +29 -442
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/types.d.ts +9 -0
  41. package/dist/cli/types.d.ts.map +1 -0
  42. package/dist/cli/types.js +7 -0
  43. package/dist/cli/types.js.map +1 -0
  44. package/dist/cli/utils.d.ts +6 -0
  45. package/dist/cli/utils.d.ts.map +1 -0
  46. package/dist/cli/utils.js +101 -0
  47. package/dist/cli/utils.js.map +1 -0
  48. package/dist/core/live-scanner/matrix-reader.d.ts.map +1 -1
  49. package/dist/core/live-scanner/matrix-reader.js +2 -40
  50. package/dist/core/live-scanner/matrix-reader.js.map +1 -1
  51. package/dist/core/live-scanner/scanner.d.ts.map +1 -1
  52. package/dist/core/live-scanner/scanner.js +22 -4
  53. package/dist/core/live-scanner/scanner.js.map +1 -1
  54. package/dist/core/live-scanner/step-replayer.d.ts +1 -1
  55. package/dist/core/live-scanner/step-replayer.d.ts.map +1 -1
  56. package/dist/core/live-scanner/step-replayer.js +107 -6
  57. package/dist/core/live-scanner/step-replayer.js.map +1 -1
  58. package/dist/core/live-scanner/types.d.ts +1 -0
  59. package/dist/core/live-scanner/types.d.ts.map +1 -1
  60. package/dist/core/validator/selector-validator.d.ts.map +1 -1
  61. package/dist/core/validator/selector-validator.js +2 -1
  62. package/dist/core/validator/selector-validator.js.map +1 -1
  63. package/dist/generators/scaffold-generator/index.d.ts +2 -1
  64. package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
  65. package/dist/generators/scaffold-generator/index.js +21 -1
  66. package/dist/generators/scaffold-generator/index.js.map +1 -1
  67. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
  68. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
  69. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
  70. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
  71. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
  72. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
  73. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
  74. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
  75. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
  76. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
  77. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
  78. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
  79. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
  80. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
  81. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
  82. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
  83. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
  84. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
  85. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
  86. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
  87. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
  88. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
  89. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
  90. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
  91. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
  92. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
  93. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
  94. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
  95. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
  96. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  97. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
  98. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
  99. package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -58
  100. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
  101. package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -2
  102. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
  103. package/dist/generators/test-generator/patterns/form-patterns.js +34 -47
  104. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
  105. package/dist/generators/test-generator/patterns/index.d.ts +3 -1
  106. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  107. package/dist/generators/test-generator/patterns/index.js +20 -3
  108. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  109. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -1
  110. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
  111. package/dist/generators/test-generator/patterns/interaction-patterns.js +44 -85
  112. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
  113. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +7 -0
  114. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +1 -0
  115. package/dist/generators/test-generator/patterns/legacy-patterns.js +98 -0
  116. package/dist/generators/test-generator/patterns/legacy-patterns.js.map +1 -0
  117. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -2
  118. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
  119. package/dist/generators/test-generator/patterns/navigation-patterns.js +14 -42
  120. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
  121. package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -1
  122. package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -1
  123. package/dist/generators/test-generator/patterns/setup-patterns.js +23 -35
  124. package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -1
  125. package/dist/generators/test-generator/patterns/types.d.ts +18 -3
  126. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  127. package/dist/generators/test-generator/step-mapper.d.ts +0 -15
  128. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  129. package/dist/generators/test-generator/step-mapper.js +4 -106
  130. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  131. package/dist/{executor/test-generator.d.ts → generators/test-generator/types.d.ts} +4 -25
  132. package/dist/generators/test-generator/types.d.ts.map +1 -0
  133. package/dist/generators/test-generator/types.js +106 -0
  134. package/dist/generators/test-generator/types.js.map +1 -0
  135. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  136. package/dist/generators/test-generator/utils/data-resolver.js +8 -17
  137. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  138. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  139. package/dist/generators/test-generator/utils/selector-resolver.js +10 -18
  140. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  141. package/dist/orchestrator/cache-manager.d.ts +1 -23
  142. package/dist/orchestrator/cache-manager.d.ts.map +1 -1
  143. package/dist/orchestrator/cache-manager.js +1 -87
  144. package/dist/orchestrator/cache-manager.js.map +1 -1
  145. package/dist/orchestrator/pipeline.d.ts +11 -28
  146. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  147. package/dist/orchestrator/pipeline.js +52 -371
  148. package/dist/orchestrator/pipeline.js.map +1 -1
  149. package/dist/orchestrator/reporter.d.ts +1 -1
  150. package/dist/orchestrator/reporter.d.ts.map +1 -1
  151. package/dist/orchestrator/screen-manager.js +1 -1
  152. package/dist/orchestrator/screen-manager.js.map +1 -1
  153. package/dist/utils/feature-finder.d.ts +9 -0
  154. package/dist/utils/feature-finder.d.ts.map +1 -0
  155. package/dist/utils/feature-finder.js +67 -0
  156. package/dist/utils/feature-finder.js.map +1 -0
  157. package/dist/utils/screen-paths.d.ts +10 -0
  158. package/dist/utils/screen-paths.d.ts.map +1 -0
  159. package/dist/utils/screen-paths.js +73 -0
  160. package/dist/utils/screen-paths.js.map +1 -0
  161. package/dist/utils/selector-loader.d.ts +6 -0
  162. package/dist/utils/selector-loader.d.ts.map +1 -0
  163. package/dist/utils/selector-loader.js +20 -0
  164. package/dist/utils/selector-loader.js.map +1 -0
  165. package/dist/utils/selector-types.d.ts +7 -0
  166. package/dist/utils/selector-types.d.ts.map +1 -0
  167. package/dist/utils/selector-types.js +19 -0
  168. package/dist/utils/selector-types.js.map +1 -0
  169. package/dist/utils/test-data-loader.d.ts +6 -0
  170. package/dist/utils/test-data-loader.d.ts.map +1 -0
  171. package/dist/utils/test-data-loader.js +20 -0
  172. package/dist/utils/test-data-loader.js.map +1 -0
  173. package/dist/utils/yaml-io.d.ts +14 -0
  174. package/dist/utils/yaml-io.d.ts.map +1 -0
  175. package/dist/utils/yaml-io.js +72 -0
  176. package/dist/utils/yaml-io.js.map +1 -0
  177. package/package.json +1 -1
  178. package/src/cli/commands/add.ts +25 -0
  179. package/src/cli/commands/cache-clear.ts +22 -0
  180. package/src/cli/commands/full.ts +35 -0
  181. package/src/cli/commands/generate.ts +55 -0
  182. package/src/cli/commands/init.ts +17 -0
  183. package/src/cli/commands/{live-scan-command.ts → live-scan.ts} +21 -18
  184. package/src/cli/commands/makeauth.ts +77 -0
  185. package/src/cli/commands/map.ts +97 -0
  186. package/src/cli/commands/validate.ts +43 -0
  187. package/src/cli/index.ts +32 -473
  188. package/src/cli/types.ts +9 -0
  189. package/src/cli/utils.ts +106 -0
  190. package/src/core/live-scanner/matrix-reader.ts +2 -8
  191. package/src/core/live-scanner/scanner.ts +27 -4
  192. package/src/core/live-scanner/step-replayer.ts +92 -6
  193. package/src/core/live-scanner/types.ts +1 -0
  194. package/src/core/validator/selector-validator.ts +3 -2
  195. package/src/generators/scaffold-generator/index.ts +23 -2
  196. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
  197. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
  198. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
  199. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
  200. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
  201. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
  202. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
  203. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
  204. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
  205. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
  206. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
  207. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
  208. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
  209. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
  210. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
  211. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
  212. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
  213. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
  214. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
  215. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
  216. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
  217. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
  218. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
  219. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
  220. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
  221. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
  222. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
  223. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
  224. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
  225. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  226. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
  227. package/src/generators/test-generator/patterns/assertion-patterns.ts +102 -62
  228. package/src/generators/test-generator/patterns/form-patterns.ts +38 -60
  229. package/src/generators/test-generator/patterns/index.ts +22 -4
  230. package/src/generators/test-generator/patterns/interaction-patterns.ts +47 -107
  231. package/src/generators/test-generator/patterns/legacy-patterns.ts +104 -0
  232. package/src/generators/test-generator/patterns/navigation-patterns.ts +27 -69
  233. package/src/generators/test-generator/patterns/setup-patterns.ts +23 -41
  234. package/src/generators/test-generator/patterns/types.ts +26 -9
  235. package/src/generators/test-generator/step-mapper.ts +4 -124
  236. package/src/generators/test-generator/types.ts +131 -0
  237. package/src/generators/test-generator/utils/data-resolver.ts +8 -13
  238. package/src/generators/test-generator/utils/selector-resolver.ts +15 -17
  239. package/src/orchestrator/cache-manager.ts +1 -107
  240. package/src/orchestrator/pipeline.ts +58 -433
  241. package/src/orchestrator/reporter.ts +1 -1
  242. package/src/orchestrator/screen-manager.ts +1 -1
  243. package/src/utils/feature-finder.ts +33 -0
  244. package/src/utils/screen-paths.ts +37 -0
  245. package/src/utils/selector-loader.ts +23 -0
  246. package/src/utils/selector-types.ts +17 -0
  247. package/src/utils/test-data-loader.ts +23 -0
  248. package/src/utils/yaml-io.ts +33 -0
  249. package/dist/cli/commands/auto-tag-command.d.ts +0 -8
  250. package/dist/cli/commands/auto-tag-command.d.ts.map +0 -1
  251. package/dist/cli/commands/auto-tag-command.js +0 -104
  252. package/dist/cli/commands/auto-tag-command.js.map +0 -1
  253. package/dist/cli/commands/live-scan-command.d.ts +0 -9
  254. package/dist/cli/commands/live-scan-command.d.ts.map +0 -1
  255. package/dist/cli/commands/live-scan-command.js.map +0 -1
  256. package/dist/executor/playwright/playwright-generator.d.ts +0 -33
  257. package/dist/executor/playwright/playwright-generator.d.ts.map +0 -1
  258. package/dist/executor/playwright/playwright-generator.js +0 -136
  259. package/dist/executor/playwright/playwright-generator.js.map +0 -1
  260. package/dist/executor/test-generator.d.ts.map +0 -1
  261. package/dist/executor/test-generator.js +0 -30
  262. package/dist/executor/test-generator.js.map +0 -1
  263. package/dist/generators/cli.d.ts +0 -7
  264. package/dist/generators/cli.d.ts.map +0 -1
  265. package/dist/generators/cli.js +0 -570
  266. package/dist/generators/cli.js.map +0 -1
  267. package/dist/input/cli-adapter.d.ts +0 -75
  268. package/dist/input/cli-adapter.d.ts.map +0 -1
  269. package/dist/input/cli-adapter.js +0 -218
  270. package/dist/input/cli-adapter.js.map +0 -1
  271. package/dist/input/config-adapter.d.ts +0 -25
  272. package/dist/input/config-adapter.d.ts.map +0 -1
  273. package/dist/input/config-adapter.js +0 -70
  274. package/dist/input/config-adapter.js.map +0 -1
  275. package/dist/input/input-adapter.d.ts +0 -28
  276. package/dist/input/input-adapter.d.ts.map +0 -1
  277. package/dist/input/input-adapter.js +0 -17
  278. package/dist/input/input-adapter.js.map +0 -1
  279. package/dist/input/vscode-adapter.d.ts +0 -62
  280. package/dist/input/vscode-adapter.d.ts.map +0 -1
  281. package/dist/input/vscode-adapter.js +0 -64
  282. package/dist/input/vscode-adapter.js.map +0 -1
  283. package/dist/tools/auto-tagger.d.ts +0 -107
  284. package/dist/tools/auto-tagger.d.ts.map +0 -1
  285. package/dist/tools/auto-tagger.js +0 -502
  286. package/dist/tools/auto-tagger.js.map +0 -1
  287. package/src/cli/commands/auto-tag-command.ts +0 -80
  288. package/src/executor/playwright/playwright-generator.ts +0 -125
  289. package/src/executor/test-generator.ts +0 -90
  290. package/src/generators/cli.ts +0 -640
  291. package/src/input/cli-adapter.ts +0 -233
  292. package/src/input/config-adapter.ts +0 -71
  293. package/src/input/input-adapter.ts +0 -32
  294. package/src/input/vscode-adapter.ts +0 -90
  295. package/src/tools/auto-tagger.ts +0 -572
@@ -1,11 +1,45 @@
1
1
  import { ParsedStep } from '../../gherkin-parser';
2
- import { StepPattern } from './types';
2
+ import { StepPattern, StepTemplateData } from './types';
3
3
 
4
4
  /**
5
5
  * Assertion patterns: visibility, text content, state, attributes
6
6
  * Uses template engine for framework-agnostic code generation
7
7
  */
8
8
  export const assertionPatterns: StepPattern[] = [
9
+ // Column cell assertion: "see [Department] column 1 with {{value}}" -> check table cell text
10
+ {
11
+ name: 'column-cell-assertion',
12
+ matcher: (step: ParsedStep) =>
13
+ (step.text.includes('should see') || step.text.match(/\b(see|sees)\s+\[/)) &&
14
+ !!step.selectorRef &&
15
+ !!step.dataRef &&
16
+ (step.elementType === 'column' || step.elementType === 'columnheader'),
17
+ resolver: (step, context): StepTemplateData => {
18
+ let dataValue: string;
19
+ try {
20
+ dataValue = context.dataResolver.resolveData(step.dataRef!, context.featureName);
21
+ } catch (error) {
22
+ dataValue = `\${${step.dataRef}}`;
23
+ }
24
+
25
+ // getByRole('row') includes header row as nth(0), so Gherkin nth=1 maps to locator nth(1)
26
+ const rowNth = step.nth || 1;
27
+ // Create a safe variable name from column name
28
+ const columnIndexVar = `colIndex${step.selectorRef!.replace(/[^a-zA-Z0-9]/g, '')}`;
29
+
30
+ return {
31
+ templateName: 'column-cell-assertion',
32
+ data: {
33
+ columnName: step.selectorRef,
34
+ rowNth,
35
+ columnIndexVar,
36
+ dataValue,
37
+ },
38
+ comment: `Assert ${step.selectorRef} column row ${step.nth || 1} has text ${step.dataRef}`,
39
+ };
40
+ },
41
+ priority: 15, // Higher than all other assertion patterns
42
+ },
9
43
  // Page assertion pattern: "see [home] page" -> check URL matches selector value
10
44
  {
11
45
  name: 'page-assertion',
@@ -14,9 +48,9 @@ export const assertionPatterns: StepPattern[] = [
14
48
  step.text.includes('see') ||
15
49
  step.text.includes('sees')) &&
16
50
  step.elementType === 'page',
17
- generator: (step, context) => {
51
+ resolver: (step, context): StepTemplateData => {
18
52
  let path = step.featurePath || '/';
19
-
53
+
20
54
  // If selector is present, extract path from selector's value attribute
21
55
  if (step.selectorRef) {
22
56
  try {
@@ -33,12 +67,12 @@ export const assertionPatterns: StepPattern[] = [
33
67
  path = step.featurePath || '/';
34
68
  }
35
69
  }
36
-
70
+
37
71
  // Convert path to regex-safe string
38
72
  const pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
39
- const code = context.templateEngine.renderStep('page-assertion', { pathRegex });
40
73
  return {
41
- code,
74
+ templateName: 'page-assertion',
75
+ data: { pathRegex },
42
76
  comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert on page`,
43
77
  };
44
78
  },
@@ -81,6 +115,14 @@ export const assertionPatterns: StepPattern[] = [
81
115
  }
82
116
 
83
117
  if (resolved.strategy === 'role' && resolved.role) {
118
+ // Dialog role: check heading inside dialog instead of filter on full text content
119
+ if (resolved.role === 'dialog') {
120
+ const code = context.templateEngine.renderStep('hidden-dialog-heading-assertion', {
121
+ dataValue,
122
+ });
123
+ return { code, comment: `Assert ${step.selectorRef} dialog hidden with heading ${step.dataRef}` };
124
+ }
125
+
84
126
  const code = context.templateEngine.renderStep('hidden-with-role-variable-assertion', {
85
127
  role: resolved.role,
86
128
  name: resolved.name && resolved.name.trim() ? resolved.name : undefined,
@@ -223,6 +265,17 @@ export const assertionPatterns: StepPattern[] = [
223
265
 
224
266
  // Check if it's a role-based selector with data
225
267
  if (resolved.strategy === 'role' && resolved.role) {
268
+ // Dialog role: check heading inside dialog instead of filter on full text content
269
+ if (resolved.role === 'dialog') {
270
+ const code = context.templateEngine.renderStep('visible-dialog-heading-assertion', {
271
+ dataValue,
272
+ });
273
+ return {
274
+ code,
275
+ comment: `Assert ${step.selectorRef} dialog with heading ${step.dataRef}`,
276
+ };
277
+ }
278
+
226
279
  const hasName = resolved.name && resolved.name.trim();
227
280
  // For img role: images have no text content, so put dataValue in name instead of filter
228
281
  const isImgRole = resolved.role === 'img';
@@ -278,11 +331,11 @@ export const assertionPatterns: StepPattern[] = [
278
331
  step.text.includes('should see') ||
279
332
  step.text.match(/\b(see|sees)\s+\[/)) &&
280
333
  !!step.selectorRef,
281
- generator: (step, context) => {
334
+ resolver: (step, context): StepTemplateData => {
282
335
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
283
- const code = context.templateEngine.renderStep('visible-assertion', { ...resolved, selectorRef: step.selectorRef });
284
336
  return {
285
- code,
337
+ templateName: 'visible-assertion',
338
+ data: { ...resolved, selectorRef: step.selectorRef },
286
339
  comment: `Assert ${step.selectorRef} is visible`,
287
340
  };
288
341
  },
@@ -294,11 +347,11 @@ export const assertionPatterns: StepPattern[] = [
294
347
  matcher: (step: ParsedStep) =>
295
348
  /\b(see|sees)\s+\[/.test(step.text) && /\bis hidden\b/.test(step.text) &&
296
349
  !step.dataRef && !!step.selectorRef,
297
- generator: (step, context) => {
350
+ resolver: (step, context): StepTemplateData => {
298
351
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
299
- const code = context.templateEngine.renderStep('is-hidden-assertion', { ...resolved, selectorRef: step.selectorRef });
300
352
  return {
301
- code,
353
+ templateName: 'is-hidden-assertion',
354
+ data: { ...resolved, selectorRef: step.selectorRef },
302
355
  comment: `Assert ${step.selectorRef} is not visible`,
303
356
  };
304
357
  },
@@ -308,11 +361,11 @@ export const assertionPatterns: StepPattern[] = [
308
361
  name: 'should-be-enabled',
309
362
  matcher: (step: ParsedStep) =>
310
363
  /\b(see|sees)\s+\[/.test(step.text) && /\bis enabled\b/.test(step.text) && !!step.selectorRef,
311
- generator: (step, context) => {
364
+ resolver: (step, context): StepTemplateData => {
312
365
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
313
- const code = context.templateEngine.renderStep('enabled-assertion', { ...resolved, selectorRef: step.selectorRef });
314
366
  return {
315
- code,
367
+ templateName: 'enabled-assertion',
368
+ data: { ...resolved, selectorRef: step.selectorRef },
316
369
  comment: `Assert ${step.selectorRef} is enabled`,
317
370
  };
318
371
  },
@@ -322,11 +375,11 @@ export const assertionPatterns: StepPattern[] = [
322
375
  name: 'should-be-disabled',
323
376
  matcher: (step: ParsedStep) =>
324
377
  /\b(see|sees)\s+\[/.test(step.text) && /\bis disabled\b/.test(step.text) && !!step.selectorRef,
325
- generator: (step, context) => {
378
+ resolver: (step, context): StepTemplateData => {
326
379
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
327
- const code = context.templateEngine.renderStep('disabled-assertion', { ...resolved, selectorRef: step.selectorRef });
328
380
  return {
329
- code,
381
+ templateName: 'disabled-assertion',
382
+ data: { ...resolved, selectorRef: step.selectorRef },
330
383
  comment: `Assert ${step.selectorRef} is disabled`,
331
384
  };
332
385
  },
@@ -336,15 +389,12 @@ export const assertionPatterns: StepPattern[] = [
336
389
  name: 'should-contain-text',
337
390
  matcher: (step: ParsedStep) =>
338
391
  step.text.includes('should contain') && !!step.selectorRef && !!(step.value || step.dataRef),
339
- generator: (step, context) => {
392
+ resolver: (step, context): StepTemplateData => {
340
393
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
341
394
  const expectedText = step.value || `\${${step.dataRef}}`;
342
- const code = context.templateEngine.renderStep('contain-text-assertion', {
343
- ...resolved,
344
- expectedText,
345
- });
346
395
  return {
347
- code,
396
+ templateName: 'contain-text-assertion',
397
+ data: { ...resolved, expectedText },
348
398
  comment: `Assert ${step.selectorRef} contains "${step.value || step.dataRef}"`,
349
399
  };
350
400
  },
@@ -354,15 +404,12 @@ export const assertionPatterns: StepPattern[] = [
354
404
  name: 'should-have-text',
355
405
  matcher: (step: ParsedStep) =>
356
406
  step.text.includes('should have text') && !!step.selectorRef && !!(step.value || step.dataRef),
357
- generator: (step, context) => {
407
+ resolver: (step, context): StepTemplateData => {
358
408
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
359
409
  const expectedText = step.value || `\${${step.dataRef}}`;
360
- const code = context.templateEngine.renderStep('have-text-assertion', {
361
- ...resolved,
362
- expectedText,
363
- });
364
410
  return {
365
- code,
411
+ templateName: 'have-text-assertion',
412
+ data: { ...resolved, expectedText },
366
413
  comment: `Assert ${step.selectorRef} has text "${step.value || step.dataRef}"`,
367
414
  };
368
415
  },
@@ -372,11 +419,11 @@ export const assertionPatterns: StepPattern[] = [
372
419
  name: 'is-empty',
373
420
  matcher: (step: ParsedStep) =>
374
421
  /\b(see|sees)\s+\[/.test(step.text) && /\bis empty\b/.test(step.text) && !!step.selectorRef,
375
- generator: (step, context) => {
422
+ resolver: (step, context): StepTemplateData => {
376
423
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
377
- const code = context.templateEngine.renderStep('empty-assertion', { ...resolved, selectorRef: step.selectorRef });
378
424
  return {
379
- code,
425
+ templateName: 'empty-assertion',
426
+ data: { ...resolved, selectorRef: step.selectorRef },
380
427
  comment: `Assert ${step.selectorRef} is empty`,
381
428
  };
382
429
  },
@@ -386,11 +433,11 @@ export const assertionPatterns: StepPattern[] = [
386
433
  name: 'is-checked',
387
434
  matcher: (step: ParsedStep) =>
388
435
  /\b(see|sees)\s+\[/.test(step.text) && /\bis checked\b/.test(step.text) && !!step.selectorRef,
389
- generator: (step, context) => {
436
+ resolver: (step, context): StepTemplateData => {
390
437
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
391
- const code = context.templateEngine.renderStep('checked-assertion', { ...resolved, selectorRef: step.selectorRef });
392
438
  return {
393
- code,
439
+ templateName: 'checked-assertion',
440
+ data: { ...resolved, selectorRef: step.selectorRef },
394
441
  comment: `Assert ${step.selectorRef} is checked`,
395
442
  };
396
443
  },
@@ -400,11 +447,11 @@ export const assertionPatterns: StepPattern[] = [
400
447
  name: 'is-unchecked',
401
448
  matcher: (step: ParsedStep) =>
402
449
  /\b(see|sees)\s+\[/.test(step.text) && /\bis unchecked\b/.test(step.text) && !!step.selectorRef,
403
- generator: (step, context) => {
450
+ resolver: (step, context): StepTemplateData => {
404
451
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
405
- const code = context.templateEngine.renderStep('not-checked-assertion', { ...resolved, selectorRef: step.selectorRef });
406
452
  return {
407
- code,
453
+ templateName: 'not-checked-assertion',
454
+ data: { ...resolved, selectorRef: step.selectorRef },
408
455
  comment: `Assert ${step.selectorRef} is unchecked`,
409
456
  };
410
457
  },
@@ -414,11 +461,11 @@ export const assertionPatterns: StepPattern[] = [
414
461
  name: 'is-focused',
415
462
  matcher: (step: ParsedStep) =>
416
463
  /\b(see|sees)\s+\[/.test(step.text) && /\bis focused\b/.test(step.text) && !!step.selectorRef,
417
- generator: (step, context) => {
464
+ resolver: (step, context): StepTemplateData => {
418
465
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
419
- const code = context.templateEngine.renderStep('focused-assertion', { ...resolved, selectorRef: step.selectorRef });
420
466
  return {
421
- code,
467
+ templateName: 'focused-assertion',
468
+ data: { ...resolved, selectorRef: step.selectorRef },
422
469
  comment: `Assert ${step.selectorRef} is focused`,
423
470
  };
424
471
  },
@@ -431,7 +478,7 @@ export const assertionPatterns: StepPattern[] = [
431
478
  step.text.match(/\b(see|sees)\b/)) &&
432
479
  !step.selectorRef &&
433
480
  !!step.dataRef,
434
- generator: (step, context) => {
481
+ resolver: (step, context): StepTemplateData => {
435
482
  // Resolve data reference to actual value
436
483
  let dataValue: string;
437
484
  try {
@@ -440,14 +487,13 @@ export const assertionPatterns: StepPattern[] = [
440
487
  dataValue = `\${${step.dataRef}}`;
441
488
  }
442
489
 
443
- const code = context.templateEngine.renderStep('visible-assertion', {
444
- strategy: 'text',
445
- value: dataValue,
446
- nth: 0,
447
- });
448
-
449
490
  return {
450
- code,
491
+ templateName: 'visible-assertion',
492
+ data: {
493
+ strategy: 'text',
494
+ value: dataValue,
495
+ nth: 0,
496
+ },
451
497
  comment: `Assert ${step.dataRef} is visible`,
452
498
  };
453
499
  },
@@ -459,7 +505,7 @@ export const assertionPatterns: StepPattern[] = [
459
505
  step.text.includes('should have') && step.text.includes('count') &&
460
506
  !!step.selectorRef && step.text.includes('items') &&
461
507
  (step.elementType === 'list' || step.elementType === 'list-item' || step.elementType === 'listitem'),
462
- generator: (step, context) => {
508
+ resolver: (step, context): StepTemplateData => {
463
509
  let expectedCount: number | string = 1;
464
510
 
465
511
  const match = step.text.match(/count\s+(\d+)/);
@@ -476,12 +522,9 @@ export const assertionPatterns: StepPattern[] = [
476
522
  }
477
523
 
478
524
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
479
- const code = context.templateEngine.renderStep('list-item-count-assertion', {
480
- ...resolved,
481
- expectedCount,
482
- });
483
525
  return {
484
- code,
526
+ templateName: 'list-item-count-assertion',
527
+ data: { ...resolved, expectedCount },
485
528
  comment: `Assert ${step.selectorRef} list has ${expectedCount} items`,
486
529
  };
487
530
  },
@@ -491,7 +534,7 @@ export const assertionPatterns: StepPattern[] = [
491
534
  name: 'should-have-count',
492
535
  matcher: (step: ParsedStep) =>
493
536
  step.text.includes('should have') && step.text.includes('count') && !!step.selectorRef,
494
- generator: (step, context) => {
537
+ resolver: (step, context): StepTemplateData => {
495
538
  let expectedCount: number | string = 1;
496
539
 
497
540
  // Try literal digit first: "count 10"
@@ -510,12 +553,9 @@ export const assertionPatterns: StepPattern[] = [
510
553
  }
511
554
 
512
555
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
513
- const code = context.templateEngine.renderStep('count-assertion', {
514
- ...resolved,
515
- expectedCount,
516
- });
517
556
  return {
518
- code,
557
+ templateName: 'count-assertion',
558
+ data: { ...resolved, expectedCount },
519
559
  comment: `Assert ${step.selectorRef} has count ${expectedCount}`,
520
560
  };
521
561
  },
@@ -1,10 +1,8 @@
1
1
  import { ParsedStep } from '../../gherkin-parser';
2
- import { StepPattern } from './types';
2
+ import { StepPattern, StepTemplateData } from './types';
3
3
 
4
4
  /**
5
5
  * Form action patterns: fill, type, select, check, uncheck
6
- * Uses template engine for framework-agnostic code generation
7
- * Resolvers return metadata, templates handle framework syntax
8
6
  */
9
7
  export const formPatterns: StepPattern[] = [
10
8
  {
@@ -14,7 +12,7 @@ export const formPatterns: StepPattern[] = [
14
12
  step.elementType === 'uploader' &&
15
13
  !!step.selectorRef &&
16
14
  !!(step.dataRef || step.value),
17
- generator: (step, context) => {
15
+ resolver: (step, context) => {
18
16
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
19
17
 
20
18
  let fileName: string;
@@ -28,14 +26,9 @@ export const formPatterns: StepPattern[] = [
28
26
  fileName = step.value!;
29
27
  }
30
28
 
31
- const code = context.templateEngine.renderStep('upload-action', {
32
- ...resolved,
33
- selectorRef: step.selectorRef,
34
- fileName,
35
- });
36
-
37
29
  return {
38
- code,
30
+ templateName: 'upload-action',
31
+ data: { ...resolved, selectorRef: step.selectorRef, fileName },
39
32
  comment: `Upload file ${fileName} via ${step.selectorRef}`,
40
33
  };
41
34
  },
@@ -45,31 +38,23 @@ export const formPatterns: StepPattern[] = [
45
38
  name: 'fill-input',
46
39
  matcher: (step: ParsedStep) =>
47
40
  (step.text.includes('fills') || step.text.includes('fill') || step.text.includes('inputs') || step.text.includes('input')) && !!step.selectorRef && !!(step.dataRef || step.value),
48
- generator: (step, context) => {
41
+ resolver: (step, context) => {
49
42
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
50
-
51
- // Resolve data reference to actual value
43
+
52
44
  let value: string;
53
45
  if (step.dataRef) {
54
46
  try {
55
47
  value = context.dataResolver.resolveData(step.dataRef, context.featureName);
56
48
  } catch (error) {
57
- // Fallback: keep as template literal if data resolution fails
58
49
  value = `\${${step.dataRef}}`;
59
50
  }
60
51
  } else {
61
52
  value = step.value!;
62
53
  }
63
-
64
- // Use template engine to render framework-specific code
65
- const code = context.templateEngine.renderStep('fill-action', {
66
- ...resolved, // strategy, value, role, name, selector
67
- selectorRef: step.selectorRef,
68
- fillValue: value,
69
- });
70
-
54
+
71
55
  return {
72
- code,
56
+ templateName: 'fill-action',
57
+ data: { ...resolved, selectorRef: step.selectorRef, fillValue: value },
73
58
  comment: `Fill ${step.selectorRef} with ${step.dataRef || step.value}`,
74
59
  };
75
60
  },
@@ -79,13 +64,11 @@ export const formPatterns: StepPattern[] = [
79
64
  name: 'check-checkbox',
80
65
  matcher: (step: ParsedStep) =>
81
66
  step.text.includes('checks') && !!step.selectorRef,
82
- generator: (step, context) => {
67
+ resolver: (step, context) => {
83
68
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
84
-
85
- const code = context.templateEngine.renderStep('check-action', { ...resolved, selectorRef: step.selectorRef });
86
-
87
69
  return {
88
- code,
70
+ templateName: 'check-action',
71
+ data: { ...resolved, selectorRef: step.selectorRef },
89
72
  comment: `Check ${step.selectorRef}`,
90
73
  };
91
74
  },
@@ -95,13 +78,11 @@ export const formPatterns: StepPattern[] = [
95
78
  name: 'uncheck-checkbox',
96
79
  matcher: (step: ParsedStep) =>
97
80
  step.text.includes('unchecks') && !!step.selectorRef,
98
- generator: (step, context) => {
81
+ resolver: (step, context) => {
99
82
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
100
-
101
- const code = context.templateEngine.renderStep('uncheck-action', { ...resolved, selectorRef: step.selectorRef });
102
-
103
83
  return {
104
- code,
84
+ templateName: 'uncheck-action',
85
+ data: { ...resolved, selectorRef: step.selectorRef },
105
86
  comment: `Uncheck ${step.selectorRef}`,
106
87
  };
107
88
  },
@@ -113,10 +94,9 @@ export const formPatterns: StepPattern[] = [
113
94
  (step.text.includes('selects') || step.text.match(/\bselect\b/)) &&
114
95
  !!step.selectorRef &&
115
96
  !!(step.dataRef || step.value),
116
- generator: (step, context) => {
97
+ resolver: (step, context): StepTemplateData => {
117
98
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
118
99
 
119
- // Resolve data reference to actual value
120
100
  let value: string;
121
101
  if (step.dataRef) {
122
102
  try {
@@ -128,32 +108,34 @@ export const formPatterns: StepPattern[] = [
128
108
  value = step.value!;
129
109
  }
130
110
 
131
- // Determine action based on role type
132
- // Radio buttons use check(), dropdowns use selectOption()
133
111
  const isRadio = resolved.role === 'radio' || step.text.includes('radio');
134
112
  const isCheckbox = resolved.role === 'checkbox' || step.text.includes('checkbox');
135
113
 
136
- let code: string;
114
+ let templateName: string;
115
+ let data: Record<string, any>;
116
+
137
117
  if (isRadio) {
138
- // For radio buttons, we need to find the specific radio with the value
139
- code = context.templateEngine.renderStep('radio-select-action', {
140
- ...resolved,
141
- selectorRef: step.selectorRef,
142
- selectValue: value,
143
- });
118
+ templateName = 'radio-select-action';
119
+ data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
144
120
  } else if (isCheckbox) {
145
- code = context.templateEngine.renderStep('check-action', { ...resolved, selectorRef: step.selectorRef });
121
+ templateName = 'check-action';
122
+ data = { ...resolved, selectorRef: step.selectorRef };
146
123
  } else {
147
- // Default to dropdown/combobox selectOption
148
- code = context.templateEngine.renderStep('select-action', {
149
- ...resolved,
150
- selectorRef: step.selectorRef,
151
- selectValue: value,
152
- });
124
+ const nativeSelectRoles = ['combobox', 'listbox', 'select'];
125
+ const isNativeSelect = nativeSelectRoles.includes(resolved.role);
126
+
127
+ if (isNativeSelect) {
128
+ templateName = 'select-action';
129
+ data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
130
+ } else {
131
+ templateName = 'click-select-action';
132
+ data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
133
+ }
153
134
  }
154
135
 
155
136
  return {
156
- code,
137
+ templateName,
138
+ data,
157
139
  comment: `Select ${step.dataRef || step.value} in ${step.selectorRef}`,
158
140
  };
159
141
  },
@@ -163,18 +145,14 @@ export const formPatterns: StepPattern[] = [
163
145
  name: 'clear-input',
164
146
  matcher: (step: ParsedStep) =>
165
147
  step.text.includes('clears') && !!step.selectorRef,
166
- generator: (step, context) => {
148
+ resolver: (step, context) => {
167
149
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
168
-
169
- const code = context.templateEngine.renderStep('clear-action', { ...resolved, selectorRef: step.selectorRef });
170
-
171
150
  return {
172
- code,
151
+ templateName: 'clear-action',
152
+ data: { ...resolved, selectorRef: step.selectorRef },
173
153
  comment: `Clear ${step.selectorRef}`,
174
154
  };
175
155
  },
176
156
  priority: 7,
177
157
  },
178
158
  ];
179
-
180
-
@@ -6,6 +6,7 @@ import { formPatterns } from './form-patterns';
6
6
  import { interactionPatterns } from './interaction-patterns';
7
7
  import { assertionPatterns } from './assertion-patterns';
8
8
  import { setupPatterns } from './setup-patterns';
9
+ import { legacyPatterns } from './legacy-patterns';
9
10
 
10
11
  /**
11
12
  * Pattern Registry - manages all step patterns
@@ -26,7 +27,8 @@ export class PatternRegistry {
26
27
  this.patterns.push(...formPatterns);
27
28
  this.patterns.push(...interactionPatterns);
28
29
  this.patterns.push(...assertionPatterns);
29
-
30
+ this.patterns.push(...legacyPatterns);
31
+
30
32
  // Sort by priority (higher first)
31
33
  this.patterns.sort((a, b) => (b.priority || 0) - (a.priority || 0));
32
34
  }
@@ -52,15 +54,30 @@ export class PatternRegistry {
52
54
  }
53
55
 
54
56
  /**
55
- * Generate code for a step using matched pattern
57
+ * Generate code for a step using matched pattern.
58
+ * Prefers resolver (returns template data) over generator (renders directly).
56
59
  */
57
60
  generateStep(step: ParsedStep, context: PatternContext): MappedStep | null {
58
61
  const pattern = this.findPattern(step);
59
62
  if (!pattern) {
60
63
  return null;
61
64
  }
62
-
63
- return pattern.generator(step, context);
65
+
66
+ // Prefer resolver (framework-agnostic) over generator (legacy)
67
+ if (pattern.resolver) {
68
+ const resolved = pattern.resolver(step, context);
69
+ const code = context.templateEngine.renderStep(resolved.templateName, resolved.data);
70
+ return {
71
+ code,
72
+ comment: resolved.comment,
73
+ };
74
+ }
75
+
76
+ if (pattern.generator) {
77
+ return pattern.generator(step, context);
78
+ }
79
+
80
+ return null;
64
81
  }
65
82
 
66
83
  /**
@@ -94,4 +111,5 @@ export { navigationPatterns } from './navigation-patterns';
94
111
  export { formPatterns } from './form-patterns';
95
112
  export { interactionPatterns } from './interaction-patterns';
96
113
  export { assertionPatterns } from './assertion-patterns';
114
+ export { legacyPatterns } from './legacy-patterns';
97
115
  export * from './types';