@vijaypjavvadi/bdd2pw 3.1.0 → 3.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/CHANGELOG.md +168 -0
- package/dist/emitters/facade.js +47 -11
- package/dist/emitters/facade.js.map +1 -1
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/parser/jsonScenarioParser.d.ts +55 -0
- package/dist/parser/jsonScenarioParser.js +169 -0
- package/dist/parser/jsonScenarioParser.js.map +1 -0
- package/dist/repo/projectScaffolder.d.ts +6 -0
- package/dist/repo/projectScaffolder.js +1 -0
- package/dist/repo/projectScaffolder.js.map +1 -1
- package/dist/reports/metaSidecar.d.ts +60 -0
- package/dist/reports/metaSidecar.js +86 -0
- package/dist/reports/metaSidecar.js.map +1 -0
- package/dist/reports/specMerge.d.ts +60 -0
- package/dist/reports/specMerge.js +131 -0
- package/dist/reports/specMerge.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,174 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
_Nothing yet._
|
|
11
11
|
|
|
12
|
+
## [3.3.0] — 2026-05-22
|
|
13
|
+
|
|
14
|
+
### Changed — TestForge step-hook signature extension (follow-up to v3.1.0 Issue 4)
|
|
15
|
+
|
|
16
|
+
TestForge follow-up request: the v3.1.0 step hook only received
|
|
17
|
+
`(testInfo, title)` — enough for metadata-only consumers, but not
|
|
18
|
+
for the most common use case (per-step screenshots, DOM capture,
|
|
19
|
+
artefact attachment). All of those need access to `page` (or
|
|
20
|
+
`request` / `context` / `browser`).
|
|
21
|
+
|
|
22
|
+
When `stepHooks: true`, the emitted `test.step(...)` wrapper now
|
|
23
|
+
looks like this:
|
|
24
|
+
|
|
25
|
+
await test.step("Given …", async () => {
|
|
26
|
+
await (globalThis as any).__bdd2pwHooks?.beforeStep?.(
|
|
27
|
+
testInfo,
|
|
28
|
+
"Given …",
|
|
29
|
+
{ page },
|
|
30
|
+
);
|
|
31
|
+
let _bdd2pwStatus: "passed" | "failed" = "passed";
|
|
32
|
+
try {
|
|
33
|
+
// step body
|
|
34
|
+
} catch (_bdd2pwErr) {
|
|
35
|
+
_bdd2pwStatus = "failed";
|
|
36
|
+
throw _bdd2pwErr;
|
|
37
|
+
} finally {
|
|
38
|
+
await (globalThis as any).__bdd2pwHooks?.afterStep?.(
|
|
39
|
+
testInfo,
|
|
40
|
+
"Given …",
|
|
41
|
+
_bdd2pwStatus,
|
|
42
|
+
{ page },
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
Three changes from v3.1.0:
|
|
48
|
+
|
|
49
|
+
1. **`fixtures` arg.** Both `beforeStep` and `afterStep` now receive
|
|
50
|
+
a `{ page, request?, context?, browser? }` object containing
|
|
51
|
+
whatever fixtures the surrounding `test()` callback
|
|
52
|
+
destructures. Currently always `{ page }` — when bdd2pw starts
|
|
53
|
+
threading multi-fixture signatures through `EmitTestFileInput`,
|
|
54
|
+
the same literal forwards automatically.
|
|
55
|
+
|
|
56
|
+
2. **`status` arg on `afterStep`.** Reports `"passed"` or
|
|
57
|
+
`"failed"` so consumers can attach failure-only artefacts
|
|
58
|
+
(per-step screenshot only when the step failed, full DOM dump
|
|
59
|
+
only on failure, etc.).
|
|
60
|
+
|
|
61
|
+
3. **try/catch/finally wrapping.** `afterStep` fires on the
|
|
62
|
+
failure path too — `_bdd2pwStatus` is set to `"failed"`, the
|
|
63
|
+
error is re-thrown, and `finally` runs the hook. Local
|
|
64
|
+
variable, no cross-step shadowing.
|
|
65
|
+
|
|
66
|
+
### Backward compatibility
|
|
67
|
+
|
|
68
|
+
Consumers whose hook signature is `(testInfo, title)` /
|
|
69
|
+
`(testInfo, title, status)` continue to work — JavaScript silently
|
|
70
|
+
drops the extra positional args. Optional chaining throughout
|
|
71
|
+
means consumers who don't set `__bdd2pwHooks` see no behaviour
|
|
72
|
+
change at all.
|
|
73
|
+
|
|
74
|
+
### Tests
|
|
75
|
+
|
|
76
|
+
`tests/unit/v310Fixtures.test.ts` — updated the existing
|
|
77
|
+
"stepHooks: true emits …" assertion to also verify the v3.3.0
|
|
78
|
+
shape: fixtures arg on both hooks, status arg on afterStep,
|
|
79
|
+
try/catch/finally wrapping with `_bdd2pwStatus`. Same fixture file
|
|
80
|
+
(`tests/fixtures/v3.1.0/04-step-hooks/input.feature`) — no new
|
|
81
|
+
fixture needed; the contract change is in the rendered output, not
|
|
82
|
+
the input.
|
|
83
|
+
|
|
84
|
+
## [3.2.0] — 2026-05-22
|
|
85
|
+
|
|
86
|
+
### Added — TestForge handoff P2 backlog (Issues 6-10)
|
|
87
|
+
|
|
88
|
+
Five P2 items from the TestForge handoff. None are bug fixes;
|
|
89
|
+
they're feature additions and extension points that close out the
|
|
90
|
+
backlog. All five default to "off / existing behavior", so v3.2.0
|
|
91
|
+
is byte-stable against v3.1.0 for callers who don't opt in.
|
|
92
|
+
|
|
93
|
+
#### Issue 6 — `playwright.config.ts` collision marker
|
|
94
|
+
|
|
95
|
+
The emitted `playwright.config.ts` now ends with a stable
|
|
96
|
+
`// bdd2pw:config-end` marker line followed by guidance comments.
|
|
97
|
+
Downstream tooling can splice additional code after that line
|
|
98
|
+
without risking a duplicate `defineConfig(...)` import. Lives in
|
|
99
|
+
`pw-emit@1.3.0`'s `playwright.config.ts.tmpl`.
|
|
100
|
+
|
|
101
|
+
#### Issue 9 — pin emitted dependency versions
|
|
102
|
+
|
|
103
|
+
New `dependencyStrategy?: "caret" | "exact"` on `ScaffoldOptions`
|
|
104
|
+
(and on pw-emit's `EmitProjectOptions`). Default `"caret"` matches
|
|
105
|
+
existing behavior. `"exact"` strips the leading `^` from every
|
|
106
|
+
devDependency version in the emitted `package.json`, pinning the
|
|
107
|
+
consuming project to exact versions of Playwright et al.
|
|
108
|
+
|
|
109
|
+
#### Issue 10 — `*.spec.meta.json` sidecar
|
|
110
|
+
|
|
111
|
+
New `metaSidecar?: boolean` on `ScaffoldOptions`. When true,
|
|
112
|
+
`scaffold()` writes `<spec-stem>.spec.meta.json` alongside each
|
|
113
|
+
emitted `.spec.ts` describing every step semantically:
|
|
114
|
+
|
|
115
|
+
{
|
|
116
|
+
"version": "3.2.0",
|
|
117
|
+
"source": "features/login.feature",
|
|
118
|
+
"scenarios": [{
|
|
119
|
+
"name": "...",
|
|
120
|
+
"tags": ["@positive"],
|
|
121
|
+
"steps": [
|
|
122
|
+
{ "id": "0001", "keyword": "Given", "text": "...",
|
|
123
|
+
"intent": "navigation", "locator": "loginPage.goto",
|
|
124
|
+
"assertion": "goto" },
|
|
125
|
+
...
|
|
126
|
+
]
|
|
127
|
+
}]
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
Intent ∈ { navigation | interaction | assertion | api | compound |
|
|
131
|
+
todo }, classified from the binding shape. Lets downstream tools
|
|
132
|
+
(visual regression, defect analysis, self-healing) consume bdd2pw's
|
|
133
|
+
semantic understanding without re-parsing TS.
|
|
134
|
+
|
|
135
|
+
New module `src/reports/metaSidecar.ts`. IDs match the optional
|
|
136
|
+
step-boundary markers (v3.1.0 Issue 5) so post-processors can
|
|
137
|
+
correlate the sidecar with in-source markers when both are on.
|
|
138
|
+
|
|
139
|
+
#### Issue 8 — structured JSON scenarios as input
|
|
140
|
+
|
|
141
|
+
`scaffold({ feature: "scenarios.json", ... })` now works. The
|
|
142
|
+
JSON converter accepts either a single object or an array of
|
|
143
|
+
objects with `{ name, kind, preconditions, actions, expected,
|
|
144
|
+
data, tags }`. Synthesised Gherkin steps follow standard BDD
|
|
145
|
+
convention (`Given` for preconditions, `When/And` for actions,
|
|
146
|
+
`Then/And` for expected). `<placeholder>` tokens in step text are
|
|
147
|
+
substituted from `data`. Tags can be set explicitly or derived
|
|
148
|
+
from `kind` (`"api"` → `@api`, `"mixed"` → `@ui @api`).
|
|
149
|
+
|
|
150
|
+
New module `src/parser/jsonScenarioParser.ts`. Detected by file
|
|
151
|
+
extension; `.feature` continues through `gherkinParser` unchanged.
|
|
152
|
+
|
|
153
|
+
#### Issue 7 — idempotent regen with user-block preservation
|
|
154
|
+
|
|
155
|
+
New `merge?: boolean` on `ScaffoldOptions`. When true:
|
|
156
|
+
|
|
157
|
+
- Each emitted spec gets a `// bdd2pw:generated v=<version>
|
|
158
|
+
source=<feature>` header so a future regen can detect it.
|
|
159
|
+
- Users can wrap hand-edited code in
|
|
160
|
+
`// bdd2pw:user-block id="<id>"` ...
|
|
161
|
+
`// bdd2pw:end-user-block` markers anywhere in the spec.
|
|
162
|
+
- During regeneration, blocks with matching ids are spliced back
|
|
163
|
+
into the new output. Orphaned blocks (id absent from the new
|
|
164
|
+
output) are appended under a clearly-labeled
|
|
165
|
+
`// ── bdd2pw:stale-user-blocks ──` footer so nothing is lost
|
|
166
|
+
silently.
|
|
167
|
+
|
|
168
|
+
Without `merge`, the existing overwrite behavior is unchanged.
|
|
169
|
+
|
|
170
|
+
New module `src/reports/specMerge.ts`.
|
|
171
|
+
|
|
172
|
+
### pw-emit v1.3.0 (required peer)
|
|
173
|
+
|
|
174
|
+
- `playwright.config.ts.tmpl` ends with the `// bdd2pw:config-end`
|
|
175
|
+
marker + guidance comments.
|
|
176
|
+
- `EmitProjectOptions.dependencyStrategy?: "caret" | "exact"`.
|
|
177
|
+
|
|
178
|
+
Both additions are additive and default-off. SemVer minor.
|
|
179
|
+
|
|
12
180
|
## [3.1.0] — 2026-05-22
|
|
13
181
|
|
|
14
182
|
### Fixed — TestForge handoff report
|
package/dist/emitters/facade.js
CHANGED
|
@@ -110,9 +110,15 @@ function emitTestFile(input) {
|
|
|
110
110
|
hasApi: s.bindings.some((b) => b.apiContext === true),
|
|
111
111
|
}));
|
|
112
112
|
const featureHasApi = scenariosWithApiFlag.some((s) => s.hasApi);
|
|
113
|
+
// v3.3.0 — fixtures destructured by the emitted `test(...)` callback.
|
|
114
|
+
// Forwarded into the step hooks so consumers can take per-step
|
|
115
|
+
// screenshots / save DOM / etc. without re-resolving fixtures.
|
|
116
|
+
// Defaults to `["page"]` — matches pw-emit's testEmitter default.
|
|
117
|
+
const defaultFixtures = ["page"];
|
|
113
118
|
const stepOpts = {
|
|
114
119
|
stepHooks: input.stepHooks === true,
|
|
115
120
|
stepMarkers: input.stepMarkers === true,
|
|
121
|
+
fixtures: defaultFixtures,
|
|
116
122
|
};
|
|
117
123
|
const ir = {
|
|
118
124
|
describeName: input.describeName,
|
|
@@ -178,6 +184,8 @@ function emitTestFile(input) {
|
|
|
178
184
|
* Gherkin scenario.
|
|
179
185
|
*/
|
|
180
186
|
function bindingsToBody(bindings, prelude = [], options = {}) {
|
|
187
|
+
const fixtureNames = options.fixtures && options.fixtures.length > 0 ? options.fixtures : ["page"];
|
|
188
|
+
const fixturesLit = `{ ${fixtureNames.join(", ")} }`;
|
|
181
189
|
const lines = [];
|
|
182
190
|
if (prelude.length > 0) {
|
|
183
191
|
lines.push(...prelude);
|
|
@@ -203,26 +211,24 @@ function bindingsToBody(bindings, prelude = [], options = {}) {
|
|
|
203
211
|
lines.push(`// bdd2pw:step-open id="${stepId}" title=${JSON.stringify(stepLabel)}`);
|
|
204
212
|
}
|
|
205
213
|
lines.push(`await test.step(${labelLit}, async () => {`);
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
|
|
210
|
-
lines.push(` await (globalThis as any).__bdd2pwHooks?.beforeStep?.(testInfo, ${labelLit});`);
|
|
211
|
-
}
|
|
214
|
+
// Collect the step body into a buffer. When stepHooks is on, the
|
|
215
|
+
// buffer is wrapped in try/catch/finally below; otherwise it's
|
|
216
|
+
// emitted directly inside the test.step arrow.
|
|
217
|
+
const bodyLines = [];
|
|
212
218
|
if (b.customBody) {
|
|
213
219
|
// Compound step — body has multiple statements pre-rendered.
|
|
214
220
|
// v2.2.5 — sanitize digit-leading POM references that may have been
|
|
215
221
|
// cached from older bdd2pw versions.
|
|
216
222
|
const safeBody = sanitizeLocatorReferences(b.customBody);
|
|
217
223
|
for (const line of safeBody.split("\n"))
|
|
218
|
-
|
|
224
|
+
bodyLines.push(line);
|
|
219
225
|
}
|
|
220
226
|
else if (b.pomCall) {
|
|
221
227
|
const args = b.pomCall.args
|
|
222
228
|
.map((a) => sanitizeLocatorReferences(a))
|
|
223
229
|
.join(", ");
|
|
224
230
|
const method = sanitizeLocatorReferences(b.pomCall.method);
|
|
225
|
-
|
|
231
|
+
bodyLines.push(`await ${b.pomCall.page}.${method}(${args});`);
|
|
226
232
|
}
|
|
227
233
|
else if (b.assertion) {
|
|
228
234
|
const expected = b.assertion.expected !== undefined ? b.assertion.expected : "";
|
|
@@ -237,7 +243,7 @@ function bindingsToBody(bindings, prelude = [], options = {}) {
|
|
|
237
243
|
// v2.2.5 — rewrite `.0Of0` → `._0Of0` for cached bindings.
|
|
238
244
|
const safeLocator = sanitizeLocatorReferences(trimmedLocator);
|
|
239
245
|
const renderedLocator = safeLocator === "" ? "page" : safeLocator;
|
|
240
|
-
|
|
246
|
+
bodyLines.push(`await expect(${renderedLocator}).${b.assertion.matcher}(${expected});`);
|
|
241
247
|
}
|
|
242
248
|
else {
|
|
243
249
|
// v2.0.1 — defensively flatten the warning so any newlines in error
|
|
@@ -245,10 +251,40 @@ function bindingsToBody(bindings, prelude = [], options = {}) {
|
|
|
245
251
|
// native module load failures) don't bleed past the `//` and break
|
|
246
252
|
// the .spec.ts parse.
|
|
247
253
|
const safeWarning = (0, commentSafe_1.flattenForComment)(b.warning ?? "no rule matched this step");
|
|
248
|
-
|
|
254
|
+
bodyLines.push(`// TODO: ${safeWarning}`);
|
|
249
255
|
}
|
|
256
|
+
// v3.1.0 + v3.3.0 — opt-in step hook callouts. v3.3.0 extends the
|
|
257
|
+
// signature with two new positional args:
|
|
258
|
+
// - `status: "passed" | "failed"` on afterStep (so consumers can
|
|
259
|
+
// attach failure-only artefacts).
|
|
260
|
+
// - `fixtures: { page, request?, context?, browser? }` on both
|
|
261
|
+
// (so consumers can take per-step screenshots, save DOM
|
|
262
|
+
// snapshots, etc. without re-resolving fixtures).
|
|
263
|
+
//
|
|
264
|
+
// The body is wrapped in try/catch/finally so afterStep fires on
|
|
265
|
+
// the failure path too. `_bdd2pwStatus` is local to this arrow —
|
|
266
|
+
// no cross-step shadowing.
|
|
267
|
+
//
|
|
268
|
+
// Optional chaining throughout means consumers who don't set
|
|
269
|
+
// `(globalThis as any).__bdd2pwHooks = {...}` see zero behaviour
|
|
270
|
+
// change. Existing v3.1/3.2 hooks that ignore the new positional
|
|
271
|
+
// args continue to work — JS silently drops the extras.
|
|
250
272
|
if (options.stepHooks) {
|
|
251
|
-
lines.push(` await (globalThis as any).__bdd2pwHooks?.
|
|
273
|
+
lines.push(` await (globalThis as any).__bdd2pwHooks?.beforeStep?.(testInfo, ${labelLit}, ${fixturesLit});`);
|
|
274
|
+
lines.push(` let _bdd2pwStatus: "passed" | "failed" = "passed";`);
|
|
275
|
+
lines.push(` try {`);
|
|
276
|
+
for (const bl of bodyLines)
|
|
277
|
+
lines.push(` ${bl}`);
|
|
278
|
+
lines.push(` } catch (_bdd2pwErr) {`);
|
|
279
|
+
lines.push(` _bdd2pwStatus = "failed";`);
|
|
280
|
+
lines.push(` throw _bdd2pwErr;`);
|
|
281
|
+
lines.push(` } finally {`);
|
|
282
|
+
lines.push(` await (globalThis as any).__bdd2pwHooks?.afterStep?.(testInfo, ${labelLit}, _bdd2pwStatus, ${fixturesLit});`);
|
|
283
|
+
lines.push(` }`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
for (const bl of bodyLines)
|
|
287
|
+
lines.push(` ${bl}`);
|
|
252
288
|
}
|
|
253
289
|
lines.push(`});`);
|
|
254
290
|
if (options.stepMarkers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/emitters/facade.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAsCH,8DAYC;AA6ED,wCAQC;AAeD,
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/emitters/facade.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAsCH,8DAYC;AA6ED,wCAQC;AAeD,oCAiEC;AArND,oDAQgC;AAQhC,4CAA4C;AAC5C,sDAAyD;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,yBAAyB,CAAC,CAAS;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,gDAAgD;IAChD,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnE,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,mEAAmE;IACnE,uEAAuE;IACvE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAC5D,OAAO,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC;AA6CD;;;GAGG;AACH,SAAS,iBAAiB,CAAC,CAAgB;IACzC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAiB;IACzC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACzC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,KAA0B;IACvD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,uBAAuB,CAC/B,wGAAwG,CACzG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAA0B,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;IAC/E,OAAO,IAAA,wBAAgB,EAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,YAAY,CAAC,KAAwB;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,IAAA,kBAAS,EAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,SAAS,CACrE,CAAC;IAEF,uEAAuE;IACvE,qEAAqE;IACrE,oBAAoB;IACpB,qEAAqE;IACrE,gEAAgE;IAChE,wEAAwE;IACxE,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,CAAC;QACJ,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC;KACtD,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEjE,sEAAsE;IACtE,+DAA+D;IAC/D,+DAA+D;IAC/D,kEAAkE;IAClE,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG;QACf,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI;QACnC,WAAW,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI;QACvC,QAAQ,EAAE,eAAe;KAC1B,CAAC;IACF,MAAM,EAAE,GAAe;QACrB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EACR,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM;YACzC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjE,CAAC,CAAC,SAAS;QACf,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC/D,oEAAoE;YACpE,iEAAiE;YACjE,qEAAqE;YACrE,kCAAkC;YAClC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM;gBACnB,CAAC,CAAC,wBAAwB,QAAQ,EAAE;gBACpC,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI;gBACJ,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC;QACJ,CAAC,CAAC;QACF,qEAAqE;QACrE,sEAAsE;QACtE,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACnE,mBAAmB,EAAE,aAAa;YAChC,CAAC,CAAC;gBACE,6CAA6C;gBAC7C,4DAA4D;gBAC5D,6DAA6D;gBAC7D,6DAA6D;gBAC7D,6DAA6D;gBAC7D,2DAA2D;gBAC3D,iIAAiI;aAClI,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,SAAS;KACd,CAAC;IACF,OAAO,IAAA,sBAAc,EAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAS,cAAc,CACrB,QAAuB,EACvB,UAAoB,EAAE,EACtB,UAYI,EAAE;IAEN,MAAM,YAAY,GAChB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC;QAClF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9D,gEAAgE;QAChE,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE3C,oEAAoE;QACpE,qEAAqE;QACrE,mEAAmE;QACnE,qCAAqC;QACrC,SAAS,IAAI,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CACR,2BAA2B,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CACxE,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,iBAAiB,CAAC,CAAC;QAEzD,iEAAiE;QACjE,+DAA+D;QAC/D,+CAA+C;QAC/C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,6DAA6D;YAC7D,oEAAoE;YACpE,qCAAqC;YACrC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI;iBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;iBACxC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3D,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GACZ,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,mEAAmE;YACnE,kEAAkE;YAClE,iEAAiE;YACjE,kEAAkE;YAClE,uDAAuD;YACvD,iEAAiE;YACjE,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACvC,MAAM,cAAc,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,2DAA2D;YAC3D,MAAM,WAAW,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;YAClE,SAAS,CAAC,IAAI,CACZ,gBAAgB,eAAe,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,QAAQ,IAAI,CACxE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,mEAAmE;YACnE,mEAAmE;YACnE,sBAAsB;YACtB,MAAM,WAAW,GAAG,IAAA,+BAAiB,EACnC,CAAC,CAAC,OAAO,IAAI,2BAA2B,CACzC,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,kEAAkE;QAClE,0CAA0C;QAC1C,mEAAmE;QACnE,sCAAsC;QACtC,iEAAiE;QACjE,4DAA4D;QAC5D,sDAAsD;QACtD,EAAE;QACF,iEAAiE;QACjE,iEAAiE;QACjE,2BAA2B;QAC3B,EAAE;QACF,6DAA6D;QAC7D,iEAAiE;QACjE,iEAAiE;QACjE,wDAAwD;QACxD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CACR,qEAAqE,QAAQ,KAAK,WAAW,IAAI,CAClG,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,MAAM,EAAE,IAAI,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CACR,sEAAsE,QAAQ,oBAAoB,WAAW,IAAI,CAClH,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,EAAE,IAAI,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,4BAA4B,MAAM,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,sBAAsB;IACtB,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -44,7 +44,10 @@ exports.analyze = analyze;
|
|
|
44
44
|
exports.updatePom = updatePom;
|
|
45
45
|
const fs = __importStar(require("fs-extra"));
|
|
46
46
|
const path = __importStar(require("path"));
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
48
|
+
const PACKAGE_VERSION = require("../package.json").version;
|
|
47
49
|
const gherkinParser_1 = require("./parser/gherkinParser");
|
|
50
|
+
const jsonScenarioParser_1 = require("./parser/jsonScenarioParser");
|
|
48
51
|
const repoScanner_1 = require("./repo/repoScanner");
|
|
49
52
|
const projectScaffolder_1 = require("./repo/projectScaffolder");
|
|
50
53
|
const mcpClient_1 = require("./discovery/mcpClient");
|
|
@@ -55,6 +58,8 @@ const stepMatcher_1 = require("./transformers/stepMatcher");
|
|
|
55
58
|
const facade_1 = require("./emitters/facade");
|
|
56
59
|
const tscRunner_1 = require("./validate/tscRunner");
|
|
57
60
|
const reviewReport_1 = require("./reports/reviewReport");
|
|
61
|
+
const metaSidecar_1 = require("./reports/metaSidecar");
|
|
62
|
+
const specMerge_1 = require("./reports/specMerge");
|
|
58
63
|
const naming_1 = require("./utils/naming");
|
|
59
64
|
const pw_emit_1 = require("@vijaypjavvadi/pw-emit");
|
|
60
65
|
const logger_1 = require("./utils/logger");
|
|
@@ -86,8 +91,12 @@ class NotImplementedError extends Error {
|
|
|
86
91
|
async function scaffold(opts) {
|
|
87
92
|
const reviewItems = [];
|
|
88
93
|
logger_1.logger.info({ feature: opts.feature, page: opts.page, repo: opts.repo }, "scaffold start");
|
|
89
|
-
// 1) Parse Gherkin
|
|
90
|
-
|
|
94
|
+
// 1) Parse Gherkin — or JSON scenarios (v3.2.0, TestForge Issue 8).
|
|
95
|
+
// The converter produces a FeatureIR with identical shape so the
|
|
96
|
+
// downstream pipeline is uniform.
|
|
97
|
+
const feature = (0, jsonScenarioParser_1.isJsonScenarioFile)(opts.feature)
|
|
98
|
+
? await (0, jsonScenarioParser_1.parseJsonScenarios)(opts.feature)
|
|
99
|
+
: await (0, gherkinParser_1.parseFeature)(opts.feature);
|
|
91
100
|
reviewItems.push({
|
|
92
101
|
severity: "info",
|
|
93
102
|
message: `Parsed feature "${feature.name}" — ${feature.scenarios.length} scenario(s)${feature.background ? " + Background" : ""}`,
|
|
@@ -99,6 +108,7 @@ async function scaffold(opts) {
|
|
|
99
108
|
baseUrl: opts.url,
|
|
100
109
|
projectName: feature.name.toLowerCase().replace(/\s+/g, "-"),
|
|
101
110
|
selfHealing: opts.selfHealing,
|
|
111
|
+
dependencyStrategy: opts.dependencyStrategy,
|
|
102
112
|
});
|
|
103
113
|
reviewItems.push(...scaffoldResult.warnings);
|
|
104
114
|
// 3) Scan target repo for existing POMs
|
|
@@ -368,8 +378,46 @@ async function scaffold(opts) {
|
|
|
368
378
|
});
|
|
369
379
|
reviewItems.push(...specEmit.warnings.map((w) => ({ ...w, file: specPath })));
|
|
370
380
|
await fs.ensureDir(path.dirname(specPath));
|
|
371
|
-
|
|
381
|
+
// v3.2.0 — TestForge Issue 7: merge mode. Preserve user-edited
|
|
382
|
+
// `// bdd2pw:user-block` sections from the existing spec, and
|
|
383
|
+
// prepend a `// bdd2pw:generated v=… source=…` header so future
|
|
384
|
+
// merges can recognise our own output.
|
|
385
|
+
let finalSpec = specEmit.contents;
|
|
386
|
+
if (opts.merge) {
|
|
387
|
+
finalSpec = (0, specMerge_1.prependGeneratedHeader)(finalSpec, PACKAGE_VERSION, path.relative(opts.repo, opts.feature));
|
|
388
|
+
if (await fs.pathExists(specPath)) {
|
|
389
|
+
const previous = await fs.readFile(specPath, "utf8");
|
|
390
|
+
if ((0, specMerge_1.isMergeAnnotated)(previous)) {
|
|
391
|
+
const preserved = (0, specMerge_1.extractUserBlocks)(previous);
|
|
392
|
+
if (preserved.size > 0) {
|
|
393
|
+
finalSpec = (0, specMerge_1.mergeUserBlocks)(finalSpec, preserved);
|
|
394
|
+
reviewItems.push({
|
|
395
|
+
severity: "info",
|
|
396
|
+
message: `[merge] preserved ${preserved.size} user-block section(s) in ${path.basename(specPath)}.`,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
await fs.writeFile(specPath, finalSpec, "utf8");
|
|
372
403
|
filesWritten.push(specPath);
|
|
404
|
+
// v3.2.0 — TestForge Issue 10: emit a *.spec.meta.json sidecar
|
|
405
|
+
// describing every step's intent / locator / assertion. Off by
|
|
406
|
+
// default; consumers opt in via `opts.metaSidecar`.
|
|
407
|
+
if (opts.metaSidecar) {
|
|
408
|
+
const sidecar = {
|
|
409
|
+
version: PACKAGE_VERSION,
|
|
410
|
+
source: path.relative(opts.repo, opts.feature),
|
|
411
|
+
scenarios: flattened.map((s) => ({
|
|
412
|
+
name: s.name,
|
|
413
|
+
tags: s.tags,
|
|
414
|
+
steps: (0, metaSidecar_1.bindingsToMetaSteps)(s.bindings),
|
|
415
|
+
})),
|
|
416
|
+
};
|
|
417
|
+
const metaPath = specPath.replace(/\.spec\.ts$/, ".spec.meta.json");
|
|
418
|
+
await fs.writeFile(metaPath, JSON.stringify(sidecar, null, 2), "utf8");
|
|
419
|
+
filesWritten.push(metaPath);
|
|
420
|
+
}
|
|
373
421
|
}
|
|
374
422
|
// 10) Validate
|
|
375
423
|
let tscErrorCount = 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3.2.0 — TestForge handoff Issue 8. Accept structured JSON scenarios
|
|
3
|
+
* in addition to .feature files.
|
|
4
|
+
*
|
|
5
|
+
* Input shape (TestForge's TCG output):
|
|
6
|
+
*
|
|
7
|
+
* {
|
|
8
|
+
* "name": "Login with valid credentials",
|
|
9
|
+
* "kind": "ui",
|
|
10
|
+
* "heuristic": "happy path",
|
|
11
|
+
* "preconditions": ["user is registered"],
|
|
12
|
+
* "actions": ["navigate to login page", "fill username", ...],
|
|
13
|
+
* "expected": ["dashboard is visible"],
|
|
14
|
+
* "data": { "username": "student", "password": "Password123" }
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* Either a single object or an array of objects is accepted at the
|
|
18
|
+
* top level. The converter synthesises Gherkin steps:
|
|
19
|
+
*
|
|
20
|
+
* - preconditions → `Given <text>`
|
|
21
|
+
* - actions → `When <text>` (first), `And <text>` (rest)
|
|
22
|
+
* - expected → `Then <text>` (first), `And <text>` (rest)
|
|
23
|
+
*
|
|
24
|
+
* `data` is appended to each action step that contains a templating
|
|
25
|
+
* placeholder like `<username>`; otherwise it's surfaced as a Gherkin
|
|
26
|
+
* doc-string attached to the first action step.
|
|
27
|
+
*
|
|
28
|
+
* The synthesised FeatureIR is identical in shape to what
|
|
29
|
+
* gherkinParser produces, so downstream code (stepMatcher, emitTestFile)
|
|
30
|
+
* treats both paths uniformly.
|
|
31
|
+
*/
|
|
32
|
+
import type { FeatureIR } from "../types";
|
|
33
|
+
export interface JsonScenario {
|
|
34
|
+
name: string;
|
|
35
|
+
kind?: "ui" | "api" | "mixed" | string;
|
|
36
|
+
heuristic?: string;
|
|
37
|
+
preconditions?: string[];
|
|
38
|
+
actions?: string[];
|
|
39
|
+
expected?: string[];
|
|
40
|
+
data?: Record<string, string | number | boolean>;
|
|
41
|
+
/** Optional explicit tags. If omitted, derived from `kind`. */
|
|
42
|
+
tags?: string[];
|
|
43
|
+
}
|
|
44
|
+
/** Detect whether a file path is a JSON-scenario input. */
|
|
45
|
+
export declare function isJsonScenarioFile(file: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Read a JSON scenarios file and convert it to a FeatureIR. The
|
|
48
|
+
* feature name is derived from the file basename (matching gherkin
|
|
49
|
+
* convention: `login.feature` → "login"). Each top-level scenario in
|
|
50
|
+
* the JSON becomes a ScenarioIR.
|
|
51
|
+
*
|
|
52
|
+
* Returns a fully-formed FeatureIR — sourceFile points at the JSON
|
|
53
|
+
* file so the rest of the pipeline can reference the input correctly.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseJsonScenarios(filePath: string): Promise<FeatureIR>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v3.2.0 — TestForge handoff Issue 8. Accept structured JSON scenarios
|
|
4
|
+
* in addition to .feature files.
|
|
5
|
+
*
|
|
6
|
+
* Input shape (TestForge's TCG output):
|
|
7
|
+
*
|
|
8
|
+
* {
|
|
9
|
+
* "name": "Login with valid credentials",
|
|
10
|
+
* "kind": "ui",
|
|
11
|
+
* "heuristic": "happy path",
|
|
12
|
+
* "preconditions": ["user is registered"],
|
|
13
|
+
* "actions": ["navigate to login page", "fill username", ...],
|
|
14
|
+
* "expected": ["dashboard is visible"],
|
|
15
|
+
* "data": { "username": "student", "password": "Password123" }
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* Either a single object or an array of objects is accepted at the
|
|
19
|
+
* top level. The converter synthesises Gherkin steps:
|
|
20
|
+
*
|
|
21
|
+
* - preconditions → `Given <text>`
|
|
22
|
+
* - actions → `When <text>` (first), `And <text>` (rest)
|
|
23
|
+
* - expected → `Then <text>` (first), `And <text>` (rest)
|
|
24
|
+
*
|
|
25
|
+
* `data` is appended to each action step that contains a templating
|
|
26
|
+
* placeholder like `<username>`; otherwise it's surfaced as a Gherkin
|
|
27
|
+
* doc-string attached to the first action step.
|
|
28
|
+
*
|
|
29
|
+
* The synthesised FeatureIR is identical in shape to what
|
|
30
|
+
* gherkinParser produces, so downstream code (stepMatcher, emitTestFile)
|
|
31
|
+
* treats both paths uniformly.
|
|
32
|
+
*/
|
|
33
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
36
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
37
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
38
|
+
}
|
|
39
|
+
Object.defineProperty(o, k2, desc);
|
|
40
|
+
}) : (function(o, m, k, k2) {
|
|
41
|
+
if (k2 === undefined) k2 = k;
|
|
42
|
+
o[k2] = m[k];
|
|
43
|
+
}));
|
|
44
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
45
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
46
|
+
}) : function(o, v) {
|
|
47
|
+
o["default"] = v;
|
|
48
|
+
});
|
|
49
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
50
|
+
var ownKeys = function(o) {
|
|
51
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
52
|
+
var ar = [];
|
|
53
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
54
|
+
return ar;
|
|
55
|
+
};
|
|
56
|
+
return ownKeys(o);
|
|
57
|
+
};
|
|
58
|
+
return function (mod) {
|
|
59
|
+
if (mod && mod.__esModule) return mod;
|
|
60
|
+
var result = {};
|
|
61
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
62
|
+
__setModuleDefault(result, mod);
|
|
63
|
+
return result;
|
|
64
|
+
};
|
|
65
|
+
})();
|
|
66
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
+
exports.isJsonScenarioFile = isJsonScenarioFile;
|
|
68
|
+
exports.parseJsonScenarios = parseJsonScenarios;
|
|
69
|
+
const fs = __importStar(require("fs-extra"));
|
|
70
|
+
const path = __importStar(require("path"));
|
|
71
|
+
/** Detect whether a file path is a JSON-scenario input. */
|
|
72
|
+
function isJsonScenarioFile(file) {
|
|
73
|
+
return /\.json$/i.test(file);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read a JSON scenarios file and convert it to a FeatureIR. The
|
|
77
|
+
* feature name is derived from the file basename (matching gherkin
|
|
78
|
+
* convention: `login.feature` → "login"). Each top-level scenario in
|
|
79
|
+
* the JSON becomes a ScenarioIR.
|
|
80
|
+
*
|
|
81
|
+
* Returns a fully-formed FeatureIR — sourceFile points at the JSON
|
|
82
|
+
* file so the rest of the pipeline can reference the input correctly.
|
|
83
|
+
*/
|
|
84
|
+
async function parseJsonScenarios(filePath) {
|
|
85
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(raw);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
throw new Error(`JSON scenarios file ${filePath} is not valid JSON: ${err.message}`);
|
|
92
|
+
}
|
|
93
|
+
const list = Array.isArray(parsed)
|
|
94
|
+
? parsed
|
|
95
|
+
: [parsed];
|
|
96
|
+
const scenarios = list.map(jsonScenarioToScenarioIR);
|
|
97
|
+
const featureName = path.basename(filePath, path.extname(filePath));
|
|
98
|
+
return {
|
|
99
|
+
name: featureName,
|
|
100
|
+
description: undefined,
|
|
101
|
+
background: undefined,
|
|
102
|
+
scenarios,
|
|
103
|
+
tags: [],
|
|
104
|
+
sourceFile: filePath,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Convert one JSON scenario object to a ScenarioIR. The action/expected
|
|
109
|
+
* arrays are flattened into a Gherkin step list following standard BDD
|
|
110
|
+
* convention: first step in each group gets the strong keyword
|
|
111
|
+
* (Given/When/Then), subsequent steps get `And`.
|
|
112
|
+
*/
|
|
113
|
+
function jsonScenarioToScenarioIR(s) {
|
|
114
|
+
if (!s || typeof s !== "object" || typeof s.name !== "string") {
|
|
115
|
+
throw new Error(`Each JSON scenario must have a string "name" field. Received: ${JSON.stringify(s)}`);
|
|
116
|
+
}
|
|
117
|
+
const steps = [];
|
|
118
|
+
for (let i = 0; i < (s.preconditions?.length ?? 0); i++) {
|
|
119
|
+
steps.push({
|
|
120
|
+
keyword: i === 0 ? "Given" : "And",
|
|
121
|
+
text: s.preconditions[i],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
for (let i = 0; i < (s.actions?.length ?? 0); i++) {
|
|
125
|
+
const text = applyDataTemplating(s.actions[i], s.data);
|
|
126
|
+
steps.push({
|
|
127
|
+
keyword: i === 0 ? "When" : "And",
|
|
128
|
+
text,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
for (let i = 0; i < (s.expected?.length ?? 0); i++) {
|
|
132
|
+
steps.push({
|
|
133
|
+
keyword: i === 0 ? "Then" : "And",
|
|
134
|
+
text: applyDataTemplating(s.expected[i], s.data),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Tag derivation: explicit `tags` wins; otherwise derive from `kind`
|
|
138
|
+
// so `kind: "api"` produces `@api` automatically. Same for ui/mixed.
|
|
139
|
+
const tags = s.tags ?? deriveTagsFromKind(s.kind);
|
|
140
|
+
return {
|
|
141
|
+
name: s.name,
|
|
142
|
+
steps,
|
|
143
|
+
tags,
|
|
144
|
+
examples: undefined,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function deriveTagsFromKind(kind) {
|
|
148
|
+
if (!kind)
|
|
149
|
+
return [];
|
|
150
|
+
if (kind === "mixed")
|
|
151
|
+
return ["@ui", "@api"];
|
|
152
|
+
return [`@${kind}`];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Replace `<placeholder>` tokens in a step text with values from the
|
|
156
|
+
* scenario's `data` object. Leaves the step alone when no placeholders
|
|
157
|
+
* are present. Same convention as Cucumber's Scenario Outline.
|
|
158
|
+
*/
|
|
159
|
+
function applyDataTemplating(text, data) {
|
|
160
|
+
if (!data)
|
|
161
|
+
return text;
|
|
162
|
+
return text.replace(/<([a-zA-Z_][\w]*)>/g, (full, key) => {
|
|
163
|
+
if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
164
|
+
return String(data[key]);
|
|
165
|
+
}
|
|
166
|
+
return full; // leave unreplaced placeholders intact
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=jsonScenarioParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonScenarioParser.js","sourceRoot":"","sources":["../../src/parser/jsonScenarioParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,12 @@ export interface ScaffoldProjectOptions {
|
|
|
26
26
|
projectName?: string;
|
|
27
27
|
/** When true, also write lib/heal.ts and patch tsconfig paths. */
|
|
28
28
|
selfHealing?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* v3.2.0 — pin emitted devDependency versions when set to `exact`.
|
|
31
|
+
* Default `caret` matches existing behavior. See TestForge handoff
|
|
32
|
+
* Issue 9 and pw-emit v1.3.0.
|
|
33
|
+
*/
|
|
34
|
+
dependencyStrategy?: "caret" | "exact";
|
|
29
35
|
}
|
|
30
36
|
export interface ScaffoldProjectResult {
|
|
31
37
|
filesWritten: string[];
|
|
@@ -63,6 +63,7 @@ async function scaffoldProject(opts) {
|
|
|
63
63
|
templatesDir: opts.templatesDir,
|
|
64
64
|
baseUrl: opts.baseUrl,
|
|
65
65
|
projectName: opts.projectName,
|
|
66
|
+
dependencyStrategy: opts.dependencyStrategy,
|
|
66
67
|
});
|
|
67
68
|
const filesWritten = [...result.filesWritten];
|
|
68
69
|
const warnings = [...result.warnings];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectScaffolder.js","sourceRoot":"","sources":["../../src/repo/projectScaffolder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"projectScaffolder.js","sourceRoot":"","sources":["../../src/repo/projectScaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3.2.0 — TestForge handoff Issue 10. Emit a `<spec-stem>.spec.meta.json`
|
|
3
|
+
* file alongside each generated `.spec.ts` describing every step's
|
|
4
|
+
* semantic intent. Lets downstream tooling (visual regression, defect
|
|
5
|
+
* analysis, self-healing pipelines) consume bdd2pw's understanding
|
|
6
|
+
* without re-parsing the TypeScript output.
|
|
7
|
+
*
|
|
8
|
+
* Sidecar shape (stable across patch versions):
|
|
9
|
+
*
|
|
10
|
+
* {
|
|
11
|
+
* "version": "<bdd2pw version>",
|
|
12
|
+
* "source": "<.feature path relative to repo>",
|
|
13
|
+
* "scenarios": [
|
|
14
|
+
* {
|
|
15
|
+
* "name": "Login with valid credentials",
|
|
16
|
+
* "tags": ["@positive"],
|
|
17
|
+
* "steps": [
|
|
18
|
+
* { "id": "0001", "keyword": "Given", "text": "...",
|
|
19
|
+
* "intent": "navigation", "locator": "page",
|
|
20
|
+
* "assertion": "goto" },
|
|
21
|
+
* ...
|
|
22
|
+
* ]
|
|
23
|
+
* }
|
|
24
|
+
* ]
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* `intent` is one of: navigation | interaction | assertion | api |
|
|
28
|
+
* compound | todo. Inferred from the binding shape (pomCall vs
|
|
29
|
+
* assertion vs customBody vs warning). When the binding carries
|
|
30
|
+
* `apiContext`, intent is `api` regardless of which sub-field is set.
|
|
31
|
+
*/
|
|
32
|
+
import type { StepBinding } from "../types";
|
|
33
|
+
export interface MetaSidecarStep {
|
|
34
|
+
id: string;
|
|
35
|
+
keyword: string;
|
|
36
|
+
text: string;
|
|
37
|
+
intent: "navigation" | "interaction" | "assertion" | "api" | "compound" | "todo";
|
|
38
|
+
/** Resolved locator string when the binding has one. */
|
|
39
|
+
locator?: string;
|
|
40
|
+
/** Matcher name or method name when the binding has one. */
|
|
41
|
+
assertion?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface MetaSidecarScenario {
|
|
44
|
+
name: string;
|
|
45
|
+
tags?: string[];
|
|
46
|
+
steps: MetaSidecarStep[];
|
|
47
|
+
}
|
|
48
|
+
export interface MetaSidecar {
|
|
49
|
+
version: string;
|
|
50
|
+
source: string;
|
|
51
|
+
scenarios: MetaSidecarScenario[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Convert a list of bindings (one scenario's worth) into the meta
|
|
55
|
+
* sidecar's `steps` array. IDs are zero-padded 4 digits, sequential
|
|
56
|
+
* in source order — same convention as the optional step boundary
|
|
57
|
+
* markers (v3.1.0 Issue 5), so post-processors can correlate the
|
|
58
|
+
* sidecar to the in-source markers when both features are enabled.
|
|
59
|
+
*/
|
|
60
|
+
export declare function bindingsToMetaSteps(bindings: StepBinding[]): MetaSidecarStep[];
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v3.2.0 — TestForge handoff Issue 10. Emit a `<spec-stem>.spec.meta.json`
|
|
4
|
+
* file alongside each generated `.spec.ts` describing every step's
|
|
5
|
+
* semantic intent. Lets downstream tooling (visual regression, defect
|
|
6
|
+
* analysis, self-healing pipelines) consume bdd2pw's understanding
|
|
7
|
+
* without re-parsing the TypeScript output.
|
|
8
|
+
*
|
|
9
|
+
* Sidecar shape (stable across patch versions):
|
|
10
|
+
*
|
|
11
|
+
* {
|
|
12
|
+
* "version": "<bdd2pw version>",
|
|
13
|
+
* "source": "<.feature path relative to repo>",
|
|
14
|
+
* "scenarios": [
|
|
15
|
+
* {
|
|
16
|
+
* "name": "Login with valid credentials",
|
|
17
|
+
* "tags": ["@positive"],
|
|
18
|
+
* "steps": [
|
|
19
|
+
* { "id": "0001", "keyword": "Given", "text": "...",
|
|
20
|
+
* "intent": "navigation", "locator": "page",
|
|
21
|
+
* "assertion": "goto" },
|
|
22
|
+
* ...
|
|
23
|
+
* ]
|
|
24
|
+
* }
|
|
25
|
+
* ]
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* `intent` is one of: navigation | interaction | assertion | api |
|
|
29
|
+
* compound | todo. Inferred from the binding shape (pomCall vs
|
|
30
|
+
* assertion vs customBody vs warning). When the binding carries
|
|
31
|
+
* `apiContext`, intent is `api` regardless of which sub-field is set.
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.bindingsToMetaSteps = bindingsToMetaSteps;
|
|
35
|
+
/**
|
|
36
|
+
* Classify a step binding's intent. Order of checks matters:
|
|
37
|
+
* 1. apiContext flag → "api" (overrides every other shape since API
|
|
38
|
+
* bindings often carry customBody + assertion together).
|
|
39
|
+
* 2. warning-only → "todo".
|
|
40
|
+
* 3. pomCall with method "goto" → "navigation".
|
|
41
|
+
* 4. pomCall otherwise → "interaction".
|
|
42
|
+
* 5. assertion → "assertion".
|
|
43
|
+
* 6. customBody → "compound".
|
|
44
|
+
* 7. fallback → "todo".
|
|
45
|
+
*/
|
|
46
|
+
function classifyIntent(b) {
|
|
47
|
+
if (b.apiContext)
|
|
48
|
+
return "api";
|
|
49
|
+
if (!b.pomCall && !b.assertion && !b.customBody && b.warning)
|
|
50
|
+
return "todo";
|
|
51
|
+
if (b.pomCall) {
|
|
52
|
+
return b.pomCall.method === "goto" ? "navigation" : "interaction";
|
|
53
|
+
}
|
|
54
|
+
if (b.assertion)
|
|
55
|
+
return "assertion";
|
|
56
|
+
if (b.customBody)
|
|
57
|
+
return "compound";
|
|
58
|
+
return "todo";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Convert a list of bindings (one scenario's worth) into the meta
|
|
62
|
+
* sidecar's `steps` array. IDs are zero-padded 4 digits, sequential
|
|
63
|
+
* in source order — same convention as the optional step boundary
|
|
64
|
+
* markers (v3.1.0 Issue 5), so post-processors can correlate the
|
|
65
|
+
* sidecar to the in-source markers when both features are enabled.
|
|
66
|
+
*/
|
|
67
|
+
function bindingsToMetaSteps(bindings) {
|
|
68
|
+
return bindings.map((b, idx) => {
|
|
69
|
+
const step = {
|
|
70
|
+
id: String(idx + 1).padStart(4, "0"),
|
|
71
|
+
keyword: b.step.keyword,
|
|
72
|
+
text: b.step.text,
|
|
73
|
+
intent: classifyIntent(b),
|
|
74
|
+
};
|
|
75
|
+
if (b.pomCall) {
|
|
76
|
+
step.locator = `${b.pomCall.page}.${b.pomCall.method}`;
|
|
77
|
+
step.assertion = b.pomCall.method;
|
|
78
|
+
}
|
|
79
|
+
else if (b.assertion) {
|
|
80
|
+
step.locator = b.assertion.locator;
|
|
81
|
+
step.assertion = b.assertion.matcher;
|
|
82
|
+
}
|
|
83
|
+
return step;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=metaSidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metaSidecar.js","sourceRoot":"","sources":["../../src/reports/metaSidecar.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;AAwDH,kDAmBC;AAhDD;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,CAAc;IACpC,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAC5E,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,QAAuB;IAEvB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAoB;YAC5B,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACpC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACjB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;SAC1B,CAAC;QACF,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3.2.0 — TestForge handoff Issue 7. Preserve user-edited blocks
|
|
3
|
+
* across regeneration.
|
|
4
|
+
*
|
|
5
|
+
* Two artefacts make this work:
|
|
6
|
+
*
|
|
7
|
+
* 1. **A generated-header marker.** Every spec emitted with `merge`
|
|
8
|
+
* enabled gets a leading
|
|
9
|
+
* `// bdd2pw:generated v=<version> source=<feature>` comment, so a
|
|
10
|
+
* future run can recognise its own output.
|
|
11
|
+
*
|
|
12
|
+
* 2. **User-block markers.** Anywhere in the spec, the user can wrap
|
|
13
|
+
* hand-edited code in:
|
|
14
|
+
*
|
|
15
|
+
* // bdd2pw:user-block id="custom-locator"
|
|
16
|
+
* await this.special = page.locator("[data-thing]");
|
|
17
|
+
* // bdd2pw:end-user-block
|
|
18
|
+
*
|
|
19
|
+
* During regeneration, blocks with the same `id` are spliced back
|
|
20
|
+
* into the new output. Blocks whose id is absent from the new
|
|
21
|
+
* output are appended at end of file under a clearly-labelled
|
|
22
|
+
* "stale user blocks" section so nothing is lost silently.
|
|
23
|
+
*
|
|
24
|
+
* The merge is conservative — it never touches the LINES INSIDE
|
|
25
|
+
* user blocks; everything else is fresh output.
|
|
26
|
+
*
|
|
27
|
+
* Why id-keyed splicing instead of line-based diff? Line numbers
|
|
28
|
+
* shift every time the input feature changes. Id-keyed markers
|
|
29
|
+
* survive arbitrary reordering and renaming.
|
|
30
|
+
*/
|
|
31
|
+
/** Detect whether a previously-emitted spec was produced with merge on. */
|
|
32
|
+
export declare function isMergeAnnotated(existing: string): boolean;
|
|
33
|
+
/** Extract every user-block in `existing`, keyed by id. */
|
|
34
|
+
export declare function extractUserBlocks(existing: string): Map<string, string>;
|
|
35
|
+
/**
|
|
36
|
+
* Splice preserved user blocks into a freshly-rendered spec.
|
|
37
|
+
*
|
|
38
|
+
* - `next` is the new bdd2pw output (no user blocks yet).
|
|
39
|
+
* - `preserved` is the id → block-text map extracted from the
|
|
40
|
+
* PREVIOUS spec via `extractUserBlocks`.
|
|
41
|
+
*
|
|
42
|
+
* For each preserved block: if `next` contains a placeholder line
|
|
43
|
+
* `// bdd2pw:user-block id="<id>"` ... `// bdd2pw:end-user-block`
|
|
44
|
+
* (which bdd2pw never emits by itself — see note below), replace it.
|
|
45
|
+
* Otherwise append the block under a "stale user blocks" footer so
|
|
46
|
+
* the user can salvage / delete it on their own.
|
|
47
|
+
*
|
|
48
|
+
* Note: bdd2pw doesn't insert empty user-block placeholders by
|
|
49
|
+
* default — users opt in by editing a generated spec and adding the
|
|
50
|
+
* markers themselves. So in practice the splice path here is
|
|
51
|
+
* usually the "append at end" branch, which is intentional — once
|
|
52
|
+
* a user edits a spec under merge, the markers they added live
|
|
53
|
+
* forever inside the spec until they remove them.
|
|
54
|
+
*/
|
|
55
|
+
export declare function mergeUserBlocks(next: string, preserved: Map<string, string>): string;
|
|
56
|
+
/**
|
|
57
|
+
* Prepend the generated header to a fresh spec so future merges can
|
|
58
|
+
* detect that the file is bdd2pw-managed.
|
|
59
|
+
*/
|
|
60
|
+
export declare function prependGeneratedHeader(contents: string, version: string, source: string): string;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v3.2.0 — TestForge handoff Issue 7. Preserve user-edited blocks
|
|
4
|
+
* across regeneration.
|
|
5
|
+
*
|
|
6
|
+
* Two artefacts make this work:
|
|
7
|
+
*
|
|
8
|
+
* 1. **A generated-header marker.** Every spec emitted with `merge`
|
|
9
|
+
* enabled gets a leading
|
|
10
|
+
* `// bdd2pw:generated v=<version> source=<feature>` comment, so a
|
|
11
|
+
* future run can recognise its own output.
|
|
12
|
+
*
|
|
13
|
+
* 2. **User-block markers.** Anywhere in the spec, the user can wrap
|
|
14
|
+
* hand-edited code in:
|
|
15
|
+
*
|
|
16
|
+
* // bdd2pw:user-block id="custom-locator"
|
|
17
|
+
* await this.special = page.locator("[data-thing]");
|
|
18
|
+
* // bdd2pw:end-user-block
|
|
19
|
+
*
|
|
20
|
+
* During regeneration, blocks with the same `id` are spliced back
|
|
21
|
+
* into the new output. Blocks whose id is absent from the new
|
|
22
|
+
* output are appended at end of file under a clearly-labelled
|
|
23
|
+
* "stale user blocks" section so nothing is lost silently.
|
|
24
|
+
*
|
|
25
|
+
* The merge is conservative — it never touches the LINES INSIDE
|
|
26
|
+
* user blocks; everything else is fresh output.
|
|
27
|
+
*
|
|
28
|
+
* Why id-keyed splicing instead of line-based diff? Line numbers
|
|
29
|
+
* shift every time the input feature changes. Id-keyed markers
|
|
30
|
+
* survive arbitrary reordering and renaming.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.isMergeAnnotated = isMergeAnnotated;
|
|
34
|
+
exports.extractUserBlocks = extractUserBlocks;
|
|
35
|
+
exports.mergeUserBlocks = mergeUserBlocks;
|
|
36
|
+
exports.prependGeneratedHeader = prependGeneratedHeader;
|
|
37
|
+
/** Match a user-block open marker plus capture its id and body. */
|
|
38
|
+
const USER_BLOCK_RE = /\/\/\s*bdd2pw:user-block\s+id\s*=\s*"([^"]+)"[ \t]*\r?\n([\s\S]*?)\/\/\s*bdd2pw:end-user-block/g;
|
|
39
|
+
/** Header comment we emit at the top of merge-enabled specs. */
|
|
40
|
+
function generatedHeader(version, source) {
|
|
41
|
+
return `// bdd2pw:generated v=${version} source=${source}`;
|
|
42
|
+
}
|
|
43
|
+
/** Detect whether a previously-emitted spec was produced with merge on. */
|
|
44
|
+
function isMergeAnnotated(existing) {
|
|
45
|
+
return /^\/\/\s*bdd2pw:generated\s/.test(existing.trimStart());
|
|
46
|
+
}
|
|
47
|
+
/** Extract every user-block in `existing`, keyed by id. */
|
|
48
|
+
function extractUserBlocks(existing) {
|
|
49
|
+
const out = new Map();
|
|
50
|
+
const re = new RegExp(USER_BLOCK_RE.source, "g");
|
|
51
|
+
let m;
|
|
52
|
+
while ((m = re.exec(existing)) !== null) {
|
|
53
|
+
const id = m[1];
|
|
54
|
+
const body = m[2];
|
|
55
|
+
// Stash the WHOLE block including markers so the splice keeps
|
|
56
|
+
// them in the output. (If we only captured `body`, a subsequent
|
|
57
|
+
// regen would lose the markers and the next regen wouldn't see
|
|
58
|
+
// the block.)
|
|
59
|
+
const full = m[0];
|
|
60
|
+
out.set(id, full);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Splice preserved user blocks into a freshly-rendered spec.
|
|
66
|
+
*
|
|
67
|
+
* - `next` is the new bdd2pw output (no user blocks yet).
|
|
68
|
+
* - `preserved` is the id → block-text map extracted from the
|
|
69
|
+
* PREVIOUS spec via `extractUserBlocks`.
|
|
70
|
+
*
|
|
71
|
+
* For each preserved block: if `next` contains a placeholder line
|
|
72
|
+
* `// bdd2pw:user-block id="<id>"` ... `// bdd2pw:end-user-block`
|
|
73
|
+
* (which bdd2pw never emits by itself — see note below), replace it.
|
|
74
|
+
* Otherwise append the block under a "stale user blocks" footer so
|
|
75
|
+
* the user can salvage / delete it on their own.
|
|
76
|
+
*
|
|
77
|
+
* Note: bdd2pw doesn't insert empty user-block placeholders by
|
|
78
|
+
* default — users opt in by editing a generated spec and adding the
|
|
79
|
+
* markers themselves. So in practice the splice path here is
|
|
80
|
+
* usually the "append at end" branch, which is intentional — once
|
|
81
|
+
* a user edits a spec under merge, the markers they added live
|
|
82
|
+
* forever inside the spec until they remove them.
|
|
83
|
+
*/
|
|
84
|
+
function mergeUserBlocks(next, preserved) {
|
|
85
|
+
if (preserved.size === 0)
|
|
86
|
+
return next;
|
|
87
|
+
// For each preserved id, replace any matching open/close marker in
|
|
88
|
+
// `next`, otherwise queue for append.
|
|
89
|
+
let merged = next;
|
|
90
|
+
const stale = [];
|
|
91
|
+
for (const [id, block] of preserved.entries()) {
|
|
92
|
+
const placeholder = new RegExp(`\\/\\/\\s*bdd2pw:user-block\\s+id\\s*=\\s*"${escapeForRegex(id)}"[ \\t]*\\r?\\n[\\s\\S]*?\\/\\/\\s*bdd2pw:end-user-block`, "g");
|
|
93
|
+
if (placeholder.test(merged)) {
|
|
94
|
+
merged = merged.replace(placeholder, block);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
stale.push({ id, block });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (stale.length === 0)
|
|
101
|
+
return merged;
|
|
102
|
+
const footer = [
|
|
103
|
+
"",
|
|
104
|
+
"// ── bdd2pw:stale-user-blocks ──────────────────────────────",
|
|
105
|
+
"// The following user-block sections existed in the previous",
|
|
106
|
+
"// generated spec but no matching id was found in the freshly-",
|
|
107
|
+
"// generated output. They're preserved here so you don't lose",
|
|
108
|
+
"// them. Move them inline (or delete them) and the next merge",
|
|
109
|
+
"// will pick up the change.",
|
|
110
|
+
...stale.map((s) => s.block),
|
|
111
|
+
"// ── bdd2pw:end-stale-user-blocks ──────────────────────────",
|
|
112
|
+
"",
|
|
113
|
+
].join("\n");
|
|
114
|
+
return merged + footer;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Prepend the generated header to a fresh spec so future merges can
|
|
118
|
+
* detect that the file is bdd2pw-managed.
|
|
119
|
+
*/
|
|
120
|
+
function prependGeneratedHeader(contents, version, source) {
|
|
121
|
+
const header = generatedHeader(version, source);
|
|
122
|
+
// Idempotent: if the contents already start with our header, don't
|
|
123
|
+
// duplicate it.
|
|
124
|
+
if (isMergeAnnotated(contents))
|
|
125
|
+
return contents;
|
|
126
|
+
return `${header}\n${contents}`;
|
|
127
|
+
}
|
|
128
|
+
function escapeForRegex(s) {
|
|
129
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=specMerge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specMerge.js","sourceRoot":"","sources":["../../src/reports/specMerge.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -219,6 +219,30 @@ export interface ScaffoldOptions {
|
|
|
219
219
|
*/
|
|
220
220
|
stepHooks?: boolean;
|
|
221
221
|
stepMarkers?: boolean;
|
|
222
|
+
/**
|
|
223
|
+
* v3.2.0 — TestForge handoff Issue 9. Pin emitted devDependency
|
|
224
|
+
* versions when set to `"exact"`. Default `"caret"` matches existing
|
|
225
|
+
* behavior (`^1.45.0` style ranges).
|
|
226
|
+
*/
|
|
227
|
+
dependencyStrategy?: "caret" | "exact";
|
|
228
|
+
/**
|
|
229
|
+
* v3.2.0 — TestForge handoff Issue 10. When true, scaffold() writes
|
|
230
|
+
* `<spec-stem>.spec.meta.json` alongside each emitted spec, describing
|
|
231
|
+
* every scenario's steps as { id, text, intent, locator, assertion }.
|
|
232
|
+
* Lets downstream tools (visual regression, defect analysis,
|
|
233
|
+
* self-healing) consume bdd2pw's semantic understanding of each step
|
|
234
|
+
* without re-parsing the TS output. Off by default.
|
|
235
|
+
*/
|
|
236
|
+
metaSidecar?: boolean;
|
|
237
|
+
/**
|
|
238
|
+
* v3.2.0 — TestForge handoff Issue 7. When true, scaffold() preserves
|
|
239
|
+
* `// bdd2pw:user-block id="..."` ... `// bdd2pw:end-user-block`
|
|
240
|
+
* sections from any existing target spec. Without merge: existing
|
|
241
|
+
* specs are overwritten unconditionally (existing behavior). With
|
|
242
|
+
* merge: user edits inside the named blocks survive regeneration.
|
|
243
|
+
* Useful for iterative locator refinement workflows.
|
|
244
|
+
*/
|
|
245
|
+
merge?: boolean;
|
|
222
246
|
}
|
|
223
247
|
export interface ScaffoldResult {
|
|
224
248
|
filesWritten: string[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vijaypjavvadi/bdd2pw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
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"
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@cucumber/gherkin": "^28.0.0",
|
|
61
61
|
"@cucumber/messages": "^24.1.0",
|
|
62
|
-
"@vijaypjavvadi/pw-emit": "^1.
|
|
62
|
+
"@vijaypjavvadi/pw-emit": "^1.3.0",
|
|
63
63
|
"archiver": "^7.0.1",
|
|
64
64
|
"chalk": "^4.1.2",
|
|
65
65
|
"commander": "^12.1.0",
|