@sun-asterisk/sungen 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +78 -51
  2. package/dist/cli/index.js +1 -1
  3. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -1
  4. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-editor-action.hbs +1 -1
  5. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +0 -1
  6. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +0 -1
  7. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +0 -1
  8. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +0 -1
  9. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +0 -1
  10. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +0 -1
  11. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +0 -1
  12. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +0 -1
  13. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +0 -1
  14. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +0 -1
  15. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +0 -1
  16. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +0 -1
  17. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +0 -1
  18. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +0 -1
  19. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +0 -1
  20. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +0 -1
  21. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +0 -1
  22. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +0 -1
  23. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +0 -1
  24. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/loading-assertion.hbs +0 -1
  25. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +0 -1
  26. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +0 -1
  27. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +0 -1
  28. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/sorted-assertion.hbs +0 -1
  29. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +0 -1
  30. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +0 -1
  31. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +0 -1
  32. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +0 -1
  33. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +0 -1
  34. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +0 -1
  35. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +0 -1
  36. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +0 -1
  37. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +0 -1
  38. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +0 -1
  39. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +0 -1
  40. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +0 -1
  41. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +0 -1
  42. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  43. package/dist/generators/test-generator/patterns/navigation-patterns.js +2 -2
  44. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
  45. package/dist/generators/test-generator/utils/selector-resolver.d.ts +15 -8
  46. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  47. package/dist/generators/test-generator/utils/selector-resolver.js +26 -197
  48. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  49. package/dist/orchestrator/project-initializer.d.ts +4 -0
  50. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  51. package/dist/orchestrator/project-initializer.js +49 -4
  52. package/dist/orchestrator/project-initializer.js.map +1 -1
  53. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +4 -3
  54. package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -46
  55. package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -46
  56. package/dist/orchestrator/templates/ai-instructions/claude-config.md +9 -8
  57. package/dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +11 -0
  58. package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -2
  59. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +206 -0
  60. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +19 -21
  61. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +256 -0
  62. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +14 -17
  63. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +16 -47
  64. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +16 -47
  65. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +8 -7
  66. package/dist/orchestrator/templates/ai-instructions/{copilot-skill-error-mapping.md → github-skill-sungen-error-mapping.md} +14 -3
  67. package/{src/orchestrator/templates/ai-instructions/copilot-skill-gherkin-syntax.md → dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md} +5 -5
  68. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +206 -0
  69. package/dist/orchestrator/templates/ai-instructions/{copilot-skill-selector-keys.md → github-skill-sungen-selector-keys.md} +22 -24
  70. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +256 -0
  71. package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
  72. package/dist/orchestrator/templates/playwright.config.js +3 -1
  73. package/dist/orchestrator/templates/playwright.config.js.map +1 -1
  74. package/dist/orchestrator/templates/playwright.config.ts +3 -1
  75. package/dist/orchestrator/templates/readme.md +78 -101
  76. package/package.json +1 -1
  77. package/src/cli/index.ts +1 -1
  78. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -1
  79. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-editor-action.hbs +1 -1
  80. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +0 -1
  81. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +0 -1
  82. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +0 -1
  83. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +0 -1
  84. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +0 -1
  85. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +0 -1
  86. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +0 -1
  87. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +0 -1
  88. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +0 -1
  89. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +0 -1
  90. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +0 -1
  91. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +0 -1
  92. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +0 -1
  93. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +0 -1
  94. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +0 -1
  95. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +0 -1
  96. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +0 -1
  97. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +0 -1
  98. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +0 -1
  99. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/loading-assertion.hbs +0 -1
  100. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +0 -1
  101. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +0 -1
  102. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +0 -1
  103. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/sorted-assertion.hbs +0 -1
  104. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +0 -1
  105. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +0 -1
  106. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +0 -1
  107. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +0 -1
  108. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +0 -1
  109. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +0 -1
  110. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +0 -1
  111. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +0 -1
  112. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +0 -1
  113. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +0 -1
  114. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +0 -1
  115. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +0 -1
  116. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +0 -1
  117. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
  118. package/src/generators/test-generator/patterns/navigation-patterns.ts +2 -2
  119. package/src/generators/test-generator/utils/selector-resolver.ts +27 -204
  120. package/src/orchestrator/project-initializer.ts +60 -5
  121. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +4 -3
  122. package/src/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -46
  123. package/src/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -46
  124. package/src/orchestrator/templates/ai-instructions/claude-config.md +9 -8
  125. package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +11 -0
  126. package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -2
  127. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +206 -0
  128. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +19 -21
  129. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +256 -0
  130. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +14 -17
  131. package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +16 -47
  132. package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +16 -47
  133. package/src/orchestrator/templates/ai-instructions/copilot-config.md +8 -7
  134. package/src/orchestrator/templates/ai-instructions/{copilot-skill-error-mapping.md → github-skill-sungen-error-mapping.md} +14 -3
  135. package/{dist/orchestrator/templates/ai-instructions/copilot-skill-gherkin-syntax.md → src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md} +5 -5
  136. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +206 -0
  137. package/src/orchestrator/templates/ai-instructions/{copilot-skill-selector-keys.md → github-skill-sungen-selector-keys.md} +22 -24
  138. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +256 -0
  139. package/src/orchestrator/templates/playwright.config.ts +3 -1
  140. package/src/orchestrator/templates/readme.md +78 -101
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Sungen v2 — Deterministic E2E Test Compiler
2
2
 
