@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.
- package/README.md +78 -51
- package/dist/cli/index.js +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-editor-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/loading-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/sorted-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +0 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +2 -2
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +15 -8
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +26 -197
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +4 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +49 -4
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +4 -3
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -46
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -46
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +9 -8
- package/dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +11 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -2
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +206 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +19 -21
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +256 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +14 -17
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +16 -47
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +16 -47
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +8 -7
- package/dist/orchestrator/templates/ai-instructions/{copilot-skill-error-mapping.md → github-skill-sungen-error-mapping.md} +14 -3
- package/{src/orchestrator/templates/ai-instructions/copilot-skill-gherkin-syntax.md → dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md} +5 -5
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +206 -0
- package/dist/orchestrator/templates/ai-instructions/{copilot-skill-selector-keys.md → github-skill-sungen-selector-keys.md} +22 -24
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +256 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
- package/dist/orchestrator/templates/playwright.config.js +3 -1
- package/dist/orchestrator/templates/playwright.config.js.map +1 -1
- package/dist/orchestrator/templates/playwright.config.ts +3 -1
- package/dist/orchestrator/templates/readme.md +78 -101
- package/package.json +1 -1
- package/src/cli/index.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-editor-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/loading-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/sorted-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +0 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/src/generators/test-generator/patterns/navigation-patterns.ts +2 -2
- package/src/generators/test-generator/utils/selector-resolver.ts +27 -204
- package/src/orchestrator/project-initializer.ts +60 -5
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +4 -3
- package/src/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -46
- package/src/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -46
- package/src/orchestrator/templates/ai-instructions/claude-config.md +9 -8
- package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +11 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -2
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +206 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +19 -21
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +256 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +14 -17
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +16 -47
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +16 -47
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +8 -7
- package/src/orchestrator/templates/ai-instructions/{copilot-skill-error-mapping.md → github-skill-sungen-error-mapping.md} +14 -3
- package/{dist/orchestrator/templates/ai-instructions/copilot-skill-gherkin-syntax.md → src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md} +5 -5
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +206 -0
- package/src/orchestrator/templates/ai-instructions/{copilot-skill-selector-keys.md → github-skill-sungen-selector-keys.md} +22 -24
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +256 -0
- package/src/orchestrator/templates/playwright.config.ts +3 -1
- 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.
|
|
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
|
-
#
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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/
|
|
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.
|
|
18
|
+
.version('2.2.0');
|
|
19
19
|
// Global options
|
|
20
20
|
program
|
|
21
21
|
.option('-v, --verbose', 'Enable verbose logging');
|
package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
await {{> locator}}.fill('{{fillValue}}');
|
|
1
|
+
await {{> locator}}.fill('{{escapeQuotes fillValue}}');
|
|
@@ -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,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,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,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();
|
package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
await page.goto('{{#if baseURL}}{{baseURL}}{{/if}}{{path}}', { waitUntil: '
|
|
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":";;;AAEA,4DAAuF;AAEvF;;GAEG;AACU,QAAA,kBAAkB,GAAkB;IAC/C;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;
|
|
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
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* "
|
|
48
|
-
* "
|
|
49
|
-
* "
|
|
50
|
-
* "
|
|
51
|
-
* "
|
|
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":"
|
|
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"}
|