@sun-asterisk/sungen 3.1.1 → 3.1.2-beta.100

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 (162) hide show
  1. package/README.md +4 -428
  2. package/dist/capabilities/builtins.d.ts +31 -0
  3. package/dist/capabilities/builtins.d.ts.map +1 -0
  4. package/dist/capabilities/builtins.js +84 -0
  5. package/dist/capabilities/builtins.js.map +1 -0
  6. package/dist/capabilities/context-router.d.ts +34 -0
  7. package/dist/capabilities/context-router.d.ts.map +1 -0
  8. package/dist/capabilities/context-router.js +49 -0
  9. package/dist/capabilities/context-router.js.map +1 -0
  10. package/dist/capabilities/context.d.ts +51 -0
  11. package/dist/capabilities/context.d.ts.map +1 -0
  12. package/dist/capabilities/context.js +17 -0
  13. package/dist/capabilities/context.js.map +1 -0
  14. package/dist/capabilities/discover.d.ts +2 -0
  15. package/dist/capabilities/discover.d.ts.map +1 -0
  16. package/dist/capabilities/discover.js +48 -0
  17. package/dist/capabilities/discover.js.map +1 -0
  18. package/dist/capabilities/registry.d.ts +90 -0
  19. package/dist/capabilities/registry.d.ts.map +1 -0
  20. package/dist/capabilities/registry.js +43 -0
  21. package/dist/capabilities/registry.js.map +1 -0
  22. package/dist/capabilities/sensor.d.ts +49 -0
  23. package/dist/capabilities/sensor.d.ts.map +1 -0
  24. package/dist/capabilities/sensor.js +3 -0
  25. package/dist/capabilities/sensor.js.map +1 -0
  26. package/dist/cli/commands/generate.d.ts.map +1 -1
  27. package/dist/cli/commands/generate.js +7 -3
  28. package/dist/cli/commands/generate.js.map +1 -1
  29. package/dist/cli/index.js +10 -1
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/exporters/spec-parser.d.ts.map +1 -1
  32. package/dist/exporters/spec-parser.js +4 -1
  33. package/dist/exporters/spec-parser.js.map +1 -1
  34. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +1 -0
  35. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
  36. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +1 -0
  37. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
  38. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
  39. package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
  40. package/dist/generators/test-generator/code-generator.d.ts +18 -9
  41. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  42. package/dist/generators/test-generator/code-generator.js +76 -119
  43. package/dist/generators/test-generator/code-generator.js.map +1 -1
  44. package/dist/generators/test-generator/patterns/index.d.ts +0 -10
  45. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  46. package/dist/generators/test-generator/patterns/index.js +10 -47
  47. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  48. package/dist/generators/test-generator/template-engine.d.ts +1 -0
  49. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  50. package/dist/generators/test-generator/template-engine.js +1 -1
  51. package/dist/generators/test-generator/template-engine.js.map +1 -1
  52. package/dist/harness/annotation-overrides.d.ts +9 -0
  53. package/dist/harness/annotation-overrides.d.ts.map +1 -0
  54. package/dist/harness/annotation-overrides.js +36 -0
  55. package/dist/harness/annotation-overrides.js.map +1 -0
  56. package/dist/harness/audit.d.ts.map +1 -1
  57. package/dist/harness/audit.js +35 -7
  58. package/dist/harness/audit.js.map +1 -1
  59. package/dist/harness/catalog/drivers.yaml +35 -12
  60. package/dist/harness/parse.d.ts +1 -0
  61. package/dist/harness/parse.d.ts.map +1 -1
  62. package/dist/harness/parse.js +13 -4
  63. package/dist/harness/parse.js.map +1 -1
  64. package/dist/index.d.ts +20 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +32 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +4 -3
  69. package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +1 -0
  70. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +3 -0
  71. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +4 -3
  72. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +1 -0
  73. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +3 -0
  74. package/dist/orchestrator/templates/specs-api.d.ts +19 -0
  75. package/dist/orchestrator/templates/specs-api.d.ts.map +1 -0
  76. package/dist/orchestrator/templates/specs-api.js +128 -0
  77. package/dist/orchestrator/templates/specs-api.js.map +1 -0
  78. package/dist/orchestrator/templates/specs-api.ts +101 -0
  79. package/package.json +7 -30
  80. package/src/capabilities/builtins.ts +85 -0
  81. package/src/capabilities/context-router.ts +66 -0
  82. package/src/capabilities/context.ts +46 -0
  83. package/src/capabilities/discover.ts +42 -0
  84. package/src/capabilities/registry.ts +111 -0
  85. package/src/capabilities/sensor.ts +47 -0
  86. package/src/cli/commands/generate.ts +7 -3
  87. package/src/cli/index.ts +10 -1
  88. package/src/exporters/spec-parser.ts +4 -1
  89. package/src/generators/test-generator/adapters/adapter-interface.ts +1 -1
  90. package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +1 -1
  91. package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
  92. package/src/generators/test-generator/code-generator.ts +71 -118
  93. package/src/generators/test-generator/patterns/index.ts +9 -35
  94. package/src/generators/test-generator/template-engine.ts +2 -2
  95. package/src/harness/annotation-overrides.ts +25 -0
  96. package/src/harness/audit.ts +37 -8
  97. package/src/harness/catalog/drivers.yaml +35 -12
  98. package/src/harness/parse.ts +7 -2
  99. package/src/index.ts +30 -0
  100. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +4 -3
  101. package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +1 -0
  102. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +3 -0
  103. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +4 -3
  104. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +1 -0
  105. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +3 -0
  106. package/src/orchestrator/templates/specs-api.ts +101 -0
  107. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts +0 -7
  108. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +0 -1
  109. package/dist/generators/test-generator/patterns/assertion-patterns.js +0 -626
  110. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +0 -1
  111. package/dist/generators/test-generator/patterns/capture-patterns.d.ts +0 -21
  112. package/dist/generators/test-generator/patterns/capture-patterns.d.ts.map +0 -1
  113. package/dist/generators/test-generator/patterns/capture-patterns.js +0 -87
  114. package/dist/generators/test-generator/patterns/capture-patterns.js.map +0 -1
  115. package/dist/generators/test-generator/patterns/database-patterns.d.ts +0 -6
  116. package/dist/generators/test-generator/patterns/database-patterns.d.ts.map +0 -1
  117. package/dist/generators/test-generator/patterns/database-patterns.js +0 -95
  118. package/dist/generators/test-generator/patterns/database-patterns.js.map +0 -1
  119. package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -6
  120. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +0 -1
  121. package/dist/generators/test-generator/patterns/form-patterns.js +0 -160
  122. package/dist/generators/test-generator/patterns/form-patterns.js.map +0 -1
  123. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -6
  124. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +0 -1
  125. package/dist/generators/test-generator/patterns/interaction-patterns.js +0 -433
  126. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +0 -1
  127. package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +0 -7
  128. package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +0 -1
  129. package/dist/generators/test-generator/patterns/keyboard-patterns.js +0 -47
  130. package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +0 -1
  131. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -6
  132. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +0 -1
  133. package/dist/generators/test-generator/patterns/navigation-patterns.js +0 -125
  134. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +0 -1
  135. package/dist/generators/test-generator/patterns/scope-patterns.d.ts +0 -7
  136. package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +0 -1
  137. package/dist/generators/test-generator/patterns/scope-patterns.js +0 -36
  138. package/dist/generators/test-generator/patterns/scope-patterns.js.map +0 -1
  139. package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +0 -7
  140. package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +0 -1
  141. package/dist/generators/test-generator/patterns/scroll-patterns.js +0 -25
  142. package/dist/generators/test-generator/patterns/scroll-patterns.js.map +0 -1
  143. package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -6
  144. package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +0 -1
  145. package/dist/generators/test-generator/patterns/setup-patterns.js +0 -72
  146. package/dist/generators/test-generator/patterns/setup-patterns.js.map +0 -1
  147. package/dist/generators/test-generator/patterns/table-patterns.d.ts +0 -19
  148. package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +0 -1
  149. package/dist/generators/test-generator/patterns/table-patterns.js +0 -239
  150. package/dist/generators/test-generator/patterns/table-patterns.js.map +0 -1
  151. package/docs/orchestration-spec.md +0 -267
  152. package/src/generators/test-generator/patterns/assertion-patterns.ts +0 -691
  153. package/src/generators/test-generator/patterns/capture-patterns.ts +0 -97
  154. package/src/generators/test-generator/patterns/database-patterns.ts +0 -96
  155. package/src/generators/test-generator/patterns/form-patterns.ts +0 -167
  156. package/src/generators/test-generator/patterns/interaction-patterns.ts +0 -465
  157. package/src/generators/test-generator/patterns/keyboard-patterns.ts +0 -51
  158. package/src/generators/test-generator/patterns/navigation-patterns.ts +0 -140
  159. package/src/generators/test-generator/patterns/scope-patterns.ts +0 -40
  160. package/src/generators/test-generator/patterns/scroll-patterns.ts +0 -27
  161. package/src/generators/test-generator/patterns/setup-patterns.ts +0 -76
  162. package/src/generators/test-generator/patterns/table-patterns.ts +0 -279
