@sun-asterisk/sungen 1.0.20 → 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 (286) hide show
  1. package/dist/cli/commands/add.d.ts +3 -0
  2. package/dist/cli/commands/add.d.ts.map +1 -0
  3. package/dist/cli/commands/add.js +27 -0
  4. package/dist/cli/commands/add.js.map +1 -0
  5. package/dist/cli/commands/cache-clear.d.ts +3 -0
  6. package/dist/cli/commands/cache-clear.d.ts.map +1 -0
  7. package/dist/cli/commands/cache-clear.js +24 -0
  8. package/dist/cli/commands/cache-clear.js.map +1 -0
  9. package/dist/cli/commands/full.d.ts +3 -0
  10. package/dist/cli/commands/full.d.ts.map +1 -0
  11. package/dist/cli/commands/full.js +37 -0
  12. package/dist/cli/commands/full.js.map +1 -0
  13. package/dist/cli/commands/generate.d.ts +3 -0
  14. package/dist/cli/commands/generate.d.ts.map +1 -0
  15. package/dist/cli/commands/generate.js +53 -0
  16. package/dist/cli/commands/generate.js.map +1 -0
  17. package/dist/cli/commands/init.d.ts +3 -0
  18. package/dist/cli/commands/init.d.ts.map +1 -0
  19. package/dist/cli/commands/init.js +20 -0
  20. package/dist/cli/commands/init.js.map +1 -0
  21. package/dist/cli/commands/live-scan.d.ts +3 -0
  22. package/dist/cli/commands/live-scan.d.ts.map +1 -0
  23. package/dist/cli/commands/{live-scan-command.js → live-scan.js} +8 -15
  24. package/dist/cli/commands/live-scan.js.map +1 -0
  25. package/dist/cli/commands/makeauth.d.ts +3 -0
  26. package/dist/cli/commands/makeauth.d.ts.map +1 -0
  27. package/dist/cli/commands/makeauth.js +76 -0
  28. package/dist/cli/commands/makeauth.js.map +1 -0
  29. package/dist/cli/commands/map.d.ts +3 -0
  30. package/dist/cli/commands/map.d.ts.map +1 -0
  31. package/dist/cli/commands/map.js +93 -0
  32. package/dist/cli/commands/map.js.map +1 -0
  33. package/dist/cli/commands/validate.d.ts +3 -0
  34. package/dist/cli/commands/validate.d.ts.map +1 -0
  35. package/dist/cli/commands/validate.js +43 -0
  36. package/dist/cli/commands/validate.js.map +1 -0
  37. package/dist/cli/index.js +29 -442
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/types.d.ts +9 -0
  40. package/dist/cli/types.d.ts.map +1 -0
  41. package/dist/cli/types.js +7 -0
  42. package/dist/cli/types.js.map +1 -0
  43. package/dist/cli/utils.d.ts +6 -0
  44. package/dist/cli/utils.d.ts.map +1 -0
  45. package/dist/cli/utils.js +101 -0
  46. package/dist/cli/utils.js.map +1 -0
  47. package/dist/core/live-scanner/matrix-reader.d.ts.map +1 -1
  48. package/dist/core/live-scanner/matrix-reader.js +2 -40
  49. package/dist/core/live-scanner/matrix-reader.js.map +1 -1
  50. package/dist/core/live-scanner/step-replayer.d.ts.map +1 -1
  51. package/dist/core/live-scanner/step-replayer.js +7 -0
  52. package/dist/core/live-scanner/step-replayer.js.map +1 -1
  53. package/dist/core/validator/selector-validator.d.ts.map +1 -1
  54. package/dist/core/validator/selector-validator.js +2 -1
  55. package/dist/core/validator/selector-validator.js.map +1 -1
  56. package/dist/generators/scaffold-generator/index.d.ts +2 -1
  57. package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
  58. package/dist/generators/scaffold-generator/index.js +21 -1
  59. package/dist/generators/scaffold-generator/index.js.map +1 -1
  60. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
  61. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
  62. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
  63. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
  64. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
  65. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
  66. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
  67. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
  68. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
  69. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
  70. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
  71. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
  72. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
  73. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
  74. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
  75. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
  76. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
  77. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
  78. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
  79. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
  80. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
  81. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
  82. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
  83. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
  84. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
  85. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
  86. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
  87. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
  88. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
  89. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  90. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
  91. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
  92. package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -58
  93. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
  94. package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -2
  95. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
  96. package/dist/generators/test-generator/patterns/form-patterns.js +34 -47
  97. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
  98. package/dist/generators/test-generator/patterns/index.d.ts +3 -1
  99. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  100. package/dist/generators/test-generator/patterns/index.js +20 -3
  101. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  102. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -1
  103. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
  104. package/dist/generators/test-generator/patterns/interaction-patterns.js +44 -85
  105. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
  106. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +7 -0
  107. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +1 -0
  108. package/dist/generators/test-generator/patterns/legacy-patterns.js +98 -0
  109. package/dist/generators/test-generator/patterns/legacy-patterns.js.map +1 -0
  110. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -2
  111. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
  112. package/dist/generators/test-generator/patterns/navigation-patterns.js +14 -42
  113. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
  114. package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -1
  115. package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -1
  116. package/dist/generators/test-generator/patterns/setup-patterns.js +23 -35
  117. package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -1
  118. package/dist/generators/test-generator/patterns/types.d.ts +18 -3
  119. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  120. package/dist/generators/test-generator/step-mapper.d.ts +0 -15
  121. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  122. package/dist/generators/test-generator/step-mapper.js +4 -106
  123. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  124. package/dist/{executor/test-generator.d.ts → generators/test-generator/types.d.ts} +4 -25
  125. package/dist/generators/test-generator/types.d.ts.map +1 -0
  126. package/dist/generators/test-generator/types.js +106 -0
  127. package/dist/generators/test-generator/types.js.map +1 -0
  128. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  129. package/dist/generators/test-generator/utils/data-resolver.js +8 -17
  130. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  131. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  132. package/dist/generators/test-generator/utils/selector-resolver.js +10 -18
  133. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  134. package/dist/orchestrator/cache-manager.d.ts +1 -23
  135. package/dist/orchestrator/cache-manager.d.ts.map +1 -1
  136. package/dist/orchestrator/cache-manager.js +1 -87
  137. package/dist/orchestrator/cache-manager.js.map +1 -1
  138. package/dist/orchestrator/pipeline.d.ts +11 -28
  139. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  140. package/dist/orchestrator/pipeline.js +52 -371
  141. package/dist/orchestrator/pipeline.js.map +1 -1
  142. package/dist/orchestrator/reporter.d.ts +1 -1
  143. package/dist/orchestrator/reporter.d.ts.map +1 -1
  144. package/dist/orchestrator/screen-manager.js +1 -1
  145. package/dist/orchestrator/screen-manager.js.map +1 -1
  146. package/dist/utils/feature-finder.d.ts +9 -0
  147. package/dist/utils/feature-finder.d.ts.map +1 -0
  148. package/dist/utils/feature-finder.js +67 -0
  149. package/dist/utils/feature-finder.js.map +1 -0
  150. package/dist/utils/screen-paths.d.ts +10 -0
  151. package/dist/utils/screen-paths.d.ts.map +1 -0
  152. package/dist/utils/screen-paths.js +73 -0
  153. package/dist/utils/screen-paths.js.map +1 -0
  154. package/dist/utils/selector-loader.d.ts +6 -0
  155. package/dist/utils/selector-loader.d.ts.map +1 -0
  156. package/dist/utils/selector-loader.js +20 -0
  157. package/dist/utils/selector-loader.js.map +1 -0
  158. package/dist/utils/selector-types.d.ts +7 -0
  159. package/dist/utils/selector-types.d.ts.map +1 -0
  160. package/dist/utils/selector-types.js +19 -0
  161. package/dist/utils/selector-types.js.map +1 -0
  162. package/dist/utils/test-data-loader.d.ts +6 -0
  163. package/dist/utils/test-data-loader.d.ts.map +1 -0
  164. package/dist/utils/test-data-loader.js +20 -0
  165. package/dist/utils/test-data-loader.js.map +1 -0
  166. package/dist/utils/yaml-io.d.ts +14 -0
  167. package/dist/utils/yaml-io.d.ts.map +1 -0
  168. package/dist/utils/yaml-io.js +72 -0
  169. package/dist/utils/yaml-io.js.map +1 -0
  170. package/package.json +1 -1
  171. package/src/cli/commands/add.ts +25 -0
  172. package/src/cli/commands/cache-clear.ts +22 -0
  173. package/src/cli/commands/full.ts +35 -0
  174. package/src/cli/commands/generate.ts +55 -0
  175. package/src/cli/commands/init.ts +17 -0
  176. package/src/cli/commands/{live-scan-command.ts → live-scan.ts} +8 -17
  177. package/src/cli/commands/makeauth.ts +77 -0
  178. package/src/cli/commands/map.ts +97 -0
  179. package/src/cli/commands/validate.ts +43 -0
  180. package/src/cli/index.ts +32 -473
  181. package/src/cli/types.ts +9 -0
  182. package/src/cli/utils.ts +106 -0
  183. package/src/core/live-scanner/matrix-reader.ts +2 -8
  184. package/src/core/live-scanner/step-replayer.ts +7 -0
  185. package/src/core/validator/selector-validator.ts +3 -2
  186. package/src/generators/scaffold-generator/index.ts +23 -2
  187. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
  188. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
  189. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
  190. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
  191. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
  192. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
  193. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
  194. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
  195. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
  196. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
  197. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
  198. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
  199. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
  200. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
  201. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
  202. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
  203. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
  204. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
  205. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
  206. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
  207. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
  208. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
  209. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
  210. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
  211. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
  212. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
  213. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
  214. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
  215. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
  216. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  217. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
  218. package/src/generators/test-generator/patterns/assertion-patterns.ts +102 -62
  219. package/src/generators/test-generator/patterns/form-patterns.ts +38 -60
  220. package/src/generators/test-generator/patterns/index.ts +22 -4
  221. package/src/generators/test-generator/patterns/interaction-patterns.ts +47 -107
  222. package/src/generators/test-generator/patterns/legacy-patterns.ts +104 -0
  223. package/src/generators/test-generator/patterns/navigation-patterns.ts +27 -69
  224. package/src/generators/test-generator/patterns/setup-patterns.ts +23 -41
  225. package/src/generators/test-generator/patterns/types.ts +26 -9
  226. package/src/generators/test-generator/step-mapper.ts +4 -124
  227. package/src/generators/test-generator/types.ts +131 -0
  228. package/src/generators/test-generator/utils/data-resolver.ts +8 -13
  229. package/src/generators/test-generator/utils/selector-resolver.ts +15 -17
  230. package/src/orchestrator/cache-manager.ts +1 -107
  231. package/src/orchestrator/pipeline.ts +58 -433
  232. package/src/orchestrator/reporter.ts +1 -1
  233. package/src/orchestrator/screen-manager.ts +1 -1
  234. package/src/utils/feature-finder.ts +33 -0
  235. package/src/utils/screen-paths.ts +37 -0
  236. package/src/utils/selector-loader.ts +23 -0
  237. package/src/utils/selector-types.ts +17 -0
  238. package/src/utils/test-data-loader.ts +23 -0
  239. package/src/utils/yaml-io.ts +33 -0
  240. package/dist/cli/commands/auto-tag-command.d.ts +0 -8
  241. package/dist/cli/commands/auto-tag-command.d.ts.map +0 -1
  242. package/dist/cli/commands/auto-tag-command.js +0 -104
  243. package/dist/cli/commands/auto-tag-command.js.map +0 -1
  244. package/dist/cli/commands/live-scan-command.d.ts +0 -9
  245. package/dist/cli/commands/live-scan-command.d.ts.map +0 -1
  246. package/dist/cli/commands/live-scan-command.js.map +0 -1
  247. package/dist/executor/playwright/playwright-generator.d.ts +0 -33
  248. package/dist/executor/playwright/playwright-generator.d.ts.map +0 -1
  249. package/dist/executor/playwright/playwright-generator.js +0 -136
  250. package/dist/executor/playwright/playwright-generator.js.map +0 -1
  251. package/dist/executor/test-generator.d.ts.map +0 -1
  252. package/dist/executor/test-generator.js +0 -30
  253. package/dist/executor/test-generator.js.map +0 -1
  254. package/dist/generators/cli.d.ts +0 -7
  255. package/dist/generators/cli.d.ts.map +0 -1
  256. package/dist/generators/cli.js +0 -570
  257. package/dist/generators/cli.js.map +0 -1
  258. package/dist/input/cli-adapter.d.ts +0 -75
  259. package/dist/input/cli-adapter.d.ts.map +0 -1
  260. package/dist/input/cli-adapter.js +0 -218
  261. package/dist/input/cli-adapter.js.map +0 -1
  262. package/dist/input/config-adapter.d.ts +0 -25
  263. package/dist/input/config-adapter.d.ts.map +0 -1
  264. package/dist/input/config-adapter.js +0 -70
  265. package/dist/input/config-adapter.js.map +0 -1
  266. package/dist/input/input-adapter.d.ts +0 -28
  267. package/dist/input/input-adapter.d.ts.map +0 -1
  268. package/dist/input/input-adapter.js +0 -17
  269. package/dist/input/input-adapter.js.map +0 -1
  270. package/dist/input/vscode-adapter.d.ts +0 -62
  271. package/dist/input/vscode-adapter.d.ts.map +0 -1
  272. package/dist/input/vscode-adapter.js +0 -64
  273. package/dist/input/vscode-adapter.js.map +0 -1
  274. package/dist/tools/auto-tagger.d.ts +0 -107
  275. package/dist/tools/auto-tagger.d.ts.map +0 -1
  276. package/dist/tools/auto-tagger.js +0 -502
  277. package/dist/tools/auto-tagger.js.map +0 -1
  278. package/src/cli/commands/auto-tag-command.ts +0 -80
  279. package/src/executor/playwright/playwright-generator.ts +0 -125
  280. package/src/executor/test-generator.ts +0 -90
  281. package/src/generators/cli.ts +0 -640
  282. package/src/input/cli-adapter.ts +0 -233
  283. package/src/input/config-adapter.ts +0 -71
  284. package/src/input/input-adapter.ts +0 -32
  285. package/src/input/vscode-adapter.ts +0 -90
  286. package/src/tools/auto-tagger.ts +0 -572