3
- **Version**: 2.1.0
3
+ **Version**: 2.2.0
4
4
  **Gherkin + Selector YAML + Test Data → Playwright .spec.ts**
5
5
 
6
6
  ---
@@ -25,19 +25,13 @@ sungen generate → compiles .feature + selectors.yaml + data.yaml → .spec.ts
25
25
  npm install -g @sun-asterisk/sungen@latest
26
26
 
27
27
  # Initialize project (creates AI rules + directory structure)
28
- sungen init
28
+ sungen init --base-url https://your-app.com
29
29
 
30
- # Create a screen
31
- sungen add --screen login --path /auth/login
32
-
33
- # Use AI to generate Gherkin + selectors from the live page
34
- # (GitHub Copilot / Claude Code reads the AI rules and generates files)
35
-
36
- # Compile to Playwright tests
37
- sungen generate --screen login
38
-
39
- # Run tests
40
- npx playwright test
30
+ # Use AI slash commands to generate tests
31
+ # In GitHub Copilot Chat:
32
+ /sungen-add-screen login /auth/login
33
+ /sungen-make-tc login
34
+ /sungen-make-test login
41
35
  ```
42
36
 
43
37
  ---
@@ -55,6 +49,33 @@ npx playwright test
55
49
 
56
50
  ---
57
51
 
52
+ ## AI Slash Commands
53
+
54
+ | Action | GitHub Copilot (VS Code) | Claude Code |
55
+ |--------|--------------------------|-------------|
56
+ | Add screen | `/sungen-add-screen login /auth/login` | `/sungen:add-screen login /auth/login` |
57
+ | Create test cases | `/sungen-make-tc login` | `/sungen:make-tc login` |
58
+ | Compile & run tests | `/sungen-make-test login` | `/sungen:make-test login` |
59
+
60
+ ### make-tc — Create test cases
61
+
62
+ AI acts as a **Senior QA Engineer**. Supports 3 input modes:
63
+ - **Live page** — AI visits the page via MCP Playwright, analyzes UI elements
64
+ - **Figma / screenshots** — AI generates tests from static designs
65
+ - **Update mode** — AI detects existing tests and asks: add new, expand, or replace
66
+
67
+ Output: `.feature` + `test-data.yaml` (no selectors — those are generated during make-test)
68
+
69
+ ### make-test — Compile & run
70
+
71
+ AI acts as a **Senior Developer**:
72
+ 1. Explores live page → generates `selectors.yaml`
73
+ 2. Compiles: `sungen generate --screen <name>`
74
+ 3. Runs: `npx playwright test`
75
+ 4. If fail → auto-fixes selectors/test-data → retry (up to 5 attempts)
76
+
77
+ ---
78
+
58
79
  ## Workflow
59
80
 
60
81
  ### 1. Add a screen
@@ -78,7 +99,7 @@ Use your AI assistant (GitHub Copilot or Claude Code) with MCP Playwright to:
78
99
  2. Take an accessibility snapshot
79
100
  3. Generate `.feature` + `selectors.yaml` + `test-data.yaml`
80
101
 
81
- The AI rules in `.github/copilot-instructions.md` and `CLAUDE.md` (created by `sungen init`) teach the AI the correct syntax.
102
+ The AI rules in `.github/prompts/` and `.claude/` (created by `sungen init`) teach the AI the correct syntax.
82
103
 
83
104
  ### 3. Compile + run
84
105
 
@@ -199,6 +220,43 @@ Feature: Login Screen
199
220
 
200
221
  ---
201
222
 
223
+ ## Selector YAML v2 — NFC Key Format
224
+
225
+ Sungen v2 uses **Unicode NFC normalization** for selector keys — not dot notation. Keys use spaces, support Vietnamese, Japanese, and all Unicode characters.
226
+
227
+ ```yaml
228
+ # NFC keys (spaces, not dots)
229
+ email address:
230
+ type: 'role'
231
+ value: 'textbox'
232
+ name: 'Email Address'
233
+ exact: true
234
+
235
+ # Japanese
236
+ ログイン:
237
+ type: 'role'
238
+ value: 'button'
239
+ name: 'ログイン'
240
+
241
+ # Page navigation
242
+ login:
243
+ type: 'page'
244
+ value: '/auth/login'
245
+
246
+ # Scoped element
247
+ header login:
248
+ type: 'role'
249
+ value: 'button'
250
+ name: 'Login'
251
+ scope: 'main navigation'
252
+ ```
253
+
254
+ **Locator priority**: `data-testid` > `role+name` > `label` > `text` > `CSS`
255
+
256
+ **Types**: `testid`, `role`, `text`, `label`, `placeholder`, `locator`, `page`, `upload`, `frame`
257
+
258
+ ---
259
+
202
260
  ## Tags
203
261
 
204
262
  | Tag | Level | Description |
@@ -231,41 +289,6 @@ Scenario: User sends a thank you message
231
289
 
232
290
  ---
233
291
 
234
- ## Selector YAML Schema
235
-
236
- ```yaml
237
- # Page navigation
238
- login:
239
- type: 'page'
240
- value: '/auth/login'
241
-
242
- # Role-based (preferred)
243
- submit:
244
- type: 'role'
245
- value: 'button'
246
- name: 'Submit'
247
- exact: true # avoid substring collisions
248
- scope: 'desktop navigation' # scope to parent landmark
249
-
250
- # Text-based
251
- price:
252
- type: 'text'
253
- value: '5.000.000 VNĐ'
254
- match: 'exact' # exact text match
255
- nth: 1 # second occurrence
256
-
257
- # TestID (best)
258
- login.form:
259
- type: 'testid'
260
- value: 'login-form'
261
- ```
262
-
263
- **Locator priority**: `data-testid` > `role+name` > `label` > `text` > `CSS`
264
-
265
- **Types**: `testid`, `role`, `text`, `label`, `placeholder`, `locator`, `page`, `upload`, `frame`
266
-
267
- ---
268
-
269
292
  ## Project Structure
270
293
 
271
294
  ```
