@sun-asterisk/sungen 2.2.2 → 2.3.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 +66 -37
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +21 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +2 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +17 -3
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +12 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +12 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -57
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +9 -0
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +32 -0
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +56 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/table-patterns.js +8 -5
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +16 -0
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts +13 -0
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -0
- package/dist/orchestrator/ai-rules-updater.js +157 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +2 -27
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -0
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +70 -3
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +18 -9
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -4
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -6
- package/dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +22 -9
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +170 -24
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +118 -12
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +16 -2
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +124 -71
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -5
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +12 -4
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +11 -6
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +22 -9
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +170 -24
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +93 -12
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +16 -2
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +124 -72
- package/dist/orchestrator/templates/readme.md +13 -8
- package/package.json +1 -1
- package/src/cli/commands/update.ts +18 -0
- package/src/cli/index.ts +3 -1
- package/src/generators/gherkin-parser/index.ts +20 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +12 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +12 -1
- package/src/generators/test-generator/patterns/assertion-patterns.ts +106 -65
- package/src/generators/test-generator/patterns/index.ts +41 -0
- package/src/generators/test-generator/patterns/interaction-patterns.ts +58 -1
- package/src/generators/test-generator/patterns/table-patterns.ts +8 -5
- package/src/generators/test-generator/utils/selector-resolver.ts +16 -0
- package/src/orchestrator/ai-rules-updater.ts +139 -0
- package/src/orchestrator/project-initializer.ts +2 -32
- package/src/orchestrator/screen-manager.ts +72 -3
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +18 -9
- package/src/orchestrator/templates/ai-instructions/claude-cmd-make-tc.md +11 -4
- package/src/orchestrator/templates/ai-instructions/claude-cmd-make-test.md +11 -6
- package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +22 -9
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +170 -24
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +118 -12
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +16 -2
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +124 -71
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -5
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-tc.md +12 -4
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-make-test.md +11 -6
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +22 -9
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +170 -24
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +93 -12
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +16 -2
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +124 -72
- package/src/orchestrator/templates/readme.md +13 -8
- package/docs/gherkin standards/gherkin-core-standard.md +0 -428
- package/docs/gherkin standards/gherkin-core-standard.vi.md +0 -513
- package/docs/gherkin-dictionary.md +0 -1071
- package/docs/makeauth.md +0 -225
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Sungen v2 — Deterministic E2E Test Compiler
|
|
2
2
|
|
|
3
|
-
**Version**: 2.2.
|
|
3
|
+
**Version**: 2.2.3
|
|
4
4
|
**Gherkin + Selector YAML + Test Data → Playwright .spec.ts**
|
|
5
5
|
|
|
6
6
|
---
|
|
@@ -122,7 +122,7 @@ When tests fail → AI reads error → fixes `selectors.yaml` → recompile →
|
|
|
122
122
|
|
|
123
123
|
## Gherkin Syntax
|
|
124
124
|
|
|
125
|
-
**Pattern**: `User <
|
|
125
|
+
**Pattern**: `[Keyword] User <Action> [Target Name] <Target Type> <with {{Value}}> <is State>`
|
|
126
126
|
|
|
127
127
|
- `[Target]` → selector reference → lookup in `selectors/*.yaml`
|
|
128
128
|
- `{{Value}}` → test data reference → lookup in `test-data/*.yaml`
|
|
@@ -130,51 +130,65 @@ When tests fail → AI reads error → fixes `selectors.yaml` → recompile →
|
|
|
130
130
|
### Example
|
|
131
131
|
|
|
132
132
|
```gherkin
|
|
133
|
+
@feature_auth
|
|
133
134
|
Feature: Login Screen
|
|
134
135
|
Path: /auth/login
|
|
135
136
|
|
|
136
|
-
@
|
|
137
|
+
@auto @smoke
|
|
137
138
|
Scenario: User logs in successfully
|
|
138
|
-
Given User is on [
|
|
139
|
+
Given User is on [Login] page
|
|
139
140
|
When User fill [Email] field with {{valid_email}}
|
|
140
141
|
And User fill [Password] field with {{valid_password}}
|
|
141
142
|
And User click [Login] button
|
|
142
|
-
Then User see [
|
|
143
|
-
And User see [
|
|
143
|
+
Then User see [Dashboard] page
|
|
144
|
+
And User see [Welcome] heading with {{success_message}}
|
|
145
|
+
And User see [Logout] button is enabled
|
|
144
146
|
```
|
|
145
147
|
|
|
146
148
|
---
|
|
147
149
|
|
|
148
|
-
## Pattern Shapes (
|
|
150
|
+
## Pattern Shapes (18 categories)
|
|
149
151
|
|
|
150
152
|
### Actions
|
|
151
153
|
|
|
152
154
|
| Pattern | Example |
|
|
153
155
|
|---|---|
|
|
154
156
|
| Simple click | `User click [Submit] button` |
|
|
155
|
-
| Click
|
|
157
|
+
| Click dynamic list | `User click [Order] row with {{order_name}}` |
|
|
156
158
|
| Fill field | `User fill [Email] field with {{email}}` |
|
|
157
|
-
|
|
|
159
|
+
| Fill search | `User fill [Global] search with {{keyword}}` |
|
|
160
|
+
| Check/Uncheck | `User check [Remember me] checkbox` / `User check [Notification] toggle` |
|
|
158
161
|
| Select dropdown | `User select [Country] dropdown with {{country}}` |
|
|
159
|
-
| Upload file | `User upload [Avatar]
|
|
162
|
+
| Upload file | `User upload [Avatar] uploader with {{path}}` |
|
|
160
163
|
| Double click | `User double click [Cell] element` |
|
|
161
|
-
| Hover | `User hover [Info] icon` |
|
|
164
|
+
| Hover | `User hover [Info] icon` / `User hover [Order] row` |
|
|
162
165
|
| Clear | `User clear [Search] field` |
|
|
163
|
-
|
|
166
|
+
|
|
167
|
+
> **click + with rule**: `with {{Value}}` only for dynamic lists (`row`, `item`, `card`, `option`). Never for static elements (`button`, `link`, `icon`, `tab`).
|
|
168
|
+
|
|
169
|
+
### Browser Alert
|
|
170
|
+
|
|
171
|
+
| Pattern | Example |
|
|
172
|
+
|---|---|
|
|
173
|
+
| Accept | `User click [OK] alert` (also: Accept, Yes, Confirm) |
|
|
174
|
+
| Dismiss | `User click [Cancel] alert` (also: Dismiss, No) |
|
|
175
|
+
| Fill prompt | `User fill [Name] alert with {{value}}` |
|
|
176
|
+
|
|
177
|
+
> Alert steps must appear **before** the triggering action. Generates `page.once('dialog', ...)`.
|
|
164
178
|
|
|
165
179
|
### Keyboard
|
|
166
180
|
|
|
167
181
|
| Pattern | Example |
|
|
168
182
|
|---|---|
|
|
169
|
-
| Global key | `User press Escape key` |
|
|
170
|
-
| Key on element | `User press Enter on [Search] field` |
|
|
183
|
+
| Global key | `User press [Escape] key` |
|
|
184
|
+
| Key on element | `User press [Enter] on [Search] field` |
|
|
171
185
|
|
|
172
186
|
### Navigation
|
|
173
187
|
|
|
174
188
|
| Pattern | Example |
|
|
175
189
|
|---|---|
|
|
176
|
-
| Open page | `User is on [
|
|
177
|
-
| See page (URL) | `User see [
|
|
190
|
+
| Open page | `User is on [Login] page` |
|
|
191
|
+
| See page (URL) | `User see [Dashboard] page` |
|
|
178
192
|
|
|
179
193
|
### Wait
|
|
180
194
|
|
|
@@ -185,26 +199,28 @@ Feature: Login Screen
|
|
|
185
199
|
| Wait hidden | `User wait for [Loading] spinner is hidden` |
|
|
186
200
|
| Wait with data | `User wait for [Dialog] dialog with {{title}}` |
|
|
187
201
|
|
|
188
|
-
### Assertions
|
|
202
|
+
### Assertions (7 verify patterns)
|
|
189
203
|
|
|
190
|
-
| Pattern | Example |
|
|
191
|
-
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
204
|
+
| Pattern | Assertion | Example |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| Visibility | `toBeVisible()` | `User see [Success] message` |
|
|
207
|
+
| Hidden | `toBeHidden()` | `User see [Ads] modal is hidden` |
|
|
208
|
+
| Text content | `toHaveText()` | `User see [Error] message with {{err_msg}}` |
|
|
209
|
+
| Input value | `toHaveValue()` | `User see [Email] field with {{user_email}}` |
|
|
210
|
+
| Partial text | `toContainText()` | `User see [Title] text contains {{partial}}` |
|
|
211
|
+
| Component state | `toBeDisabled()` etc. | `User see [Submit] button is disabled` |
|
|
212
|
+
| Page context | `toHaveURL()` | `User see [Dashboard] page` |
|
|
197
213
|
|
|
198
|
-
**States**: `hidden`, `visible`, `disabled`, `enabled`, `checked`, `unchecked`, `focused`, `empty`
|
|
214
|
+
**States**: `hidden`, `visible`, `disabled`, `enabled`, `checked`, `unchecked`, `focused`, `empty`, `loading`, `selected`, `sorted ascending`, `sorted descending`
|
|
199
215
|
|
|
200
216
|
### Table
|
|
201
217
|
|
|
202
218
|
| Pattern | Example |
|
|
203
219
|
|---|---|
|
|
204
|
-
|
|
|
220
|
+
| Column exists | `User see [Email] column in [Users] table` |
|
|
221
|
+
| Row exists | `User see [Users] table row with {{name}}` |
|
|
205
222
|
| No row | `User see [Users] table has no row with {{name}}` |
|
|
206
|
-
| Row count | `User see [Users] table
|
|
207
|
-
| Column exists | `User see [Users] table has [Email] column` |
|
|
223
|
+
| Row count | `User see [Users] table with {{count}} rows` |
|
|
208
224
|
| Cell by filter | `User see [Users] table row with {{name}} has [Status] with {{status}}` |
|
|
209
225
|
| Cell by index | `User see [Users] table row 1 [Name] cell with {{name}}` |
|
|
210
226
|
| Action in row | `User click [Edit] in [Users] table row with {{name}}` |
|
|
@@ -218,6 +234,17 @@ Feature: Login Screen
|
|
|
218
234
|
| Frame enter | `User switch to [Payment] frame` |
|
|
219
235
|
| Frame exit | `User switch to [main] frame` |
|
|
220
236
|
|
|
237
|
+
### Element Types
|
|
238
|
+
|
|
239
|
+
| Group | Types |
|
|
240
|
+
|---|---|
|
|
241
|
+
| **Context** | `page` `dialog` `modal` `drawer` `tab` `alert` `overlay` `step` |
|
|
242
|
+
| **Input** | `field` `textarea` `search` `dropdown` `option` `checkbox` `radio` `toggle` `uploader` `slider` `date-picker` |
|
|
243
|
+
| **Trigger** | `button` `link` `icon` `menuitem` `tag` |
|
|
244
|
+
| **Data** | `table` `row` `column` `cell` `list` `item` `card` `section` |
|
|
245
|
+
| **Feedback** | `message` `header` `label` `text` `tooltip` `badge` `breadcrumb` `image` |
|
|
246
|
+
| **System** | `key` `frame` `spinner` `progressbar` |
|
|
247
|
+
|
|
221
248
|
---
|
|
222
249
|
|
|
223
250
|
## Selector YAML v2 — NFC Key Format
|
|
@@ -261,11 +288,13 @@ header login:
|
|
|
261
288
|
|
|
262
289
|
| Tag | Level | Description |
|
|
263
290
|
|-----|-------|-------------|
|
|
291
|
+
| `@auto` | Scenario | Standard scenario, ready for automation |
|
|
292
|
+
| `@manual` | Scenario | Skip in generation |
|
|
293
|
+
| `@smoke` / `@regression` | Scenario | Test suite grouping |
|
|
264
294
|
| `@auth:<role>` | Feature/Scenario | Use Playwright auth storage state |
|
|
265
295
|
| `@no-auth` | Scenario | Disable inherited auth |
|
|
266
|
-
| `@steps:<name>` | Scenario | Mark as reusable step block |
|
|
267
|
-
| `@extend:<name>` | Scenario | Prepend
|
|
268
|
-
| `@manual` | Scenario | Skip in generation |
|
|
296
|
+
| `@steps:<name>` | Scenario | Mark as reusable step block (base scenario) |
|
|
297
|
+
| `@extend:<name>` | Scenario | Prepend Given→When from `@steps` block (skip Then) |
|
|
269
298
|
|
|
270
299
|
**Auth precedence**: Scenario > Feature > None
|
|
271
300
|
|
|
@@ -305,13 +334,13 @@ specs/generated/<name>/
|
|
|
305
334
|
|
|
306
335
|
## Documentation
|
|
307
336
|
|
|
308
|
-
Full documentation at **[sun-asterisk.
|
|
337
|
+
Full documentation at **[sungen.sun-asterisk.vn](https://sungen.sun-asterisk.vn)**
|
|
309
338
|
|
|
310
|
-
- **[Installation Guide](https://sun-asterisk.
|
|
311
|
-
- **[Quick Start](https://sun-asterisk.
|
|
312
|
-
- **[Selector YAML Guide](https://sun-asterisk.
|
|
313
|
-
- **[Tips & Troubleshooting](https://sun-asterisk.
|
|
314
|
-
- **[Gherkin Dictionary](docs/gherkin-dictionary
|
|
339
|
+
- **[Installation Guide](https://sungen.sun-asterisk.vn/docs/guides/installation)** — Windows (Git Bash + VS Code + Copilot), macOS, Linux
|
|
340
|
+
- **[Quick Start](https://sungen.sun-asterisk.vn/docs/guides/quick-start)** — From zero to running tests
|
|
341
|
+
- **[Selector YAML Guide](https://sungen.sun-asterisk.vn/docs/guides/selector-override)** — NFC keys, auto-infer, Japanese/Vietnamese support
|
|
342
|
+
- **[Tips & Troubleshooting](https://sungen.sun-asterisk.vn/docs/guides/tips)** — When AI gets stuck fixing tests
|
|
343
|
+
- **[Gherkin Dictionary](https://sungen.sun-asterisk.vn/docs/gherkin/gherkin-dictionary)** — Full grammar, all 18 patterns, compiler rules, formal BNF
|
|
315
344
|
|
|
316
345
|
---
|
|
317
346
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerUpdateCommand = registerUpdateCommand;
|
|
4
|
+
function registerUpdateCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command('update')
|
|
7
|
+
.description('Update AI rules, commands, and skills to the latest version')
|
|
8
|
+
.option('--dry-run', 'Show what would be updated without making changes')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
try {
|
|
11
|
+
const { AIRulesUpdater } = require('../../orchestrator/ai-rules-updater');
|
|
12
|
+
const updater = new AIRulesUpdater(process.cwd());
|
|
13
|
+
await updater.update(options.dryRun ?? false);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.error('❌ Update failed:', error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;AAEA,sDAeC;AAfD,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -10,12 +10,13 @@ const init_1 = require("./commands/init");
|
|
|
10
10
|
const add_1 = require("./commands/add");
|
|
11
11
|
const generate_1 = require("./commands/generate");
|
|
12
12
|
const makeauth_1 = require("./commands/makeauth");
|
|
13
|
+
const update_1 = require("./commands/update");
|
|
13
14
|
async function main() {
|
|
14
15
|
const program = new commander_1.Command();
|
|
15
16
|
program
|
|
16
17
|
.name('sungen')
|
|
17
18
|
.description('Deterministic E2E Test Compiler — Gherkin + Selectors → Playwright')
|
|
18
|
-
.version('2.
|
|
19
|
+
.version('2.3.0');
|
|
19
20
|
// Global options
|
|
20
21
|
program
|
|
21
22
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
@@ -24,6 +25,7 @@ async function main() {
|
|
|
24
25
|
(0, add_1.registerAddCommand)(program);
|
|
25
26
|
(0, generate_1.registerGenerateCommand)(program);
|
|
26
27
|
(0, makeauth_1.registerMakeauthCommand)(program);
|
|
28
|
+
(0, update_1.registerUpdateCommand)(program);
|
|
27
29
|
await program.parseAsync(process.argv);
|
|
28
30
|
}
|
|
29
31
|
main().catch((error) => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAE1D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,6BAA6B;IAC7B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAiB;;IAS/B;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IA6BjD;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,SAAS;IA8DjB;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;CAmB3D"}
|
|
@@ -114,7 +114,19 @@ class GherkinParser {
|
|
|
114
114
|
* Parse a single step and extract selector/data references
|
|
115
115
|
*/
|
|
116
116
|
parseStep(step) {
|
|
117
|
-
|
|
117
|
+
let text = step.text;
|
|
118
|
+
// === Extract parent scoping: "in [Parent Name] parentType" ===
|
|
119
|
+
// Must be extracted first so the parent [brackets] don't interfere with target selector extraction.
|
|
120
|
+
// Valid parent types: table, list, section, dialog, form
|
|
121
|
+
const parentMatch = text.match(/\s+in\s+\[([^\]]+)\]\s+(table|list|section|dialog|form)\b/i);
|
|
122
|
+
let parentRef;
|
|
123
|
+
let parentType;
|
|
124
|
+
if (parentMatch) {
|
|
125
|
+
parentRef = parentMatch[1];
|
|
126
|
+
parentType = parentMatch[2].toLowerCase();
|
|
127
|
+
// Remove parent scoping from text so it doesn't interfere with other parsing
|
|
128
|
+
text = text.slice(0, parentMatch.index) + text.slice(parentMatch.index + parentMatch[0].length);
|
|
129
|
+
}
|
|
118
130
|
// Extract selector reference: [Email Address] or [login:email_field] (legacy)
|
|
119
131
|
// Support natural language and legacy formats
|
|
120
132
|
const selectorMatch = text.match(/\[([^\]]+)\]/i);
|
|
@@ -135,7 +147,7 @@ class GherkinParser {
|
|
|
135
147
|
}
|
|
136
148
|
else {
|
|
137
149
|
// Extract final word if it's a known type (page, button, field, etc)
|
|
138
|
-
const finalWordMatch = text.match(/\b(page|button|field|link|text|checkbox|radio|select|dropdown|modal|dialog|message|error|warning|success|alert|table|list|list-item|listitem|row)\b$/i);
|
|
150
|
+
const finalWordMatch = text.match(/\b(page|button|field|link|text|checkbox|radio|select|dropdown|modal|dialog|drawer|message|error|warning|success|alert|table|list|list-item|listitem|row|search|option|slider|toggle|tab|breadcrumb|overlay|step|section|card|item|icon|image|header|label|badge|tooltip|tag|menuitem|cell|column|uploader|date-picker|key)\b$/i);
|
|
139
151
|
elementType = finalWordMatch ? finalWordMatch[1].toLowerCase() : undefined;
|
|
140
152
|
}
|
|
141
153
|
// Extract positional index from "[Element] field 3", "[Element] button 2", etc.
|
|
@@ -146,12 +158,14 @@ class GherkinParser {
|
|
|
146
158
|
}
|
|
147
159
|
return {
|
|
148
160
|
keyword: step.keyword.trim(),
|
|
149
|
-
text,
|
|
161
|
+
text: step.text, // Preserve original text (with parent scoping) for pattern matching
|
|
150
162
|
selectorRef,
|
|
151
163
|
dataRef,
|
|
152
164
|
value,
|
|
153
165
|
elementType,
|
|
154
166
|
nth,
|
|
167
|
+
parentRef,
|
|
168
|
+
parentType,
|
|
155
169
|
};
|
|
156
170
|
}
|
|
157
171
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,cAAc;AACd,2DAA6C;AAC7C,6DAA+C;AAC/C,4CAAoB;AACpB,gDAAwB;AACxB,iFAA6E;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
page.once('dialog', dialog => dialog.accept());
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
page.once('dialog', dialog => dialog.dismiss());
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
page.once('dialog', dialog => dialog.accept('{{escapeQuotes fillValue}}'));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const dialogPromise{{stepCounter}} = new Promise<string>(resolve => {
|
|
2
|
+
page.once('dialog', dialog => {
|
|
3
|
+
resolve(dialog.message());
|
|
4
|
+
dialog.accept();
|
|
5
|
+
});
|
|
6
|
+
});
|
|
7
|
+
// Trigger the dialog action, then:
|
|
8
|
+
// expect(await dialogPromise{{stepCounter}}).toContain('{{escapeQuotes dataValue}}');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
await expect({{> locator}}).toHaveValue('{{escapeQuotes dataValue}}');
|
package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
{{#if parentLocator}}{{parentLocator}}.{{#switch strategy~}}
|
|
2
|
+
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
|
+
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
4
|
+
{{~#case 'placeholder'}}getByPlaceholder('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
5
|
+
{{~#case 'label'}}getByLabel('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
6
|
+
{{~#case 'text'}}getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
7
|
+
{{~#case 'locator'}}locator('{{value}}'){{/case~}}
|
|
8
|
+
{{~#case 'id'}}locator('{{value}}'){{/case~}}
|
|
9
|
+
{{~#default}}locator('{{value}}'){{/default~}}
|
|
10
|
+
{{~/switch}}{{else~}}
|
|
1
11
|
{{#if scope}}{{pageRoot}}.getByLabel('{{escapeQuotes scope}}').{{#switch strategy~}}
|
|
2
12
|
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
13
|
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
@@ -16,4 +26,5 @@
|
|
|
16
26
|
{{~#case 'locator'}}{{> locator-strategies/locator}}{{/case~}}
|
|
17
27
|
{{~#case 'id'}}{{> locator-strategies/id}}{{/case~}}
|
|
18
28
|
{{~#default}}{{> locator-strategies/default}}{{/default~}}
|
|
19
|
-
{{~/switch}}{{/if}}
|
|
29
|
+
{{~/switch}}{{/if~}}
|
|
30
|
+
{{/if}}
|
package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
{{#if parentLocator}}{{parentLocator}}.{{#switch strategy~}}
|
|
2
|
+
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
|
+
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
4
|
+
{{~#case 'placeholder'}}getByPlaceholder('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
5
|
+
{{~#case 'label'}}getByLabel('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
6
|
+
{{~#case 'text'}}getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
7
|
+
{{~#case 'locator'}}locator('{{value}}'){{/case~}}
|
|
8
|
+
{{~#case 'id'}}locator('{{value}}'){{/case~}}
|
|
9
|
+
{{~#default}}locator('{{value}}'){{/default~}}
|
|
10
|
+
{{~/switch}}{{> locator-nth}}{{else~}}
|
|
1
11
|
{{#if scope}}{{pageRoot}}.getByLabel('{{escapeQuotes scope}}').{{#switch strategy~}}
|
|
2
12
|
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
13
|
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
@@ -16,4 +26,5 @@
|
|
|
16
26
|
{{~#case 'locator'}}{{> locator-strategies/locator}}{{/case~}}
|
|
17
27
|
{{~#case 'id'}}{{> locator-strategies/id}}{{/case~}}
|
|
18
28
|
{{~#default}}{{> locator-strategies/default}}{{/default~}}
|
|
19
|
-
{{~/switch}}{{> locator-nth}}{{/if}}
|
|
29
|
+
{{~/switch}}{{> locator-nth}}{{/if~}}
|
|
30
|
+
{{/if}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertion-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/assertion-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"assertion-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/assertion-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EA2qB1C,CAAC"}
|