@@ -1,433 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.interactionPatterns = void 0;
4
- /**
5
- * Extract Playwright waitFor state from step text.
6
- * Defaults to 'visible' if no known state keyword is found.
7
- */
8
- function extractWaitState(text) {
9
- if (/\bhidden\b/.test(text))
10
- return 'hidden';
11
- if (/\bdetached\b/.test(text))
12
- return 'detached';
13
- if (/\bvisible\b/.test(text))
14
- return 'visible';
15
- return 'visible';
16
- }
17
- /**
18
- * Map a plain element keyword (no brackets) to a Playwright ARIA role.
19
- */
20
- function elementKeywordToRole(text) {
21
- 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);
22
- if (!match)
23
- return null;
24
- const keyword = match[1].toLowerCase();
25
- const roleMap = {
26
- modal: 'dialog',
27
- alert: 'alertdialog',
28
- };
29
- return roleMap[keyword] || keyword;
30
- }
31
- /**
32
- * Interaction patterns: click, hover, press, wait, alert
33
- */
34
- exports.interactionPatterns = [
35
- // === Browser Alert (system dialog) patterns ===
36
- // These must appear BEFORE the click that triggers the alert in Gherkin:
37
- // When User click [OK] alert ← registers page.once('dialog', ...)
38
- // And User click [Delete] button ← triggers the alert
39
- {
40
- name: 'alert-accept',
41
- matcher: (step) => step.elementType === 'alert' &&
42
- (step.text.includes('click') || step.text.includes('clicks')) &&
43
- !step.dataRef &&
44
- !!(step.selectorRef && /^(ok|accept|yes|confirm)$/i.test(step.selectorRef)),
45
- resolver: (step, context) => {
46
- return {
47
- templateName: 'alert-accept-action',
48
- data: {},
49
- comment: `Accept browser alert`,
50
- };
51
- },
52
- priority: 20,
53
- },
54
- {
55
- name: 'alert-dismiss',
56
- matcher: (step) => step.elementType === 'alert' &&
57
- (step.text.includes('click') || step.text.includes('clicks')) &&
58
- !step.dataRef &&
59
- !!(step.selectorRef && /^(cancel|dismiss|no)$/i.test(step.selectorRef)),
60
- resolver: (step, context) => {
61
- return {
62
- templateName: 'alert-dismiss-action',
63
- data: {},
64
- comment: `Dismiss browser alert`,
65
- };
66
- },
67
- priority: 20,
68
- },
69
- {
70
- name: 'alert-fill',
71
- matcher: (step) => step.elementType === 'alert' &&
72
- step.text.includes('fill') &&
73
- !!step.dataRef,
74
- resolver: (step, context) => {
75
- let fillValue;
76
- try {
77
- fillValue = context.dataResolver.resolveData(step.dataRef, context.featureName);
78
- }
79
- catch {
80
- fillValue = `\${${step.dataRef}}`;
81
- }
82
- return {
83
- templateName: 'alert-fill-action',
84
- data: { fillValue },
85
- comment: `Fill browser prompt with ${step.dataRef}`,
86
- };
87
- },
88
- priority: 20,
89
- },
90
- {
91
- name: 'unknown-element-action',
92
- matcher: (step) => {
93
- const isTargetElement = step.selectorRef && /^target\s/i.test(step.selectorRef);
94
- const isInteractionAction = !step.text.includes('see') && !step.text.includes('sees');
95
- return isTargetElement && !!step.dataRef && step.text.includes('with') && isInteractionAction;
96
- },
97
- resolver: (step, context) => {
98
- let selectorValue = '';
99
- let nth;
100
- try {
101
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
102
- selectorValue = resolved.value || '';
103
- nth = resolved.nth;
104
- }
105
- catch (error) {
106
- selectorValue = '';
107
- nth = undefined;
108
- }
109
- let dataValue;
110
- try {
111
- dataValue = context.dataResolver.resolveData(step.dataRef, context.featureName);
112
- }
113
- catch (error) {
114
- dataValue = `\${${step.dataRef}}`;
115
- }
116
- let actionMethod = 'click';
117
- if (step.text.includes('hover'))
118
- actionMethod = 'hover';
119
- else if (step.text.includes('double'))
120
- actionMethod = 'dblclick';
121
- return {
122
- templateName: 'unknown-element-action',
123
- data: { selectorValue, dataValue, action: actionMethod, nth },
124
- comment: `${actionMethod.charAt(0).toUpperCase() + actionMethod.slice(1)} ${step.selectorRef} with ${step.dataRef}`,
125
- };
126
- },
127
- priority: 14, // Below click-element-with-text (15) so known selectors use proper locator
128
- },
129
- {
130
- name: 'click-element-with-text',
131
- matcher: (step) => (step.text.includes('clicks') || step.text.includes('click'))
132
- && !!step.selectorRef
133
- && !!(step.dataRef || step.value)
134
- && step.text.includes('with'),
135
- resolver: (step, context) => {
136
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
137
- let dataValue;
138
- if (step.value) {
139
- dataValue = step.value;
140
- }
141
- else {
142
- try {
143
- dataValue = context.dataResolver.resolveData(step.dataRef, context.featureName);
144
- }
145
- catch {
146
- dataValue = `\${${step.dataRef}}`;
147
- }
148
- }
149
- const { name: _name, ...resolvedWithoutName } = resolved;
150
- return {
151
- templateName: 'click-element-with-text',
152
- data: { ...resolvedWithoutName, dataValue },
153
- comment: `Click ${step.selectorRef} with text ${step.dataRef || step.value}`,
154
- };
155
- },
156
- priority: 15,
157
- },
158
- {
159
- name: 'click-element',
160
- matcher: (step) => (step.text.includes('clicks') || step.text.includes('click')) && !!step.selectorRef,
161
- resolver: (step, context) => {
162
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
163
- return {
164
- templateName: 'click-action',
165
- data: { ...resolved, selectorRef: step.selectorRef },
166
- comment: `Click ${step.selectorRef}`,
167
- };
168
- },
169
- priority: 10,
170
- },
171
- {
172
- name: 'double-click',
173
- matcher: (step) => (step.text.includes('double click') || step.text.includes('double-click') ||
174
- (step.text.includes('double') && step.text.includes('clicks'))) && !!step.selectorRef,
175
- resolver: (step, context) => {
176
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
177
- return {
178
- templateName: 'double-click-action',
179
- data: { ...resolved, selectorRef: step.selectorRef },
180
- comment: `Double click ${step.selectorRef}`,
181
- };
182
- },
183
- priority: 11,
184
- },
185
- {
186
- name: 'hover-element',
187
- matcher: (step) => (step.text.includes('hovers') || step.text.match(/\bhover\b/)) && !!step.selectorRef,
188
- resolver: (step, context) => {
189
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
190
- return {
191
- templateName: 'hover-action',
192
- data: { ...resolved, selectorRef: step.selectorRef },
193
- comment: `Hover ${step.selectorRef}`,
194
- };
195
- },
196
- priority: 8,
197
- },
198
- {
199
- name: 'click-by-data-text',
200
- matcher: (step) => (step.text.includes('clicks') || step.text.includes('click')) && !step.selectorRef && !!step.dataRef,
201
- resolver: (step, context) => {
202
- let value;
203
- try {
204
- value = context.dataResolver.resolveData(step.dataRef, context.featureName);
205
- }
206
- catch (error) {
207
- value = `\${${step.dataRef}}`;
208
- }
209
- return {
210
- templateName: 'click-action',
211
- data: { strategy: 'text', value },
212
- comment: `Click ${step.dataRef}`,
213
- };
214
- },
215
- priority: 5,
216
- },
217
- {
218
- name: 'wait-for-time',
219
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) && /\d+/.test(step.text),
220
- resolver: (step, context) => {
221
- const match = step.text.match(/(\d+)\s*(seconds?|ms|milliseconds?)/);
222
- let duration = 1000;
223
- if (match) {
224
- const num = parseInt(match[1]);
225
- const unit = match[2].toLowerCase();
226
- duration = unit.startsWith('s') ? num * 1000 : num;
227
- }
228
- return {
229
- templateName: 'wait-timeout',
230
- data: { duration },
231
- comment: `Wait for ${duration}ms`,
232
- };
233
- },
234
- priority: 7,
235
- },
236
- {
237
- name: 'wait-for-role-with-text',
238
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) &&
239
- !step.selectorRef &&
240
- !!step.dataRef &&
241
- !!elementKeywordToRole(step.text),
242
- resolver: (step, context) => {
243
- const role = elementKeywordToRole(step.text);
244
- let dataValue;
245
- try {
246
- dataValue = context.dataResolver.resolveData(step.dataRef, context.featureName);
247
- }
248
- catch (error) {
249
- dataValue = `\${${step.dataRef}}`;
250
- }
251
- const state = extractWaitState(step.text);
252
- return {
253
- templateName: 'wait-for-role-with-data',
254
- data: { role, dataValue, state },
255
- comment: `Wait for ${role} with ${step.dataRef} to be ${state}`,
256
- };
257
- },
258
- priority: 11,
259
- },
260
- {
261
- name: 'wait-for-role',
262
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) &&
263
- !step.selectorRef &&
264
- !step.dataRef &&
265
- !!elementKeywordToRole(step.text),
266
- resolver: (step, context) => {
267
- const role = elementKeywordToRole(step.text);
268
- const state = extractWaitState(step.text);
269
- return {
270
- templateName: 'wait-for-role',
271
- data: { role, state },
272
- comment: `Wait for ${role} to be ${state}`,
273
- };
274
- },
275
- priority: 11,
276
- },
277
- {
278
- name: 'wait-for-page',
279
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) && step.elementType === 'page',
280
- resolver: (step, context) => {
281
- let path = step.featurePath || '/';
282
- if (step.selectorRef) {
283
- try {
284
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
285
- path = resolved.value || path;
286
- }
287
- catch (error) {
288
- // fallback to featurePath
289
- }
290
- }
291
- const isAbsoluteUrl = /^https?:\/\//.test(path);
292
- let pathRegex;
293
- if (isAbsoluteUrl) {
294
- const url = new URL(path);
295
- const hostEscaped = url.hostname.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
296
- const pathEscaped = url.pathname !== '/' ? url.pathname.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&') : '';
297
- pathRegex = hostEscaped + pathEscaped;
298
- }
299
- else {
300
- pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
301
- }
302
- return {
303
- templateName: 'wait-for-page',
304
- data: { pathRegex },
305
- comment: step.selectorRef ? `Wait for ${step.selectorRef} page` : `Wait for page`,
306
- };
307
- },
308
- priority: 9,
309
- },
310
- {
311
- name: 'wait-for-element-with-text',
312
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) &&
313
- !!step.selectorRef &&
314
- !!step.dataRef,
315
- resolver: (step, context) => {
316
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
317
- let dataValue;
318
- try {
319
- dataValue = context.dataResolver.resolveData(step.dataRef, context.featureName);
320
- }
321
- catch (error) {
322
- dataValue = `\${${step.dataRef}}`;
323
- }
324
- const state = extractWaitState(step.text);
325
- return {
326
- templateName: 'wait-for-element-with-text',
327
- data: { ...resolved, selectorRef: step.selectorRef, dataValue, state },
328
- comment: `Wait for ${step.selectorRef} with ${step.dataRef} to be ${state}`,
329
- };
330
- },
331
- priority: 10,
332
- },
333
- {
334
- name: 'wait-for-element',
335
- matcher: (step) => (step.text.includes('wait for') || step.text.includes('waits for')) && !!step.selectorRef,
336
- resolver: (step, context) => {
337
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
338
- const state = extractWaitState(step.text);
339
- return {
340
- templateName: 'wait-for-element',
341
- data: { ...resolved, selectorRef: step.selectorRef, state },
342
- comment: `Wait for ${step.selectorRef} to be ${state}`,
343
- };
344
- },
345
- priority: 8,
346
- },
347
- {
348
- name: 'toggle-switch',
349
- matcher: (step) => (step.text.includes('toggles') || step.text.match(/\btoggle\b/)) && !!step.selectorRef,
350
- resolver: (step, context) => {
351
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
352
- return {
353
- templateName: 'toggle-action',
354
- data: { ...resolved, selectorRef: step.selectorRef },
355
- comment: `Toggle ${step.selectorRef}`,
356
- };
357
- },
358
- priority: 9,
359
- },
360
- {
361
- name: 'drag-to',
362
- matcher: (step) => (step.text.includes('drags') || step.text.match(/\bdrag\b/)) &&
363
- /\bto\s+\[/.test(step.text) && !!step.selectorRef,
364
- resolver: (step, context) => {
365
- // Extract both selector refs: [Source] ... to [Target]
366
- const allRefs = step.text.match(/\[([^\]]+)\]/g);
367
- if (!allRefs || allRefs.length < 2) {
368
- return {
369
- templateName: 'drag-action',
370
- data: { strategy: 'text', value: step.selectorRef, targetLocator: 'page.locator(\'TODO\')' },
371
- comment: `Drag ${step.selectorRef} (missing target)`,
372
- };
373
- }
374
- const sourceRef = allRefs[0].slice(1, -1);
375
- const targetRef = allRefs[1].slice(1, -1);
376
- const sourceResolved = context.selectorResolver.resolveSelector(sourceRef, undefined, step.elementType, step.nth);
377
- const targetResolved = context.selectorResolver.resolveSelector(targetRef, undefined, undefined, 0);
378
- // Build target locator expression from resolved selector
379
- let targetLocator;
380
- switch (targetResolved.strategy) {
381
- case 'role':
382
- targetLocator = targetResolved.name
383
- ? `page.getByRole('${targetResolved.role}', { name: '${targetResolved.name}' })`
384
- : `page.getByRole('${targetResolved.role}')`;
385
- break;
386
- case 'testid':
387
- targetLocator = `page.getByTestId('${targetResolved.value}')`;
388
- break;
389
- case 'text':
390
- targetLocator = `page.getByText('${targetResolved.value}')`;
391
- break;
392
- case 'locator':
393
- targetLocator = `page.locator('${targetResolved.value}')`;
394
- break;
395
- default:
396
- targetLocator = `page.getByText('${targetRef}')`;
397
- }
398
- return {
399
- templateName: 'drag-action',
400
- data: { ...sourceResolved, targetLocator },
401
- comment: `Drag ${sourceRef} to ${targetRef}`,
402
- };
403
- },
404
- priority: 10,
405
- },
406
- {
407
- name: 'expand-element',
408
- matcher: (step) => (step.text.includes('expands') || step.text.match(/\bexpand\b/)) && !!step.selectorRef,
409
- resolver: (step, context) => {
410
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
411
- return {
412
- templateName: 'expand-action',
413
- data: { ...resolved, selectorRef: step.selectorRef, direction: 'expand' },
414
- comment: `Expand ${step.selectorRef}`,
415
- };
416
- },
417
- priority: 9,
418
- },
419
- {
420
- name: 'collapse-element',
421
- matcher: (step) => (step.text.includes('collapses') || step.text.match(/\bcollapse\b/)) && !!step.selectorRef,
422
- resolver: (step, context) => {
423
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, undefined, step.elementType, step.nth);
424
- return {
425
- templateName: 'expand-action',
426
- data: { ...resolved, selectorRef: step.selectorRef, direction: 'collapse' },
427
- comment: `Collapse ${step.selectorRef}`,
428
- };
429
- },
430
- priority: 9,
431
- },
432
- ];
433
- //# sourceMappingURL=interaction-patterns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interaction-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/interaction-patterns.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Keyboard Patterns
3
- * Handles: press Key key, press Key on [Target] type
4
- */
5
- import { StepPattern } from './types';
6
- export declare const keyboardPatterns: StepPattern[];
7
- //# sourceMappingURL=keyboard-patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyboard-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/keyboard-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,eAAO,MAAM,gBAAgB,EAAE,WAAW,EA2CzC,CAAC"}
@@ -1,47 +0,0 @@
1
- "use strict";
2
- /**
3
- * Keyboard Patterns
4
- * Handles: press Key key, press Key on [Target] type
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.keyboardPatterns = void 0;
8
- exports.keyboardPatterns = [
9
- {
10
- name: 'press-key-global',
11
- matcher: (step) => {
12
- const text = step.text.toLowerCase();
13
- return /\bpress(?:es)?\s+\w+\s+key\b/.test(text) && !text.includes(' on ');
14
- },
15
- resolver: (step, context) => {
16
- // Extract key name: "User press Escape key" → "Escape"
17
- const match = step.text.match(/press(?:es)?\s+(\w+)\s+key/i);
18
- const key = match ? match[1] : 'Enter';
19
- return {
20
- templateName: 'keyboard-global-action',
21
- data: { key },
22
- comment: `Press ${key} key`,
23
- };
24
- },
25
- priority: 12,
26
- },
27
- {
28
- name: 'press-key-on-element',
29
- matcher: (step) => {
30
- const text = step.text.toLowerCase();
31
- return /\bpress(?:es)?\s+\w+\s+on\b/.test(text) && !!step.selectorRef;
32
- },
33
- resolver: (step, context) => {
34
- // Extract key: "User press Enter on [Search] field" → "Enter"
35
- const match = step.text.match(/press(?:es)?\s+(\w+)\s+on/i);
36
- const key = match ? match[1] : 'Enter';
37
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
38
- return {
39
- templateName: 'press-action',
40
- data: { ...resolved, key },
41
- comment: `Press ${key} on ${step.selectorRef}`,
42
- };
43
- },
44
- priority: 12,
45
- },
46
- ];
47
- //# sourceMappingURL=keyboard-patterns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyboard-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/keyboard-patterns.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIU,QAAA,gBAAgB,GAAkB;IAC7C;QACE,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7E,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,uDAAuD;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAEvC,OAAO;gBACL,YAAY,EAAE,wBAAwB;gBACtC,IAAI,EAAE,EAAE,GAAG,EAAE;gBACb,OAAO,EAAE,SAAS,GAAG,MAAM;aAC5B,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QACxE,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,8DAA8D;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAEvC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,eAAe,CACvD,IAAI,CAAC,WAAY,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CACnE,CAAC;YAEF,OAAO;gBACL,YAAY,EAAE,cAAc;gBAC5B,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE;gBAC1B,OAAO,EAAE,SAAS,GAAG,OAAO,IAAI,CAAC,WAAW,EAAE;aAC/C,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAC"}
@@ -1,6 +0,0 @@
1
- import { StepPattern } from './types';
2
- /**
3
- * Navigation patterns: goto, navigate, open page
4
- */
5
- export declare const navigationPatterns: StepPattern[];
6
- //# sourceMappingURL=navigation-patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAoI3C,CAAC"}
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.navigationPatterns = void 0;
4
- const path_inference_1 = require("../utils/path-inference");
5
- /**
6
- * Navigation patterns: goto, navigate, open page
7
- */
8
- exports.navigationPatterns = [
9
- {
10
- name: 'open-page-type',
11
- matcher: (step) => (step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
12
- step.elementType === 'page',
13
- resolver: (step, context) => {
14
- const isThen = context.effectiveKeyword === 'Then';
15
- // Cross-screen page refs (e.g. Then User is on [dashboard] page) won't be in the
16
- // current screen's selectors. Fall back to /<ref>/ for assertion paths instead of
17
- // the current featurePath, which would silently make the assertion always pass.
18
- const pathFallback = isThen && step.selectorRef
19
- ? `/${step.selectorRef}/`
20
- : (context.featurePath || '/');
21
- let path = pathFallback;
22
- if (step.selectorRef) {
23
- try {
24
- const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
25
- path = resolved.value || pathFallback;
26
- }
27
- catch (error) {
28
- path = pathFallback;
29
- }
30
- }
31
- const finalPath = (0, path_inference_1.resolvePathVariables)(path, context.scenarioSteps || []);
32
- const isAbsoluteUrl = /^https?:\/\//.test(finalPath);
33
- // Then User is on [X] page — assert URL, don't navigate.
34
- if (isThen) {
35
- return {
36
- templateName: 'route-assertion',
37
- data: { path: finalPath },
38
- comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert page route`,
39
- };
40
- }
41
- return {
42
- templateName: 'navigation',
43
- data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: finalPath },
44
- comment: step.selectorRef ? `Open ${step.selectorRef} page` : `Navigate to page`,
45
- };
46
- },
47
- priority: 16,
48
- },
49
- {
50
- name: 'open-page',
51
- matcher: (step) => (step.text.includes('open') || step.text.includes('opens')) &&
52
- step.text.includes('page') &&
53
- step.elementType !== 'page',
54
- resolver: (step, context) => {
55
- const pageMatch = step.text.match(/open[s]?\s+\[([^\]]+)\]/i) ||
56
- step.text.match(/open[s]?\s+"([^"]+)"/i);
57
- const pageName = pageMatch ? pageMatch[1] : 'page';
58
- const inferredPath = (0, path_inference_1.inferPath)(context.featurePath, {
59
- featureName: context.featureName,
60
- screenName: context.screenName,
61
- });
62
- const resolvedPath = (0, path_inference_1.resolvePathVariables)(inferredPath, context.scenarioSteps || []);
63
- const pathCode = (0, path_inference_1.getPathCode)(resolvedPath);
64
- const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
65
- const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
66
- return {
67
- templateName: 'navigation',
68
- data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
69
- comment: `Open ${pageName}`,
70
- };
71
- },
72
- priority: 15,
73
- },
74
- {
75
- name: 'navigate-to-route',
76
- matcher: (step) => (step.text.includes('navigate to') || step.text.includes('navigates to') || step.text.includes('is on')) &&
77
- !!(step.selectorRef || step.dataRef),
78
- resolver: (step, context) => {
79
- const route = step.selectorRef || step.dataRef;
80
- const isThen = context.effectiveKeyword === 'Then';
81
- const inferredPath = (0, path_inference_1.inferPath)(context.featurePath, {
82
- featureName: context.featureName,
83
- screenName: context.screenName,
84
- });
85
- const resolvedPath = (0, path_inference_1.resolvePathVariables)(inferredPath, context.scenarioSteps || []);
86
- const pathCode = (0, path_inference_1.getPathCode)(resolvedPath);
87
- const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
88
- const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
89
- if (isThen) {
90
- return {
91
- templateName: 'route-assertion',
92
- data: { path: cleanPath },
93
- comment: `Assert on ${route}`,
94
- };
95
- }
96
- return {
97
- templateName: 'navigation',
98
- data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
99
- comment: `Navigate to ${route}`,
100
- };
101
- },
102
- priority: 10,
103
- },
104
- {
105
- name: 'route-assertion',
106
- matcher: (step) => (step.text.includes('should see route') || step.text.includes('should remain on')) &&
107
- !!(step.selectorRef || step.dataRef),
108
- resolver: (step, context) => {
109
- const route = step.selectorRef || step.dataRef;
110
- const inferredPath = (0, path_inference_1.inferPath)(context.featurePath, {
111
- featureName: context.featureName,
112
- screenName: context.screenName,
113
- });
114
- const resolvedPath = (0, path_inference_1.resolvePathVariables)(inferredPath, context.scenarioSteps || []);
115
- const pathCode = (0, path_inference_1.getPathCode)(resolvedPath);
116
- return {
117
- templateName: 'route-assertion',
118
- data: { path: pathCode.replace(/^['`]|['`]$/g, '') },
119
- comment: `Assert current route is ${route}`,
120
- };
121
- },
122
- priority: 10,
123
- },
124
- ];
125
- //# sourceMappingURL=navigation-patterns.js.map