@@ -282,9 +305,13 @@ specs/generated/<name>/
282
305
 
283
306
  ## Documentation
284
307
 
308
+ Full documentation at **[sun-asterisk.github.io/sungen](https://sun-asterisk.github.io/sungen/)**
309
+
310
+ - **[Installation Guide](https://sun-asterisk.github.io/sungen/docs/guides/installation)** — Windows (Git Bash + VS Code + Copilot), macOS, Linux
311
+ - **[Quick Start](https://sun-asterisk.github.io/sungen/docs/guides/quick-start)** — From zero to running tests
312
+ - **[Selector YAML Guide](https://sun-asterisk.github.io/sungen/docs/guides/selector-override)** — NFC keys, auto-infer, Japanese/Vietnamese support
313
+ - **[Tips & Troubleshooting](https://sun-asterisk.github.io/sungen/docs/guides/tips)** — When AI gets stuck fixing tests
285
314
  - **[Gherkin Dictionary](docs/gherkin-dictionary.md)** — Full grammar, all 17 patterns, compiler rules, formal BNF
286
- - **[Gherkin Core Standard](docs/gherkin%20standards/gherkin-core-standard.md)** — Syntax rules ([Tiếng Việt](docs/gherkin%20standards/gherkin-core-standard.vi.md))
287
- - **[Auth Setup Guide](docs/makeauth.md)** — Configure authentication states
288
315
 
289
316
  ---
290
317
 
package/dist/cli/index.js CHANGED
@@ -15,7 +15,7 @@ async function main() {
15
15
  program
16
16
  .name('sungen')
17
17
  .description('Deterministic E2E Test Compiler — Gherkin + Selectors → Playwright')
18
- .version('2.1.1');
18
+ .version('2.2.0');
19
19
  // Global options
20
20
  program
21
21
  .option('-v, --verbose', 'Enable verbose logging');
@@ -1 +1 @@
1
- await {{> locator}}.fill('{{fillValue}}');
1
+ await {{> locator}}.fill('{{escapeQuotes fillValue}}');
@@ -1,3 +1,3 @@
1
1
  const editorLocator = {{> locator}};
2
2
  await editorLocator.click();
3
- await editorLocator.pressSequentially('{{fillValue}}');
3
+ await editorLocator.pressSequentially('{{escapeQuotes fillValue}}');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeChecked();
@@ -1,3 +1,2 @@
1
- await page.waitForLoadState('networkidle');
2
1
  const {{columnIndexVar}} = (await page.getByRole('columnheader').allTextContents()).findIndex(h => h.includes('{{columnName}}'));
3
2
  await expect(page.getByRole('row').nth({{rowNth}}).getByRole('cell').nth({{columnIndexVar}})).toHaveText('{{dataValue}}');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toContainText('{{expectedText}}');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toHaveCount({{expectedCount}});
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeDisabled();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator-base}}.filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeDisabled();
@@ -1,4 +1,3 @@
1
- await page.waitForLoadState('networkidle');
2
1
  {{#if name}}
3
2
  await expect(page.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeDisabled();
4
3
  {{else}}
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByText('{{escapeQuotes selectorRef}}').filter({ hasText: {{#if (eq selectorValue "")}}/.*{{escapeRegex dataValue}}$/{{else}}'{{escapeQuotes dataValue}}'{{/if}} }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeDisabled();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeEmpty();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeEnabled();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeFocused();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toHaveText('{{expectedText}}');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByRole('dialog').getByRole('heading', { name: '{{escapeQuotes dataValue}}' })).toBeHidden();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator-base}}.filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeHidden();
@@ -1,4 +1,3 @@
1
- await page.waitForLoadState('networkidle');
2
1
  {{#if name}}
3
2
  await expect(page.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeHidden();
4
3
  {{else}}
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByText('{{escapeQuotes selectorRef}}').filter({ hasText: {{#if (eq selectorValue "")}}/.*{{escapeRegex dataValue}}$/{{else}}'{{escapeQuotes dataValue}}'{{/if}} }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeHidden();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeHidden();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByText(/{{#if label}}{{escapeRegex label}}\s*{{else}}(?:^|\s){{/if}}{{escapeRegex dataValue}}$/)).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.getByRole('listitem')).toHaveCount({{expectedCount}});
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toHaveAttribute('aria-busy', 'true');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeChecked({ checked: false });
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page).toHaveURL(/{{pathRegex}}/);
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toHaveAttribute('aria-selected', 'true');
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toHaveAttribute('aria-sort', '{{sortDirection}}');
@@ -1,3 +1,2 @@
1
- await page.waitForLoadState('networkidle');
2
1
  { const tableRow = {{> locator}}.getByRole('row').filter({ hasText: '{{escapeQuotes filterValue}}' });
3
2
  await expect(tableRow.getByRole('cell').filter({ hasText: '{{escapeQuotes cellValue}}' })).toBeVisible(); }
@@ -1,3 +1,2 @@
1
- await page.waitForLoadState('networkidle');
2
1
  { const tableRow = {{> locator}}.getByRole('row').nth({{rowIndex}});
3
2
  await expect(tableRow.getByRole('cell').filter({ hasText: '{{escapeQuotes cellValue}}' })).toBeVisible(); }
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.getByRole('columnheader', { name: '{{escapeQuotes columnName}}' })).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.locator('tbody').getByRole('row')).toHaveCount(0);
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.locator('tbody').getByRole('row')).toHaveCount({{expectedCount}});
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.getByRole('row').filter({ hasText: '{{escapeQuotes filterValue}}' })).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}.getByRole('row').filter({ hasText: '{{escapeQuotes filterValue}}' })).toHaveCount(0);
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator}}).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByRole('dialog').getByRole('heading', { name: '{{escapeQuotes dataValue}}' })).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect({{> locator-base}}.filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{> locator-nth}}).toBeVisible();
@@ -1,4 +1,3 @@
1
- await page.waitForLoadState('networkidle');
2
1
  {{#if name}}
3
2
  {{#if dataValue}}
4
3
  await expect(page.getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }).filter({ hasText: /^{{escapeRegex dataValue}}$/ }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeVisible();
@@ -1,2 +1 @@
1
- await page.waitForLoadState('networkidle');
2
1
  await expect(page.getByText('{{escapeQuotes selectorValue}}').filter({ hasText: /.*{{escapeRegex dataValue}}$/ }){{#if (gte nth 0)}}.nth({{nth}}){{/if}}).toBeVisible();
@@ -1 +1 @@
1
- await page.goto('{{#if baseURL}}{{baseURL}}{{/if}}{{path}}', { waitUntil: 'networkidle' });
1
+ await page.goto('{{#if baseURL}}{{baseURL}}{{/if}}{{path}}', { waitUntil: 'load' });
@@ -8,7 +8,7 @@ const path_inference_1 = require("../utils/path-inference");
8
8
  exports.navigationPatterns = [
9
9
  {
10
10
  name: 'open-page-type',
11
- matcher: (step) => (step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on')) &&
11
+ matcher: (step) => (step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
12
12
  step.elementType === 'page',
13
13
  resolver: (step, context) => {
14
14
  let path = context.featurePath || '/';
@@ -55,7 +55,7 @@ exports.navigationPatterns = [
55
55
  },
56
56
  {
57
57
  name: 'navigate-to-route',
58
- matcher: (step) => (step.text.includes('navigates to') || step.text.includes('is on')) &&
58
+ matcher: (step) => (step.text.includes('navigate to') || step.text.includes('navigates to') || step.text.includes('is on')) &&
59
59
  !!(step.selectorRef || step.dataRef),
60
60
  resolver: (step, context) => {
61
61
  const route = step.selectorRef || step.dataRef;
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"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"}
@@ -41,16 +41,23 @@ export declare class SelectorResolver {
41
41
  */
42
42
  setFeatureContext(featureName: string): void;
43
43
  /**
44
- * Generate selector key from natural language label
45
- * "Email Address" "email.address"
46
- * "Submit Button" → "submit.button"
47
- * "User's Profile" → "users.profile"
48
- * "Thời gian" → "thoi.gian"
49
- * "Địa điểm" → "dia.diem"
50
- * "ログイン" → "roguin"
51
- * "パスワード" → "pasuwaado"
44
+ * Generate selector key from natural language label using Unicode NFC normalization.
45
+ * Preserves all Unicode characters (Vietnamese, Japanese, etc.) as-is.
46
+ *
47
+ * "Email Address" → "email address"
48
+ * "Submit Button" → "submit button"
49
+ * "User's Profile" → "user's profile"
50
+ * "Giới thiệu" → "giới thiệu"
51
+ * "Thời gian" → "thời gian"
52
+ * "ログイン" → "ログイン"
53
+ * "書類一覧" → "書類一覧"
52
54
  */
53
55
  static generateKey(label: string): string;
56
+ /**
57
+ * Normalize all keys in a SelectorFile through generateKey()
58
+ * so that YAML keys are case-insensitive and Unicode-normalized on lookup.
59
+ */
60
+ private static normalizeKeys;
54
61
  /**
55
62
  * Extract the positional nth index from the text that follows an element reference.
56
63
  * Shared by scaffold-generator (map) and gherkin-parser (generate) so both produce
@@ -1 +1 @@
1
- {"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-resolver.ts"],"names":[],"mappings":"AA6OA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAwD;IAC7E,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAKtD;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI5C;;;;;;;;;OASG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAUzC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAMvD;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB;IA8BhH;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAuBnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA6BnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0GxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IA0D3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA2ChC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA0DxB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAqD9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}
1
+ {"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-resolver.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAwD;IAC7E,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAKtD;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI5C;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAMvD;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB;IA8BhH;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAuBnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA6BnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0GxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IA0D3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA2ChC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA0DxB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAqD9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}