@vijaypjavvadi/bdd2pw 2.2.6 → 2.2.7
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/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
_Nothing yet._
|
|
11
11
|
|
|
12
|
+
## [2.2.7] — 2026-05-11
|
|
13
|
+
|
|
14
|
+
### Changed — BUG-10 polish: stronger framework-class handling + cleaner fallback names
|
|
15
|
+
|
|
16
|
+
Two follow-up improvements to the v2.2.6 BUG-10 fix. Each one
|
|
17
|
+
addresses a residual rough edge surfaced by the
|
|
18
|
+
`pickLocator({ tag: "input", cssSelector: ".ng-untouched.search-input" })`
|
|
19
|
+
case.
|
|
20
|
+
|
|
21
|
+
#### 1. Strip framework class tokens from mixed selectors
|
|
22
|
+
|
|
23
|
+
v2.2.6 rejected framework-ONLY selectors but left mixed ones intact,
|
|
24
|
+
so `.ng-untouched.search-input` still got rendered as
|
|
25
|
+
`page.locator('.ng-untouched.search-input')`. Playwright requires
|
|
26
|
+
BOTH classes to be present simultaneously, so when the user focuses
|
|
27
|
+
the input and Angular flips `.ng-untouched` → `.ng-touched`, the
|
|
28
|
+
locator stops matching and the test fails on a should-be-stable
|
|
29
|
+
user-named element.
|
|
30
|
+
|
|
31
|
+
**Fix:** new `stripFrameworkClasses(selector)` export in
|
|
32
|
+
`src/transformers/locatorPicker.ts`. Wired into `pickLocator`
|
|
33
|
+
step 6 so the emitted selector contains only user-named class
|
|
34
|
+
tokens. `.ng-untouched.search-input` → `.search-input`.
|
|
35
|
+
`input.ng-untouched[type="search"]` → `input[type="search"]`.
|
|
36
|
+
`form.ng-untouched .search-input` → `form .search-input`. Only bare
|
|
37
|
+
`.classname` tokens are stripped; element/attribute/id parts and
|
|
38
|
+
combinators are preserved.
|
|
39
|
+
|
|
40
|
+
If stripping leaves an empty / whitespace-only selector (e.g. the
|
|
41
|
+
input had a `.ng-untouched.ng-pristine` selector that the
|
|
42
|
+
isFrameworkOnlySelector gate happened to miss for some
|
|
43
|
+
edge-case reason), the renderer falls through to xpath then to
|
|
44
|
+
tag-only — same as the v2.2.6 framework-only path.
|
|
45
|
+
|
|
46
|
+
#### 2. Skip role-suffix when the base came from the `<tag>Element` fallback
|
|
47
|
+
|
|
48
|
+
After v2.2.6, an Angular input with `cssSelector: ".ng-untouched"`
|
|
49
|
+
and no other handles produced the field name `inputElementInput` —
|
|
50
|
+
clean of the framework class but ugly. The redundant suffix was
|
|
51
|
+
because the existing `endsWith` check didn't catch `inputElement`
|
|
52
|
+
(`"inputelement".endsWith("input")` is `false`).
|
|
53
|
+
|
|
54
|
+
**Fix:** `synthFieldName` now tracks a `haveExplicitBase` flag —
|
|
55
|
+
true when ANY explicit name source (name / label / placeholder /
|
|
56
|
+
testId / text / idDerived) was available, false when we fell
|
|
57
|
+
through to the `${role ?? tag}Element` last-resort base. The
|
|
58
|
+
role-suffix step is skipped on the fallback path. So the same
|
|
59
|
+
Angular input now produces `inputElement`. All other shapes
|
|
60
|
+
unchanged.
|
|
61
|
+
|
|
62
|
+
### Tests
|
|
63
|
+
|
|
64
|
+
`tests/unit/locatorPicker.test.ts`:
|
|
65
|
+
- New `stripFrameworkClasses` group — single-class, mixed, tag /
|
|
66
|
+
attribute / descendant preservation, no-op when no framework
|
|
67
|
+
class, and a documented edge-case (`:not(.ng-foo)` strips the
|
|
68
|
+
inner token to `:not()` — acceptable, rare in practice).
|
|
69
|
+
- Updated the v2.2.6 BUG-10 tests to reflect v2.2.7 behaviour
|
|
70
|
+
(`expect(c.args).toBe('".search-input"')` not just `.toContain`,
|
|
71
|
+
field name `inputElement` not `inputElementInput`).
|
|
72
|
+
|
|
12
73
|
## [2.2.6] — 2026-05-11
|
|
13
74
|
|
|
14
75
|
### Fixed — BUG-10 (P2): locator extractor picks framework-internal CSS classes
|
|
@@ -28,6 +28,30 @@ export declare function isFrameworkClass(cls: string): boolean;
|
|
|
28
28
|
* class can still drive a useful locator.
|
|
29
29
|
*/
|
|
30
30
|
export declare function isFrameworkOnlySelector(selector: string | undefined): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* v2.2.7 — BUG-10 follow-up. Strip framework-internal `.classname`
|
|
33
|
+
* tokens from a CSS selector string, leaving everything else intact.
|
|
34
|
+
*
|
|
35
|
+
* The v2.2.6 fix prevented framework-ONLY selectors from being picked,
|
|
36
|
+
* but a mixed selector like `.ng-untouched.search-input` still made it
|
|
37
|
+
* through with the `.ng-untouched` token in place. Playwright's
|
|
38
|
+
* `page.locator('.ng-untouched.search-input')` requires BOTH classes
|
|
39
|
+
* simultaneously — so when the user types and Angular flips
|
|
40
|
+
* `.ng-untouched` → `.ng-touched`, the locator stops matching. The
|
|
41
|
+
* test fails on what should have been a stable user-named element.
|
|
42
|
+
*
|
|
43
|
+
* After stripping, callers should treat the result as the new selector
|
|
44
|
+
* to emit. If stripping leaves nothing useful (`""` or just whitespace
|
|
45
|
+
* combinators), the caller should fall through to the next priority
|
|
46
|
+
* (xpath / tag-only).
|
|
47
|
+
*
|
|
48
|
+
* Implementation notes:
|
|
49
|
+
* - Only strips bare `.classname` tokens. `:not(.ng-foo)` and
|
|
50
|
+
* attribute selectors are left alone — they're rare and risky to
|
|
51
|
+
* rewrite.
|
|
52
|
+
* - Trims redundant whitespace introduced by the strip.
|
|
53
|
+
*/
|
|
54
|
+
export declare function stripFrameworkClasses(selector: string): string;
|
|
31
55
|
/**
|
|
32
56
|
* Dedupe a list of locator choices.
|
|
33
57
|
*
|
|
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.pickLocator = pickLocator;
|
|
15
15
|
exports.isFrameworkClass = isFrameworkClass;
|
|
16
16
|
exports.isFrameworkOnlySelector = isFrameworkOnlySelector;
|
|
17
|
+
exports.stripFrameworkClasses = stripFrameworkClasses;
|
|
17
18
|
exports.dedupeLocators = dedupeLocators;
|
|
18
19
|
const naming_1 = require("../utils/naming");
|
|
19
20
|
/**
|
|
@@ -92,14 +93,23 @@ function pickLocator(element, allElements) {
|
|
|
92
93
|
// These are runtime state markers that change as the user
|
|
93
94
|
// interacts with the page, so locators built on them are flaky.
|
|
94
95
|
// See BUG-10 / v2.2.6.
|
|
96
|
+
//
|
|
97
|
+
// v2.2.7 — for MIXED selectors like `.ng-untouched.search-input`,
|
|
98
|
+
// strip the framework tokens so we emit `.search-input` rather
|
|
99
|
+
// than the compound selector that requires the state class to
|
|
100
|
+
// still match. If stripping leaves an empty / whitespace-only
|
|
101
|
+
// string, fall through to xpath / tag-only.
|
|
95
102
|
if (element.cssSelector && !isFrameworkOnlySelector(element.cssSelector)) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
const stripped = stripFrameworkClasses(element.cssSelector);
|
|
104
|
+
if (stripped.length > 0) {
|
|
105
|
+
return {
|
|
106
|
+
api: "locator",
|
|
107
|
+
args: JSON.stringify(stripped),
|
|
108
|
+
fieldName,
|
|
109
|
+
source: element,
|
|
110
|
+
confidence: "fallback",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
103
113
|
}
|
|
104
114
|
// 7. xpath — last resort
|
|
105
115
|
if (element.xpath) {
|
|
@@ -200,6 +210,37 @@ function isFrameworkOnlySelector(selector) {
|
|
|
200
210
|
return false; // not a class-based selector
|
|
201
211
|
return classes.every(isFrameworkClass);
|
|
202
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* v2.2.7 — BUG-10 follow-up. Strip framework-internal `.classname`
|
|
215
|
+
* tokens from a CSS selector string, leaving everything else intact.
|
|
216
|
+
*
|
|
217
|
+
* The v2.2.6 fix prevented framework-ONLY selectors from being picked,
|
|
218
|
+
* but a mixed selector like `.ng-untouched.search-input` still made it
|
|
219
|
+
* through with the `.ng-untouched` token in place. Playwright's
|
|
220
|
+
* `page.locator('.ng-untouched.search-input')` requires BOTH classes
|
|
221
|
+
* simultaneously — so when the user types and Angular flips
|
|
222
|
+
* `.ng-untouched` → `.ng-touched`, the locator stops matching. The
|
|
223
|
+
* test fails on what should have been a stable user-named element.
|
|
224
|
+
*
|
|
225
|
+
* After stripping, callers should treat the result as the new selector
|
|
226
|
+
* to emit. If stripping leaves nothing useful (`""` or just whitespace
|
|
227
|
+
* combinators), the caller should fall through to the next priority
|
|
228
|
+
* (xpath / tag-only).
|
|
229
|
+
*
|
|
230
|
+
* Implementation notes:
|
|
231
|
+
* - Only strips bare `.classname` tokens. `:not(.ng-foo)` and
|
|
232
|
+
* attribute selectors are left alone — they're rare and risky to
|
|
233
|
+
* rewrite.
|
|
234
|
+
* - Trims redundant whitespace introduced by the strip.
|
|
235
|
+
*/
|
|
236
|
+
function stripFrameworkClasses(selector) {
|
|
237
|
+
// Replace `.ng-foo` (and the rest) with empty string. The class-token
|
|
238
|
+
// regex matches `.` followed by an identifier, terminated by anything
|
|
239
|
+
// that isn't a class-name char (so `.foo.bar` is two matches, not one).
|
|
240
|
+
const out = selector.replace(/\.([a-zA-Z_][\w-]*)/g, (full, cls) => (isFrameworkClass(cls) ? "" : full));
|
|
241
|
+
// Collapse any whitespace produced by stripping.
|
|
242
|
+
return out.replace(/\s+/g, " ").trim();
|
|
243
|
+
}
|
|
203
244
|
/**
|
|
204
245
|
* Synthesise a camelCase TS field name for an element.
|
|
205
246
|
*
|
|
@@ -226,6 +267,18 @@ function synthFieldName(element) {
|
|
|
226
267
|
const cleaned = idDerived.replace(/[^a-zA-Z0-9 ]/g, " ").trim();
|
|
227
268
|
return (0, naming_1.toJsIdentifier)((0, naming_1.camelCase)(cleaned) || "errorRegion");
|
|
228
269
|
}
|
|
270
|
+
// v2.2.7 — track whether we had to fall through to the
|
|
271
|
+
// `<role|tag>Element` last-resort base. If so, the base ALREADY
|
|
272
|
+
// carries `Element` and we don't want to also append the role-suffix
|
|
273
|
+
// ("inputElement" + "Input" = "inputElementInput" — ugly and
|
|
274
|
+
// redundant). The previous endsWith check missed this because
|
|
275
|
+
// `"inputelement".endsWith("input")` is false.
|
|
276
|
+
const haveExplicitBase = element.name !== undefined ||
|
|
277
|
+
element.label !== undefined ||
|
|
278
|
+
element.placeholder !== undefined ||
|
|
279
|
+
element.testId !== undefined ||
|
|
280
|
+
element.text !== undefined ||
|
|
281
|
+
idDerived !== undefined;
|
|
229
282
|
const baseName = element.name ??
|
|
230
283
|
element.label ??
|
|
231
284
|
element.placeholder ??
|
|
@@ -235,9 +288,11 @@ function synthFieldName(element) {
|
|
|
235
288
|
`${element.role ?? element.tag}Element`;
|
|
236
289
|
const cleaned = baseName.replace(/[^a-zA-Z0-9 ]/g, " ").trim();
|
|
237
290
|
let fieldName = (0, naming_1.camelCase)(cleaned) || "element";
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
291
|
+
if (haveExplicitBase) {
|
|
292
|
+
const suffix = roleToSuffix(element.role, element.tag);
|
|
293
|
+
if (suffix && !fieldName.toLowerCase().endsWith(suffix.toLowerCase())) {
|
|
294
|
+
fieldName += suffix;
|
|
295
|
+
}
|
|
241
296
|
}
|
|
242
297
|
// v2.2.5 — BUG-9 guard: ensure the name is a valid JS identifier.
|
|
243
298
|
// `camelCase("0 of 0")` returns "0Of0", which is not a legal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locatorPicker.js","sourceRoot":"","sources":["../../src/transformers/locatorPicker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAUH,
|
|
1
|
+
{"version":3,"file":"locatorPicker.js","sourceRoot":"","sources":["../../src/transformers/locatorPicker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vijaypjavvadi/bdd2pw",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.7",
|
|
4
4
|
"description": "Scaffold runnable Playwright TypeScript tests from Gherkin .feature files. Detects existing Page Objects, scans live pages via Microsoft Playwright MCP, emits POMs + specs, ready for execution. CLI + HTTP service. Optional governed LLM fallback (Anthropic / OpenAI / Gemini).",
|
|
5
5
|
"bin": {
|
|
6
6
|
"bdd2pw": "dist/cli.js"
|