@@ -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';
@@ -14,7 +14,6 @@ function extractWaitState(text: string): string {
14
14
 
15
15
  /**
16
16
  * Map a plain element keyword (no brackets) to a Playwright ARIA role.
17
- * e.g. "dialog" → "dialog", "modal" → "dialog", "alert" → "alertdialog"
18
17
  */
19
18
  function elementKeywordToRole(text: string): string | null {
20
19
  const match = text.match(/\bwait(?:s)?\s+for\s+(dialog|modal|alert|alertdialog|tooltip|menu|listbox|combobox|grid|table|status|banner|navigation|main|region)\b/i);
@@ -29,32 +28,21 @@ function elementKeywordToRole(text: string): string | null {
29
28
 
30
29
  /**
31
30
  * Interaction patterns: click, hover, press, wait
32
- * Uses template engine for framework-agnostic code generation
33
31
  */
34
32
  export const interactionPatterns: StepPattern[] = [
35
- // Unknown element with variable pattern (selector value is empty, identified by filter)
36
- // Matches: "When User click [target order] row with {{order_name}}"
37
- // Generates: await page.getByText('').filter({ hasText: /.*value of order_name$/ }).click();
38
33
  {
39
34
  name: 'unknown-element-action',
40
35
  matcher: (step: ParsedStep) => {
41
- // Check if selectorRef starts with "target " (target element indicator)
42
36
  const isTargetElement = step.selectorRef && /^target\s/i.test(step.selectorRef);
43
- // Must have both selector and variable, and "with" clause
44
- // But EXCLUDE assertion verbs (see, sees) - those should use assertion patterns
45
37
  const isInteractionAction = !step.text.includes('see') && !step.text.includes('sees');
46
38
  return isTargetElement && !!step.dataRef && step.text.includes('with') && isInteractionAction;
47
39
  },
48
- generator: (step, context) => {
49
- // Resolve selector value from YAML (e.g., target.order)
40
+ resolver: (step, context) => {
50
41
  let selectorValue = '';
51
42
  let nth = 0;
52
43
  try {
53
44
  const resolved = context.selectorResolver.resolveSelector(
54
- step.selectorRef!,
55
- context.featureName,
56
- step.elementType,
57
- step.nth
45
+ step.selectorRef!, context.featureName, step.elementType, step.nth
58
46
  );
59
47
  selectorValue = resolved.value || '';
60
48
  nth = resolved.nth || 0;
@@ -63,7 +51,6 @@ export const interactionPatterns: StepPattern[] = [
63
51
  nth = 0;
64
52
  }
65
53
 
66
- // Resolve data variable value
67
54
  let dataValue: string;
68
55
  try {
69
56
  dataValue = context.dataResolver.resolveData(step.dataRef!, context.featureName);
@@ -71,27 +58,17 @@ export const interactionPatterns: StepPattern[] = [
71
58
  dataValue = `\${${step.dataRef}}`;
72
59
  }
73
60
 
74
- // Determine the action method (click, hover, etc.)
75
61
  let actionMethod = 'click';
76
- if (step.text.includes('hover')) {
77
- actionMethod = 'hover';
78
- } else if (step.text.includes('double')) {
79
- actionMethod = 'dblclick';
80
- }
81
-
82
- const code = context.templateEngine.renderStep('unknown-element-action', {
83
- selectorValue,
84
- dataValue,
85
- action: actionMethod,
86
- nth,
87
- });
62
+ if (step.text.includes('hover')) actionMethod = 'hover';
63
+ else if (step.text.includes('double')) actionMethod = 'dblclick';
88
64
 
89
65
  return {
90
- code,
66
+ templateName: 'unknown-element-action',
67
+ data: { selectorValue, dataValue, action: actionMethod, nth },
91
68
  comment: `${actionMethod.charAt(0).toUpperCase() + actionMethod.slice(1)} ${step.selectorRef} with ${step.dataRef}`,
92
69
  };
93
70
  },
94
- priority: 15, // Highest priority - match before all other interaction patterns
71
+ priority: 15,
95
72
  },
96
73
  {
97
74
  name: 'click-element-with-text',
@@ -100,7 +77,7 @@ export const interactionPatterns: StepPattern[] = [
100
77
  && !!step.selectorRef
101
78
  && !!(step.dataRef || step.value)
102
79
  && step.text.includes('with'),
103
- generator: (step, context) => {
80
+ resolver: (step, context) => {
104
81
  const resolved = context.selectorResolver.resolveSelector(
105
82
  step.selectorRef!, undefined, step.elementType, step.nth
106
83
  );
@@ -116,16 +93,11 @@ export const interactionPatterns: StepPattern[] = [
116
93
  }
117
94
  }
118
95
 
119
- // When using .filter({ hasText }), name is redundant — data value identifies the element
120
96
  const { name: _name, ...resolvedWithoutName } = resolved;
121
97
 
122
- const code = context.templateEngine.renderStep('click-element-with-text', {
123
- ...resolvedWithoutName,
124
- dataValue,
125
- });
126
-
127
98
  return {
128
- code,
99
+ templateName: 'click-element-with-text',
100
+ data: { ...resolvedWithoutName, dataValue },
129
101
  comment: `Click ${step.selectorRef} with text ${step.dataRef || step.value}`,
130
102
  };
131
103
  },
@@ -135,13 +107,11 @@ export const interactionPatterns: StepPattern[] = [
135
107
  name: 'click-element',
136
108
  matcher: (step: ParsedStep) =>
137
109
  (step.text.includes('clicks') || step.text.includes('click')) && !!step.selectorRef,
138
- generator: (step, context) => {
110
+ resolver: (step, context) => {
139
111
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
140
-
141
- const code = context.templateEngine.renderStep('click-action', { ...resolved, selectorRef: step.selectorRef });
142
-
143
112
  return {
144
- code,
113
+ templateName: 'click-action',
114
+ data: { ...resolved, selectorRef: step.selectorRef },
145
115
  comment: `Click ${step.selectorRef}`,
146
116
  };
147
117
  },
@@ -152,13 +122,11 @@ export const interactionPatterns: StepPattern[] = [
152
122
  matcher: (step: ParsedStep) =>
153
123
  (step.text.includes('double click') || step.text.includes('double-click') ||
154
124
  (step.text.includes('double') && step.text.includes('clicks'))) && !!step.selectorRef,
155
- generator: (step, context) => {
125
+ resolver: (step, context) => {
156
126
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
157
-
158
- const code = context.templateEngine.renderStep('double-click-action', { ...resolved, selectorRef: step.selectorRef });
159
-
160
127
  return {
161
- code,
128
+ templateName: 'double-click-action',
129
+ data: { ...resolved, selectorRef: step.selectorRef },
162
130
  comment: `Double click ${step.selectorRef}`,
163
131
  };
164
132
  },
@@ -168,13 +136,11 @@ export const interactionPatterns: StepPattern[] = [
168
136
  name: 'hover-element',
169
137
  matcher: (step: ParsedStep) =>
170
138
  step.text.includes('hovers') && !!step.selectorRef,
171
- generator: (step, context) => {
139
+ resolver: (step, context) => {
172
140
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
173
-
174
- const code = context.templateEngine.renderStep('hover-action', { ...resolved, selectorRef: step.selectorRef });
175
-
176
141
  return {
177
- code,
142
+ templateName: 'hover-action',
143
+ data: { ...resolved, selectorRef: step.selectorRef },
178
144
  comment: `Hover ${step.selectorRef}`,
179
145
  };
180
146
  },
@@ -184,16 +150,11 @@ export const interactionPatterns: StepPattern[] = [
184
150
  name: 'press-enter',
185
151
  matcher: (step: ParsedStep) =>
186
152
  step.text.includes('presses') && step.text.includes('Enter') && !!step.selectorRef,
187
- generator: (step, context) => {
153
+ resolver: (step, context) => {
188
154
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
189
-
190
- const code = context.templateEngine.renderStep('press-action', {
191
- ...resolved,
192
- key: 'Enter',
193
- });
194
-
195
155
  return {
196
- code,
156
+ templateName: 'press-action',
157
+ data: { ...resolved, key: 'Enter' },
197
158
  comment: `Press Enter in ${step.selectorRef}`,
198
159
  };
199
160
  },
@@ -203,8 +164,7 @@ export const interactionPatterns: StepPattern[] = [
203
164
  name: 'click-by-data-text',
204
165
  matcher: (step: ParsedStep) =>
205
166
  (step.text.includes('clicks') || step.text.includes('click')) && !step.selectorRef && !!step.dataRef,
206
- generator: (step, context) => {
207
- // Resolve data reference to actual value
167
+ resolver: (step, context) => {
208
168
  let value: string;
209
169
  try {
210
170
  value = context.dataResolver.resolveData(step.dataRef!, context.featureName);
@@ -212,43 +172,36 @@ export const interactionPatterns: StepPattern[] = [
212
172
  value = `\${${step.dataRef}}`;
213
173
  }
214
174
 
215
- const code = context.templateEngine.renderStep('click-action', {
216
- strategy: 'text',
217
- value,
218
- nth: 0,
219
- });
220
-
221
175
  return {
222
- code,
176
+ templateName: 'click-action',
177
+ data: { strategy: 'text', value, nth: 0 },
223
178
  comment: `Click ${step.dataRef}`,
224
179
  };
225
180
  },
226
- priority: 5, // Lower than click-element which has selectorRef
181
+ priority: 5,
227
182
  },
228
183
  {
229
184
  name: 'wait-for-time',
230
185
  matcher: (step: ParsedStep) =>
231
186
  (step.text.includes('wait for') || step.text.includes('waits for')) && /\d+/.test(step.text),
232
- generator: (step, context) => {
187
+ resolver: (step, context) => {
233
188
  const match = step.text.match(/(\d+)\s*(seconds?|ms|milliseconds?)/);
234
189
  let duration = 1000;
235
-
190
+
236
191
  if (match) {
237
192
  const num = parseInt(match[1]);
238
193
  const unit = match[2].toLowerCase();
239
194
  duration = unit.startsWith('s') ? num * 1000 : num;
240
195
  }
241
-
242
- const code = context.templateEngine.renderStep('wait-timeout', { duration });
243
-
196
+
244
197
  return {
245
- code,
198
+ templateName: 'wait-timeout',
199
+ data: { duration },
246
200
  comment: `Wait for ${duration}ms`,
247
201
  };
248
202
  },
249
203
  priority: 7,
250
204
  },
251
- // "wait for dialog with {{kudo.title}} hidden" - role keyword inline, no selector brackets, with data filter
252
205
  {
253
206
  name: 'wait-for-role-with-text',
254
207
  matcher: (step: ParsedStep) =>
@@ -256,7 +209,7 @@ export const interactionPatterns: StepPattern[] = [
256
209
  !step.selectorRef &&
257
210
  !!step.dataRef &&
258
211
  !!elementKeywordToRole(step.text),
259
- generator: (step, context) => {
212
+ resolver: (step, context) => {
260
213
  const role = elementKeywordToRole(step.text)!;
261
214
 
262
215
  let dataValue: string;
@@ -268,15 +221,14 @@ export const interactionPatterns: StepPattern[] = [
268
221
 
269
222
  const state = extractWaitState(step.text);
270
223
 
271
- // Render inline — no locator partial needed, role is known directly
272
224
  return {
273
- code: `await page.getByRole('${role}').filter({ hasText: '${dataValue.replace(/'/g, "\\'")}' }).waitFor({ state: '${state}' });`,
225
+ templateName: 'wait-for-role-with-data',
226
+ data: { role, dataValue, state },
274
227
  comment: `Wait for ${role} with ${step.dataRef} to be ${state}`,
275
228
  };
276
229
  },
277
230
  priority: 11,
278
231
  },
279
- // "wait for dialog hidden" - role keyword inline, no selector brackets, no data filter
280
232
  {
281
233
  name: 'wait-for-role',
282
234
  matcher: (step: ParsedStep) =>
@@ -284,32 +236,32 @@ export const interactionPatterns: StepPattern[] = [
284
236
  !step.selectorRef &&
285
237
  !step.dataRef &&
286
238
  !!elementKeywordToRole(step.text),
287
- generator: (step, context) => {
239
+ resolver: (step, context) => {
288
240
  const role = elementKeywordToRole(step.text)!;
289
241
  const state = extractWaitState(step.text);
290
242
 
291
243
  return {
292
- code: `await page.getByRole('${role}').waitFor({ state: '${state}' });`,
244
+ templateName: 'wait-for-role',
245
+ data: { role, state },
293
246
  comment: `Wait for ${role} to be ${state}`,
294
247
  };
295
248
  },
296
249
  priority: 11,
297
250
  },
298
- // NEW: Wait for page pattern
299
251
  {
300
252
  name: 'wait-for-page',
301
253
  matcher: (step: ParsedStep) =>
302
254
  (step.text.includes('wait for') || step.text.includes('waits for')) && step.elementType === 'page',
303
- generator: (step, context) => {
255
+ resolver: (step, context) => {
304
256
  const path = step.featurePath || '/';
305
257
  const pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
306
- const code = context.templateEngine.renderStep('wait-for-page', { pathRegex });
307
258
  return {
308
- code,
259
+ templateName: 'wait-for-page',
260
+ data: { pathRegex },
309
261
  comment: `Wait for page`,
310
262
  };
311
263
  },
312
- priority: 9, // Higher than wait-for-element
264
+ priority: 9,
313
265
  },
314
266
  {
315
267
  name: 'wait-for-element-with-text',
@@ -317,7 +269,7 @@ export const interactionPatterns: StepPattern[] = [
317
269
  (step.text.includes('wait for') || step.text.includes('waits for')) &&
318
270
  !!step.selectorRef &&
319
271
  !!step.dataRef,
320
- generator: (step, context) => {
272
+ resolver: (step, context) => {
321
273
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
322
274
 
323
275
  let dataValue: string;
@@ -329,15 +281,9 @@ export const interactionPatterns: StepPattern[] = [
329
281
 
330
282
  const state = extractWaitState(step.text);
331
283
 
332
- const code = context.templateEngine.renderStep('wait-for-element-with-text', {
333
- ...resolved,
334
- selectorRef: step.selectorRef,
335
- dataValue,
336
- state,
337
- });
338
-
339
284
  return {
340
- code,
285
+ templateName: 'wait-for-element-with-text',
286
+ data: { ...resolved, selectorRef: step.selectorRef, dataValue, state },
341
287
  comment: `Wait for ${step.selectorRef} with ${step.dataRef} to be ${state}`,
342
288
  };
343
289
  },
@@ -347,22 +293,16 @@ export const interactionPatterns: StepPattern[] = [
347
293
  name: 'wait-for-element',
348
294
  matcher: (step: ParsedStep) =>
349
295
  (step.text.includes('wait for') || step.text.includes('waits for')) && !!step.selectorRef,
350
- generator: (step, context) => {
296
+ resolver: (step, context) => {
351
297
  const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
352
298
  const state = extractWaitState(step.text);
353
299
 
354
- const code = context.templateEngine.renderStep('wait-for-element', {
355
- ...resolved,
356
- selectorRef: step.selectorRef,
357
- state,
358
- });
359
-
360
300
  return {
361
- code,
301
+ templateName: 'wait-for-element',
302
+ data: { ...resolved, selectorRef: step.selectorRef, state },
362
303
  comment: `Wait for ${step.selectorRef} to be ${state}`,
363
304
  };
364
305
  },
365
306
  priority: 8,
366
307
  },
367
308
  ];
368
-