@vijaypjavvadi/bdd2pw 2.2.4 → 2.2.5
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 +64 -0
- package/dist/emitters/facade.d.ts +18 -0
- package/dist/emitters/facade.js +44 -4
- package/dist/emitters/facade.js.map +1 -1
- package/dist/transformers/locatorPicker.js +7 -2
- package/dist/transformers/locatorPicker.js.map +1 -1
- package/dist/utils/naming.d.ts +20 -0
- package/dist/utils/naming.js +26 -0
- package/dist/utils/naming.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,70 @@ 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.5] — 2026-05-11
|
|
13
|
+
|
|
14
|
+
### Fixed — BUG-9 (P0): POM field name starting with a digit broke entire spec
|
|
15
|
+
|
|
16
|
+
Cloud-job report 2026-05-11 19:46 against `https://preview.owasp-juice.shop`:
|
|
17
|
+
every test in `tests/r-0-c934-ddf-001.spec.ts` failed with a
|
|
18
|
+
**compile-time** `SyntaxError`, zero tests executed.
|
|
19
|
+
|
|
20
|
+
Root cause: juice-shop renders pagination labels like `"0 of 0"` and
|
|
21
|
+
`"1,500 of 0"` inside status regions. The locator-picker's field-name
|
|
22
|
+
synthesiser routed those through `camelCase`, which produced
|
|
23
|
+
`0Of0`, `1500Of0`, `0,0Of0`. JavaScript identifiers must start with
|
|
24
|
+
a letter / `$` / `_`, never a digit, and cannot contain commas.
|
|
25
|
+
|
|
26
|
+
The emitted POM and spec looked like:
|
|
27
|
+
|
|
28
|
+
this.0Of0 = page.getByText("0 of 0");
|
|
29
|
+
// ^^^ SyntaxError
|
|
30
|
+
await expect(r0c934ddf001.0Of0).toBeVisible();
|
|
31
|
+
// ^^^ SyntaxError
|
|
32
|
+
|
|
33
|
+
This is worse than a runtime failure: there's no triage signal,
|
|
34
|
+
just a hard parse error, and the entire scenario set is skipped.
|
|
35
|
+
|
|
36
|
+
**Fix (defence in depth — three layers):**
|
|
37
|
+
|
|
38
|
+
1. **Identifier-safe naming helper.** New `toJsIdentifier(s)` in
|
|
39
|
+
`src/utils/naming.ts`. Strips any character not in `[A-Za-z0-9_$]`,
|
|
40
|
+
prefixes digit-leading identifiers with `_`, falls back to
|
|
41
|
+
`_field` for empty input. Pure function, fully unit-tested.
|
|
42
|
+
|
|
43
|
+
2. **POM emitter.** `synthFieldName` in
|
|
44
|
+
`src/transformers/locatorPicker.ts` runs the post-camelCase result
|
|
45
|
+
through `toJsIdentifier`. Both the main path and the status-region
|
|
46
|
+
special case are covered. So `"0 of 0"` now becomes `_0Of0`,
|
|
47
|
+
`"1,500 of 0"` becomes `_1500Of0`. The POM declares
|
|
48
|
+
`this._0Of0 = page.getByText("0 of 0")` — valid TS.
|
|
49
|
+
|
|
50
|
+
3. **Binding renderer safety net.** New `sanitizeLocatorReferences(s)`
|
|
51
|
+
in `src/emitters/facade.ts` rewrites `.<digit-leading>` member
|
|
52
|
+
access and `[<digit-leading>]` bracket access to be `_`-prefixed.
|
|
53
|
+
Applied to `assertion.locator`, `pomCall.method`, every
|
|
54
|
+
`pomCall.args` entry, and every line of `customBody`. This catches
|
|
55
|
+
cached LLM bindings from v2.2.4 or earlier that reference the old
|
|
56
|
+
unsanitized name shape, so users don't have to clear their cache
|
|
57
|
+
to benefit from the fix.
|
|
58
|
+
|
|
59
|
+
### Tests
|
|
60
|
+
|
|
61
|
+
- `tests/unit/naming.test.ts`: full coverage for `toJsIdentifier` —
|
|
62
|
+
pass-through of valid identifiers, digit-prefix path
|
|
63
|
+
(`0Of0`/`1500Of0`/`123`), comma stripping (`0,0Of0`,
|
|
64
|
+
`foo,bar`), arbitrary punctuation, empty-input fallback to
|
|
65
|
+
`_field`.
|
|
66
|
+
- `tests/unit/locatorPicker.test.ts`: end-to-end reproduction of the
|
|
67
|
+
juice-shop pagination case — `{ text: "0 of 0" }` element produces
|
|
68
|
+
fieldName `_0Of0`; `{ text: "1,500 of 0" }` produces `_1500Of0`;
|
|
69
|
+
valid inputs unchanged.
|
|
70
|
+
- `tests/unit/facade.test.ts`: helper coverage for
|
|
71
|
+
`sanitizeLocatorReferences` plus three end-to-end render tests
|
|
72
|
+
(assertion locator / pomCall args / customBody) confirming the
|
|
73
|
+
rewriter fires correctly through the public `emitTestFile` entry
|
|
74
|
+
point.
|
|
75
|
+
|
|
12
76
|
## [2.2.4] — 2026-05-11
|
|
13
77
|
|
|
14
78
|
### Fixed — BUG-7: empty `expect()` for URL assertions (regression from 2.2.3)
|
|
@@ -9,6 +9,24 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { type EmitResult } from "@vijaypjavvadi/pw-emit";
|
|
11
11
|
import type { PageObjectIR, StepBinding } from "../types";
|
|
12
|
+
/**
|
|
13
|
+
* v2.2.5 — BUG-9 safety net.
|
|
14
|
+
*
|
|
15
|
+
* If a cached LLM binding from v2.2.4 or earlier references a POM field
|
|
16
|
+
* whose name starts with a digit (e.g. `r0c934ddf001.0Of0` from
|
|
17
|
+
* juice-shop's "0 of 0" pagination label), we rewrite the
|
|
18
|
+
* digit-leading segment to be `_`-prefixed so the spec parses.
|
|
19
|
+
*
|
|
20
|
+
* The v2.2.5 field-name synthesiser already prevents new bindings from
|
|
21
|
+
* having this shape, but cached entries persist across versions until
|
|
22
|
+
* explicitly cleared.
|
|
23
|
+
*
|
|
24
|
+
* Patterns rewritten:
|
|
25
|
+
* `foo.0Of0` → `foo._0Of0` // member access onto digit
|
|
26
|
+
* `foo[0Of0]` → `foo[_0Of0]` // computed-property identifier
|
|
27
|
+
* `foo.0,0Of0` → `foo._0_0Of0` // commas → underscore
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeLocatorReferences(s: string): string;
|
|
12
30
|
export declare class EmitterConsistencyError extends Error {
|
|
13
31
|
constructor(message: string);
|
|
14
32
|
}
|
package/dist/emitters/facade.js
CHANGED
|
@@ -10,11 +10,43 @@
|
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.EmitterConsistencyError = void 0;
|
|
13
|
+
exports.sanitizeLocatorReferences = sanitizeLocatorReferences;
|
|
13
14
|
exports.emitPageObject = emitPageObject;
|
|
14
15
|
exports.emitTestFile = emitTestFile;
|
|
15
16
|
const pw_emit_1 = require("@vijaypjavvadi/pw-emit");
|
|
16
17
|
const naming_1 = require("../utils/naming");
|
|
17
18
|
const commentSafe_1 = require("../utils/commentSafe");
|
|
19
|
+
/**
|
|
20
|
+
* v2.2.5 — BUG-9 safety net.
|
|
21
|
+
*
|
|
22
|
+
* If a cached LLM binding from v2.2.4 or earlier references a POM field
|
|
23
|
+
* whose name starts with a digit (e.g. `r0c934ddf001.0Of0` from
|
|
24
|
+
* juice-shop's "0 of 0" pagination label), we rewrite the
|
|
25
|
+
* digit-leading segment to be `_`-prefixed so the spec parses.
|
|
26
|
+
*
|
|
27
|
+
* The v2.2.5 field-name synthesiser already prevents new bindings from
|
|
28
|
+
* having this shape, but cached entries persist across versions until
|
|
29
|
+
* explicitly cleared.
|
|
30
|
+
*
|
|
31
|
+
* Patterns rewritten:
|
|
32
|
+
* `foo.0Of0` → `foo._0Of0` // member access onto digit
|
|
33
|
+
* `foo[0Of0]` → `foo[_0Of0]` // computed-property identifier
|
|
34
|
+
* `foo.0,0Of0` → `foo._0_0Of0` // commas → underscore
|
|
35
|
+
*/
|
|
36
|
+
function sanitizeLocatorReferences(s) {
|
|
37
|
+
if (!s)
|
|
38
|
+
return s;
|
|
39
|
+
// 1. `.<digit>` → `._<digit>` for member access
|
|
40
|
+
let out = s.replace(/(\.)([0-9][A-Za-z0-9_$,]*)/g, (_, dot, ident) => {
|
|
41
|
+
return dot + "_" + ident.replace(/,/g, "_");
|
|
42
|
+
});
|
|
43
|
+
// 2. Strip stray commas from identifier-shaped runs after a dot we
|
|
44
|
+
// already prefixed (handled above) and from bracket-property names.
|
|
45
|
+
out = out.replace(/\[([0-9][A-Za-z0-9_$,]*)\]/g, (_, ident) => {
|
|
46
|
+
return "[_" + ident.replace(/,/g, "_") + "]";
|
|
47
|
+
});
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
18
50
|
class EmitterConsistencyError extends Error {
|
|
19
51
|
constructor(message) {
|
|
20
52
|
super(message);
|
|
@@ -123,12 +155,18 @@ function bindingsToBody(bindings, prelude = []) {
|
|
|
123
155
|
lines.push(`await test.step(${labelLit}, async () => {`);
|
|
124
156
|
if (b.customBody) {
|
|
125
157
|
// Compound step — body has multiple statements pre-rendered.
|
|
126
|
-
|
|
158
|
+
// v2.2.5 — sanitize digit-leading POM references that may have been
|
|
159
|
+
// cached from older bdd2pw versions.
|
|
160
|
+
const safeBody = sanitizeLocatorReferences(b.customBody);
|
|
161
|
+
for (const line of safeBody.split("\n"))
|
|
127
162
|
lines.push(` ${line}`);
|
|
128
163
|
}
|
|
129
164
|
else if (b.pomCall) {
|
|
130
|
-
const args = b.pomCall.args
|
|
131
|
-
|
|
165
|
+
const args = b.pomCall.args
|
|
166
|
+
.map((a) => sanitizeLocatorReferences(a))
|
|
167
|
+
.join(", ");
|
|
168
|
+
const method = sanitizeLocatorReferences(b.pomCall.method);
|
|
169
|
+
lines.push(` await ${b.pomCall.page}.${method}(${args});`);
|
|
132
170
|
}
|
|
133
171
|
else if (b.assertion) {
|
|
134
172
|
const expected = b.assertion.expected !== undefined ? b.assertion.expected : "";
|
|
@@ -140,7 +178,9 @@ function bindingsToBody(bindings, prelude = []) {
|
|
|
140
178
|
// async ({ page }) => ...) when the locator is empty/whitespace.
|
|
141
179
|
const rawLocator = b.assertion.locator;
|
|
142
180
|
const trimmedLocator = (rawLocator == null ? "" : String(rawLocator)).trim();
|
|
143
|
-
|
|
181
|
+
// v2.2.5 — rewrite `.0Of0` → `._0Of0` for cached bindings.
|
|
182
|
+
const safeLocator = sanitizeLocatorReferences(trimmedLocator);
|
|
183
|
+
const renderedLocator = safeLocator === "" ? "page" : safeLocator;
|
|
144
184
|
lines.push(` await expect(${renderedLocator}).${b.assertion.matcher}(${expected});`);
|
|
145
185
|
}
|
|
146
186
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/emitters/facade.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/emitters/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -151,7 +151,7 @@ function synthFieldName(element) {
|
|
|
151
151
|
const idDerived = cssSelectorToName(element.cssSelector);
|
|
152
152
|
if (idDerived && STATUS_REGION_RE.test(idDerived)) {
|
|
153
153
|
const cleaned = idDerived.replace(/[^a-zA-Z0-9 ]/g, " ").trim();
|
|
154
|
-
return (0, naming_1.camelCase)(cleaned) || "errorRegion";
|
|
154
|
+
return (0, naming_1.toJsIdentifier)((0, naming_1.camelCase)(cleaned) || "errorRegion");
|
|
155
155
|
}
|
|
156
156
|
const baseName = element.name ??
|
|
157
157
|
element.label ??
|
|
@@ -166,7 +166,12 @@ function synthFieldName(element) {
|
|
|
166
166
|
if (suffix && !fieldName.toLowerCase().endsWith(suffix.toLowerCase())) {
|
|
167
167
|
fieldName += suffix;
|
|
168
168
|
}
|
|
169
|
-
|
|
169
|
+
// v2.2.5 — BUG-9 guard: ensure the name is a valid JS identifier.
|
|
170
|
+
// `camelCase("0 of 0")` returns "0Of0", which is not a legal
|
|
171
|
+
// identifier and breaks the .spec.ts parse. Prefix digit-leading
|
|
172
|
+
// names with `_` and strip any stray punctuation that survived
|
|
173
|
+
// upstream normalisation (commas, etc.).
|
|
174
|
+
return (0, naming_1.toJsIdentifier)(fieldName);
|
|
170
175
|
}
|
|
171
176
|
/**
|
|
172
177
|
* Best-effort name extraction from a CSS selector. Handles common shapes:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locatorPicker.js","sourceRoot":"","sources":["../../src/transformers/locatorPicker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAUH,kCAgHC;
|
|
1
|
+
{"version":3,"file":"locatorPicker.js","sourceRoot":"","sources":["../../src/transformers/locatorPicker.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/naming.d.ts
CHANGED
|
@@ -7,6 +7,26 @@
|
|
|
7
7
|
export declare function pascalCase(input: string): string;
|
|
8
8
|
/** Convert any case to camelCase. */
|
|
9
9
|
export declare function camelCase(input: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* v2.2.5 — coerce an arbitrary string into a valid TypeScript / JavaScript
|
|
12
|
+
* identifier. Used by the POM field-name synthesiser so we never emit
|
|
13
|
+
* code like `this.0Of0 = ...` (juice-shop pagination labels: "0 of 0",
|
|
14
|
+
* "1 - 50 of 0") which makes the .spec.ts file refuse to parse.
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* 1. Strip any character that isn't `[A-Za-z0-9_$]`. Commas, hyphens,
|
|
18
|
+
* backticks, quotes, whitespace etc. all go.
|
|
19
|
+
* 2. If what remains starts with a digit, prefix with a single `_`.
|
|
20
|
+
* JS identifier production: `IdentifierStart` = letter | `$` | `_`.
|
|
21
|
+
* 3. If the result is empty, return a stable fallback "_field" so the
|
|
22
|
+
* caller never has to handle empty-string corner cases.
|
|
23
|
+
*
|
|
24
|
+
* Reserved-word avoidance is intentionally NOT handled here: at the
|
|
25
|
+
* field-access site `obj.class` is fine (only top-level identifiers are
|
|
26
|
+
* reserved). If we later add free-standing identifier emission (e.g. let
|
|
27
|
+
* <name> = ...), revisit.
|
|
28
|
+
*/
|
|
29
|
+
export declare function toJsIdentifier(input: string): string;
|
|
10
30
|
/** Convert any case to kebab-case. */
|
|
11
31
|
export declare function kebabCase(input: string): string;
|
|
12
32
|
/** Convert any case to snake_case. */
|
package/dist/utils/naming.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.pascalCase = pascalCase;
|
|
9
9
|
exports.camelCase = camelCase;
|
|
10
|
+
exports.toJsIdentifier = toJsIdentifier;
|
|
10
11
|
exports.kebabCase = kebabCase;
|
|
11
12
|
exports.snakeCase = snakeCase;
|
|
12
13
|
exports.pageObjectFileStem = pageObjectFileStem;
|
|
@@ -22,6 +23,31 @@ function camelCase(input) {
|
|
|
22
23
|
const pascal = pascalCase(input);
|
|
23
24
|
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* v2.2.5 — coerce an arbitrary string into a valid TypeScript / JavaScript
|
|
28
|
+
* identifier. Used by the POM field-name synthesiser so we never emit
|
|
29
|
+
* code like `this.0Of0 = ...` (juice-shop pagination labels: "0 of 0",
|
|
30
|
+
* "1 - 50 of 0") which makes the .spec.ts file refuse to parse.
|
|
31
|
+
*
|
|
32
|
+
* Rules:
|
|
33
|
+
* 1. Strip any character that isn't `[A-Za-z0-9_$]`. Commas, hyphens,
|
|
34
|
+
* backticks, quotes, whitespace etc. all go.
|
|
35
|
+
* 2. If what remains starts with a digit, prefix with a single `_`.
|
|
36
|
+
* JS identifier production: `IdentifierStart` = letter | `$` | `_`.
|
|
37
|
+
* 3. If the result is empty, return a stable fallback "_field" so the
|
|
38
|
+
* caller never has to handle empty-string corner cases.
|
|
39
|
+
*
|
|
40
|
+
* Reserved-word avoidance is intentionally NOT handled here: at the
|
|
41
|
+
* field-access site `obj.class` is fine (only top-level identifiers are
|
|
42
|
+
* reserved). If we later add free-standing identifier emission (e.g. let
|
|
43
|
+
* <name> = ...), revisit.
|
|
44
|
+
*/
|
|
45
|
+
function toJsIdentifier(input) {
|
|
46
|
+
let s = input.replace(/[^A-Za-z0-9_$]/g, "");
|
|
47
|
+
if (s.length > 0 && /^[0-9]/.test(s))
|
|
48
|
+
s = "_" + s;
|
|
49
|
+
return s || "_field";
|
|
50
|
+
}
|
|
25
51
|
/** Convert any case to kebab-case. */
|
|
26
52
|
function kebabCase(input) {
|
|
27
53
|
return splitWords(input).map((w) => w.toLowerCase()).join("-");
|
package/dist/utils/naming.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAGH,gCAIC;AAGD,8BAGC;AAGD,8BAEC;AAGD,8BAEC;AAMD,gDAGC;AAMD,oCAEC;
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAGH,gCAIC;AAGD,8BAGC;AAqBD,wCAIC;AAGD,8BAEC;AAGD,8BAEC;AAMD,gDAGC;AAMD,oCAEC;AA/DD,sCAAsC;AACtC,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,UAAU,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAChE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,qCAAqC;AACrC,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,QAAQ,CAAC;AACvB,CAAC;AAED,sCAAsC;AACtC,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,sCAAsC;AACtC,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,SAAiB;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,WAAmB;IAC9C,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;AAC1C,CAAC;AAED,sEAAsE;AACtE,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vijaypjavvadi/bdd2pw",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.5",
|
|
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"
|