tuffgal 0.2.0-alpha.3 → 0.2.0-alpha.4
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 +34 -20
- package/README.md +6 -6
- package/dist/cli.d.ts +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +12 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +6 -6
- package/dist/commands/supervise.d.ts +3 -3
- package/dist/commands/supervise.js +8 -4
- package/dist/commands/supervise.js.map +1 -1
- package/dist/config.d.ts +29 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -2
- package/dist/config.js.map +1 -1
- package/dist/coverage/screens.d.ts +10 -5
- package/dist/coverage/screens.d.ts.map +1 -1
- package/dist/coverage/screens.js +18 -8
- package/dist/coverage/screens.js.map +1 -1
- package/dist/reporter/assets/report.css +11 -11
- package/dist/reporter/assets/report.js +23 -23
- package/dist/reporter/template.js +48 -46
- package/dist/reporter/template.js.map +1 -1
- package/dist/runner/approve.d.ts +5 -5
- package/dist/runner/approve.js +5 -5
- package/dist/runner/approveFrom.d.ts +8 -8
- package/dist/runner/approveFrom.js +32 -31
- package/dist/runner/approveFrom.js.map +1 -1
- package/dist/runner/breakpointPasses.d.ts +16 -9
- package/dist/runner/breakpointPasses.d.ts.map +1 -1
- package/dist/runner/breakpointPasses.js +17 -9
- package/dist/runner/breakpointPasses.js.map +1 -1
- package/dist/runner/bridges/devServers.d.ts +10 -1
- package/dist/runner/bridges/devServers.d.ts.map +1 -1
- package/dist/runner/bridges/devServers.js +16 -8
- package/dist/runner/bridges/devServers.js.map +1 -1
- package/dist/runner/coverage.d.ts +3 -3
- package/dist/runner/coverage.js +5 -5
- package/dist/runner/coverage.js.map +1 -1
- package/dist/runner/exitCode.d.ts +7 -7
- package/dist/runner/exitCode.js +7 -7
- package/dist/runner/interpolate.js +1 -1
- package/dist/runner/interpolate.js.map +1 -1
- package/dist/runner/manifest.d.ts +16 -16
- package/dist/runner/manifest.js +12 -12
- package/dist/runner/mode.d.ts +2 -2
- package/dist/runner/mode.js +4 -4
- package/dist/runner/orphanScan.d.ts +3 -3
- package/dist/runner/orphanScan.js +5 -5
- package/dist/runner/orphanScan.js.map +1 -1
- package/dist/runner/resolveLocator.d.ts +5 -5
- package/dist/runner/resolveLocator.js +6 -6
- package/dist/runner/resolveLocator.js.map +1 -1
- package/dist/runner/run.d.ts +55 -18
- package/dist/runner/run.d.ts.map +1 -1
- package/dist/runner/run.js +118 -67
- package/dist/runner/run.js.map +1 -1
- package/dist/runner/runAction.d.ts +4 -4
- package/dist/runner/runAction.d.ts.map +1 -1
- package/dist/runner/runAction.js +72 -34
- package/dist/runner/runAction.js.map +1 -1
- package/dist/runner/runStory.d.ts +29 -18
- package/dist/runner/runStory.d.ts.map +1 -1
- package/dist/runner/runStory.js +38 -42
- package/dist/runner/runStory.js.map +1 -1
- package/dist/runner/scheduler.d.ts +11 -0
- package/dist/runner/scheduler.d.ts.map +1 -1
- package/dist/runner/scheduler.js +1 -1
- package/dist/runner/scheduler.js.map +1 -1
- package/dist/runner/steps/intercept.d.ts +6 -4
- package/dist/runner/steps/intercept.d.ts.map +1 -1
- package/dist/runner/steps/intercept.js.map +1 -1
- package/dist/runner/steps/navigate.d.ts +5 -2
- package/dist/runner/steps/navigate.d.ts.map +1 -1
- package/dist/runner/steps/navigate.js +17 -3
- package/dist/runner/steps/navigate.js.map +1 -1
- package/dist/runner/steps/read.d.ts +1 -1
- package/dist/runner/steps/read.js +1 -1
- package/dist/runner/steps/scroll.d.ts +1 -1
- package/dist/runner/steps/scroll.d.ts.map +1 -1
- package/dist/runner/steps/scroll.js +3 -2
- package/dist/runner/steps/scroll.js.map +1 -1
- package/dist/schema/action.d.ts +2 -2
- package/dist/schema/action.d.ts.map +1 -1
- package/dist/schema/action.js +58 -13
- package/dist/schema/action.js.map +1 -1
- package/dist/schema/load.js +1 -1
- package/dist/schema/load.js.map +1 -1
- package/dist/schema/result.d.ts +22 -22
- package/dist/schema/result.d.ts.map +1 -1
- package/dist/schema/result.js +1 -1
- package/dist/schema/story.d.ts +1 -1
- package/dist/schema/story.js +5 -5
- package/dist/screenshots/baselineStore.d.ts +44 -21
- package/dist/screenshots/baselineStore.d.ts.map +1 -1
- package/dist/screenshots/baselineStore.js +59 -28
- package/dist/screenshots/baselineStore.js.map +1 -1
- package/dist/screenshots/capture.d.ts +35 -4
- package/dist/screenshots/capture.d.ts.map +1 -1
- package/dist/screenshots/capture.js +61 -9
- package/dist/screenshots/capture.js.map +1 -1
- package/dist/screenshots/diff.d.ts +57 -8
- package/dist/screenshots/diff.d.ts.map +1 -1
- package/dist/screenshots/diff.js +78 -28
- package/dist/screenshots/diff.js.map +1 -1
- package/dist/util.d.ts +23 -2
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +42 -2
- package/dist/util.js.map +1 -1
- package/package.json +4 -8
package/dist/runner/runAction.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { capturePage } from "../screenshots/capture.js";
|
|
2
|
-
import {
|
|
3
|
-
import { deleteIfExists, pathsFor, readBaseline, readJsonBaseline, withBaselineLock,
|
|
2
|
+
import { renderDiffOverlay, scoreDiff, ScreenshotSizeMismatchError, } from "../screenshots/diff.js";
|
|
3
|
+
import { deleteIfExists, pathsFor, readBaseline, readJsonBaseline, withBaselineLock, writeDurablePng, writeText, writeTransientPng, } from "../screenshots/baselineStore.js";
|
|
4
4
|
import { sleep } from "../util.js";
|
|
5
5
|
import { comparisonRootFor } from "./mode.js";
|
|
6
6
|
import { interpolate, interpolateHint } from "./interpolate.js";
|
|
@@ -32,7 +32,7 @@ export async function runAction(options) {
|
|
|
32
32
|
// so a story can key test-created data per mode (e.g. registering
|
|
33
33
|
// `fresh+${breakpoint}@example.test` at each viewport instead of colliding on
|
|
34
34
|
// a shared email). It is injected only into the interpolation map, never the
|
|
35
|
-
// validated `parameters
|
|
35
|
+
// validated `parameters`, `validateParameters` rejects undeclared keys, and
|
|
36
36
|
// the ActionResult must still report the author's parameters verbatim. A
|
|
37
37
|
// story parameter literally named `breakpoint` overrides the injected value.
|
|
38
38
|
const interpolationParameters = {
|
|
@@ -85,7 +85,7 @@ async function dispatchWithRetry(page, step, parameters, config, attempts, backo
|
|
|
85
85
|
}
|
|
86
86
|
catch (error) {
|
|
87
87
|
lastError = error;
|
|
88
|
-
if (!(error
|
|
88
|
+
if (!isRetryable(error) || attempt === attempts) {
|
|
89
89
|
throw error;
|
|
90
90
|
}
|
|
91
91
|
await sleep(backoffMs * attempt);
|
|
@@ -93,6 +93,26 @@ async function dispatchWithRetry(page, step, parameters, config, attempts, backo
|
|
|
93
93
|
}
|
|
94
94
|
throw lastError;
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Only transient faults are retried; real infrastructure errors rethrow
|
|
98
|
+
* immediately so a genuine fault is not masked by burning the retry budget:
|
|
99
|
+
* - `LocatorNotFoundError`: the UI has not hydrated the target element yet.
|
|
100
|
+
* - any bounded Playwright `TimeoutError`: every step whose dispatch is
|
|
101
|
+
* bounded by a Playwright timeout qualifies, not just navigation: a
|
|
102
|
+
* `page.goto` that did not reach its ready signal, AND the step-level
|
|
103
|
+
* click/input/waitFor timeouts (a slow first paint, a lagging dev server, a
|
|
104
|
+
* control still rendering), each of which a re-drive routinely clears.
|
|
105
|
+
* Classified by `name` so it holds for any Playwright timeout whether it
|
|
106
|
+
* arrives as `errors.TimeoutError` or is reconstructed across an async
|
|
107
|
+
* boundary.
|
|
108
|
+
* Anything else (connection refused, protocol error, an origin-escape throw)
|
|
109
|
+
* is a NON-retryable fault and rethrows on the first occurrence.
|
|
110
|
+
*/
|
|
111
|
+
function isRetryable(error) {
|
|
112
|
+
if (error instanceof LocatorNotFoundError)
|
|
113
|
+
return true;
|
|
114
|
+
return error instanceof Error && error.name === 'TimeoutError';
|
|
115
|
+
}
|
|
96
116
|
async function dispatch(page, step, parameters, config) {
|
|
97
117
|
switch (step.kind) {
|
|
98
118
|
case 'navigate':
|
|
@@ -118,7 +138,7 @@ async function dispatch(page, step, parameters, config) {
|
|
|
118
138
|
/**
|
|
119
139
|
* Polls every hint in `expect.anyOf` concurrently and resolves as soon as one
|
|
120
140
|
* becomes visible. Throws when none resolve within the configured timeout.
|
|
121
|
-
* Race semantics: any single match satisfies the expectation
|
|
141
|
+
* Race semantics: any single match satisfies the expectation. This is what
|
|
122
142
|
* lets a single action declare "success looks like list-item OR toast OR
|
|
123
143
|
* status banner" without the story knowing which renderer the app picked.
|
|
124
144
|
*/
|
|
@@ -147,7 +167,7 @@ async function captureAndCompare(options) {
|
|
|
147
167
|
// The comparison target moves with the mode (see `comparisonRootFor`, the
|
|
148
168
|
// single owner of the mode→root mapping). CI compares against (and, on
|
|
149
169
|
// approval, promotes into) the committed `paths.baselines`; local mode
|
|
150
|
-
// self-diffs against
|
|
170
|
+
// self-diffs against (and auto-seeds) the per-machine, gitignored
|
|
151
171
|
// `paths.localCache`, never reading or writing `paths.baselines`. Report-side
|
|
152
172
|
// artifacts (actual, diff, candidate) stay report-rooted regardless; only the
|
|
153
173
|
// baseline/legacy side follows `comparisonRoot`. Legacy `<action>/0.png`
|
|
@@ -164,8 +184,13 @@ async function captureAndCompare(options) {
|
|
|
164
184
|
breakpoint,
|
|
165
185
|
});
|
|
166
186
|
const masks = resolveMasks(page, action.mask, interpolationParameters);
|
|
167
|
-
const actualPng = await capturePage(page, masks, config.captureMode
|
|
168
|
-
|
|
187
|
+
const actualPng = await capturePage(page, masks, config.captureMode, {
|
|
188
|
+
maxPixels: config.maxFullPagePixels,
|
|
189
|
+
label: `story "${storyFile}" action "${action.action}" (${breakpoint})`,
|
|
190
|
+
});
|
|
191
|
+
// The run's `actual` is a transient report artifact (overwritten next run,
|
|
192
|
+
// never re-read as a comparison target), so it skips the max-effort recompress.
|
|
193
|
+
await writeTransientPng(paths.actual, actualPng);
|
|
169
194
|
const a11yJson = await captureA11yTree(page);
|
|
170
195
|
await writeText(paths.a11yActual, a11yJson);
|
|
171
196
|
const baseResult = baseResultFor(action.action, parameters, breakpoint, startedAt);
|
|
@@ -174,17 +199,17 @@ async function captureAndCompare(options) {
|
|
|
174
199
|
// The first holder decides; later holders observe the baseline it produced.
|
|
175
200
|
//
|
|
176
201
|
// Read order under the lock:
|
|
177
|
-
// 1. breakpoint-keyed baseline (`<action>/<bp>.png`)
|
|
202
|
+
// 1. breakpoint-keyed baseline (`<action>/<bp>.png`): the canonical
|
|
178
203
|
// location once a project has migrated to named breakpoints;
|
|
179
|
-
// 2. legacy baseline (`<action>/0.png`)
|
|
204
|
+
// 2. legacy baseline (`<action>/0.png`): a project baselined before this
|
|
180
205
|
// feature has only this file. We compare against it (so it still gates
|
|
181
206
|
// pass/changed) but deliberately do NOT copy it forward to the
|
|
182
207
|
// breakpoint location: a real baseline already lives at the legacy path,
|
|
183
208
|
// and promotion to the new layout is `tuffgal approve`'s job, not a
|
|
184
209
|
// silent side effect of a read. Auto-creating here would also clobber
|
|
185
210
|
// the legacy file's role as the shared fallback for every breakpoint.
|
|
186
|
-
// 3. neither
|
|
187
|
-
// - `local`: auto-seed the per-machine cache
|
|
211
|
+
// 3. neither, the missing-baseline branch, and it splits on mode:
|
|
212
|
+
// - `local`: auto-seed the per-machine cache, write a fresh
|
|
188
213
|
// breakpoint baseline under the lock (rooted at `comparisonRoot`,
|
|
189
214
|
// i.e. `paths.localCache`) and report `new`. Zero-ceremony first run.
|
|
190
215
|
// `paths.baselines` is never touched.
|
|
@@ -203,7 +228,9 @@ async function captureAndCompare(options) {
|
|
|
203
228
|
return { png: legacy, source: 'legacy' };
|
|
204
229
|
}
|
|
205
230
|
if (mode === 'local') {
|
|
206
|
-
|
|
231
|
+
// A local-cache baseline is durable (re-read on every later run), so
|
|
232
|
+
// it earns the lossless recompress.
|
|
233
|
+
await writeDurablePng(paths.baseline, actualPng);
|
|
207
234
|
await writeText(paths.a11yBaseline, a11yJson);
|
|
208
235
|
}
|
|
209
236
|
return undefined;
|
|
@@ -224,7 +251,7 @@ async function captureAndCompare(options) {
|
|
|
224
251
|
}
|
|
225
252
|
const baselinePng = found.png;
|
|
226
253
|
// When the comparison ran against the legacy baseline, its a11y companion
|
|
227
|
-
// lives at the legacy a11y path too
|
|
254
|
+
// lives at the legacy a11y path too. Read that one so the a11yChanged
|
|
228
255
|
// signal reflects the baseline we actually diffed against.
|
|
229
256
|
const a11yBaselinePathForRead = found.source === 'legacy' ? paths.legacyA11yBaseline : paths.a11yBaseline;
|
|
230
257
|
const baselineA11y = await readJsonBaseline(a11yBaselinePathForRead);
|
|
@@ -232,20 +259,26 @@ async function captureAndCompare(options) {
|
|
|
232
259
|
try {
|
|
233
260
|
const pixelThreshold = action.diff?.pixelThreshold ?? 0.1;
|
|
234
261
|
const ssimThreshold = action.diff?.ssimThreshold ?? 0.99;
|
|
235
|
-
|
|
236
|
-
|
|
262
|
+
// Score first (SSIM plus the reported pixel metrics) without encoding
|
|
263
|
+
// the overlay. The red-highlight diff image is expensive to encode and is
|
|
264
|
+
// discarded on a pass, so it is rendered only on the changed branch below.
|
|
265
|
+
// One decode of the pair serves both the score and (on the changed branch
|
|
266
|
+
// below) the overlay render. `decoded` is threaded into renderDiffOverlay
|
|
267
|
+
// so the failing path reads the image pair once, not twice.
|
|
268
|
+
const { score, decoded } = scoreDiff(baselinePng, actualPng, pixelThreshold);
|
|
269
|
+
const passesSsim = score.ssimScore >= ssimThreshold;
|
|
237
270
|
if (passesSsim) {
|
|
238
271
|
await deleteIfExists(paths.diff);
|
|
239
272
|
// A11y-only drift: pixels match but the committed aria snapshot has moved.
|
|
240
273
|
// In CI mode this must surface as `changed` with a candidate pair, not a
|
|
241
|
-
// silent `pass
|
|
274
|
+
// silent `pass`. Under the sole-writer model a `pass` writes no candidate,
|
|
242
275
|
// so a drifted committed `a11y.yaml` would be permanently unre-approvable
|
|
243
276
|
// (`approve --from` has nothing to promote). The pixel-drift path below is
|
|
244
277
|
// mutually exclusive with this branch, so exactly one candidate pair is
|
|
245
|
-
// ever written per action. Local mode keeps the advisory behaviour
|
|
278
|
+
// ever written per action. Local mode keeps the advisory behaviour. The
|
|
246
279
|
// cache is auto-managed, there is no human-approval step, so the flag stays
|
|
247
280
|
// informational and no candidate is proposed. There is no pixel diff here
|
|
248
|
-
// (pixels passed), so `diffPath` is omitted
|
|
281
|
+
// (pixels passed), so `diffPath` is omitted. That, alongside
|
|
249
282
|
// `a11yChanged`, is what marks a11y-only drift apart from pixel drift
|
|
250
283
|
// downstream.
|
|
251
284
|
const a11yDriftInCi = mode === 'ci' && a11yChanged;
|
|
@@ -256,16 +289,21 @@ async function captureAndCompare(options) {
|
|
|
256
289
|
status: a11yDriftInCi ? 'changed' : 'pass',
|
|
257
290
|
baselinePath: paths.baseline,
|
|
258
291
|
actualPath: paths.actual,
|
|
259
|
-
diffPixels:
|
|
260
|
-
diffRatio:
|
|
261
|
-
ssimScore:
|
|
292
|
+
diffPixels: score.diffPixels,
|
|
293
|
+
diffRatio: score.diffRatio,
|
|
294
|
+
ssimScore: score.ssimScore,
|
|
262
295
|
a11yChanged: a11yChanged || undefined,
|
|
263
296
|
a11yBaselinePath: a11yBaselinePathForRead,
|
|
264
297
|
a11yActualPath: paths.a11yActual,
|
|
265
298
|
});
|
|
266
299
|
}
|
|
267
|
-
|
|
268
|
-
//
|
|
300
|
+
// Changed → the human needs the red-highlight overlay. This is the only
|
|
301
|
+
// branch that pays the pixelmatch-fill + PNG encode cost; it reuses the
|
|
302
|
+
// decode from scoreDiff above. The overlay is a transient report artifact
|
|
303
|
+
// (deleted the moment a later run passes), so it skips the recompress pass.
|
|
304
|
+
// It is already deflate-encoded by renderDiffOverlay.
|
|
305
|
+
await writeTransientPng(paths.diff, renderDiffOverlay(decoded, pixelThreshold));
|
|
306
|
+
// A `changed` action in CI mode proposes a new baseline. Emit it to the
|
|
269
307
|
// candidate tree so approval is a plain tree copy. Local mode does not
|
|
270
308
|
// (its comparison target is the auto-managed cache, not a human-approved
|
|
271
309
|
// set); `writeCandidate` no-ops there.
|
|
@@ -275,9 +313,9 @@ async function captureAndCompare(options) {
|
|
|
275
313
|
baselinePath: paths.baseline,
|
|
276
314
|
actualPath: paths.actual,
|
|
277
315
|
diffPath: paths.diff,
|
|
278
|
-
diffPixels:
|
|
279
|
-
diffRatio:
|
|
280
|
-
ssimScore:
|
|
316
|
+
diffPixels: score.diffPixels,
|
|
317
|
+
diffRatio: score.diffRatio,
|
|
318
|
+
ssimScore: score.ssimScore,
|
|
281
319
|
a11yChanged: a11yChanged || undefined,
|
|
282
320
|
a11yBaselinePath: a11yBaselinePathForRead,
|
|
283
321
|
a11yActualPath: paths.a11yActual,
|
|
@@ -285,14 +323,14 @@ async function captureAndCompare(options) {
|
|
|
285
323
|
}
|
|
286
324
|
catch (error) {
|
|
287
325
|
if (error instanceof ScreenshotSizeMismatchError) {
|
|
288
|
-
// Dimension drift is still a `changed` outcome
|
|
326
|
+
// Dimension drift is still a `changed` outcome, same candidate emission
|
|
289
327
|
// (CI only; `writeCandidate` no-ops in local mode).
|
|
290
328
|
await writeCandidate(mode, paths, actualPng, a11yJson);
|
|
291
329
|
// CONTRACT: this branch must NEVER emit `a11yChanged`. The a11y-only-drift
|
|
292
330
|
// discriminator downstream is `a11yChanged === true`, and this pixel-drift
|
|
293
331
|
// (size-mismatch) result already carries no `diffPath`. Were it to also set
|
|
294
332
|
// `a11yChanged`, a consumer that (incorrectly) inferred a11y-only drift from
|
|
295
|
-
// `!diffPath` would misclassify it
|
|
333
|
+
// `!diffPath` would misclassify it, but the positive `a11yChanged` gate,
|
|
296
334
|
// which this branch deliberately leaves unset, keeps the two apart. The
|
|
297
335
|
// locking test `never carries a11yChanged` guards this omission against a
|
|
298
336
|
// future "cleanup" that would add it. See the `a11yChanged` doc in
|
|
@@ -316,20 +354,20 @@ async function captureAndCompare(options) {
|
|
|
316
354
|
* Emits the proposed-new-baseline render (PNG + a11y companion) to the
|
|
317
355
|
* report-rooted candidate tree (`<report>/candidates/<action>/<breakpoint>.*`).
|
|
318
356
|
* The layout mirrors `paths.baselines` exactly, so approving a candidate set is
|
|
319
|
-
* a plain tree copy.
|
|
320
|
-
*
|
|
321
|
-
*
|
|
357
|
+
* a plain tree copy. A candidate is a proposed durable baseline, so it is
|
|
358
|
+
* routed through the durable `writeDurablePng`/`writeText` seams and inherits
|
|
359
|
+
* the lossless recompress pass. The promoted baseline is dense from the start.
|
|
322
360
|
*
|
|
323
361
|
* The candidate tree is a CI-only artifact: local mode self-diffs against the
|
|
324
362
|
* per-machine cache and has no human-approval step, so it never proposes
|
|
325
|
-
* candidates. The mode guard lives here
|
|
363
|
+
* candidates. The mode guard lives here (a single early-return) rather than
|
|
326
364
|
* being repeated at each of the four call sites (`new`, pixel-`changed`,
|
|
327
365
|
* size-mismatch, and CI a11y-only drift).
|
|
328
366
|
*/
|
|
329
367
|
async function writeCandidate(mode, paths, actualPng, a11yJson) {
|
|
330
368
|
if (mode !== 'ci')
|
|
331
369
|
return;
|
|
332
|
-
await
|
|
370
|
+
await writeDurablePng(paths.candidate, actualPng);
|
|
333
371
|
await writeText(paths.a11yCandidate, a11yJson);
|
|
334
372
|
}
|
|
335
373
|
function resolveMasks(page, maskHints, parameters) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAction.js","sourceRoot":"","sources":["../../src/runner/runAction.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runAction.js","sourceRoot":"","sources":["../../src/runner/runAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,18 @@ export interface RunStoryOptions {
|
|
|
9
9
|
story: Story;
|
|
10
10
|
file: string;
|
|
11
11
|
needs: string[];
|
|
12
|
+
/**
|
|
13
|
+
* The needs used to resolve on-disk auth state, distinct from the
|
|
14
|
+
* scheduler-facing `needs` which a breakpoint pass strips to its in-pass
|
|
15
|
+
* subset (see {@link adaptNeedsForPass}). Retains the story's ORIGINAL needs
|
|
16
|
+
* so a consumer whose producer rendered in a different pass still loads that
|
|
17
|
+
* producer's persisted auth. Otherwise the consumer renders logged-out.
|
|
18
|
+
* Omitted by direct callers/tests, where it falls back to `needs`.
|
|
19
|
+
*/
|
|
20
|
+
authNeeds?: string[];
|
|
12
21
|
produces: string[];
|
|
13
22
|
actions: Map<string, Action>;
|
|
14
23
|
config: ResolvedConfig;
|
|
15
|
-
headed: boolean;
|
|
16
24
|
coverage?: CoverageCollector;
|
|
17
25
|
/**
|
|
18
26
|
* Render only this breakpoint. The run driver passes one breakpoint per
|
|
@@ -30,33 +38,36 @@ export interface RunStoryOptions {
|
|
|
30
38
|
mode?: RunMode;
|
|
31
39
|
}
|
|
32
40
|
/**
|
|
33
|
-
* Drives
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
41
|
+
* Drives every selected breakpoint of one story against the run's shared,
|
|
42
|
+
* already-launched browser. The run driver (`runAll`) launches ONE browser for
|
|
43
|
+
* the whole run and closes it once at the end, so this function never owns
|
|
44
|
+
* browser lifecycle. It only opens a fresh `browser.newContext()` per
|
|
45
|
+
* breakpoint. That per-breakpoint context is the isolation boundary: cookies,
|
|
46
|
+
* storage, and cache live on the context, not the browser, so stories sharing a
|
|
47
|
+
* browser never leak state into one another. Wraps each context in Playwright
|
|
48
|
+
* tracing so a failed action leaves behind a full-fidelity `trace.zip` for
|
|
49
|
+
* post-mortem in the Playwright trace viewer. If the story declares `produces`
|
|
50
|
+
* labels, the post-run storage state is persisted under
|
|
51
|
+
* `<authState>/<label>.json` so consumer stories can attach to it without
|
|
52
|
+
* replaying the producer's actions.
|
|
53
|
+
*
|
|
54
|
+
* Taking the browser as a parameter also lets tests exercise the per-breakpoint
|
|
55
|
+
* loop (context isolation, the failed-action-does-not-abort-others guarantee,
|
|
56
|
+
* trace-zip uniqueness, `produces` persistence, and the throw-closes-context
|
|
57
|
+
* invariant) against fake Browser/BrowserContext/Page objects without
|
|
58
|
+
* launching a real Chromium.
|
|
48
59
|
*/
|
|
49
60
|
export declare function runStoryWithBrowser(browser: Browser, options: RunStoryOptions, startedAt: Date): Promise<StoryResult>;
|
|
50
61
|
/**
|
|
51
62
|
* Picks the breakpoint(s) this story runs at:
|
|
52
63
|
*
|
|
53
|
-
* - `story.breakpoints` set
|
|
64
|
+
* - `story.breakpoints` set: run exactly those, REPLACING the project's
|
|
54
65
|
* `config.breakpoints` (not intersected). The story's list stands alone:
|
|
55
66
|
* it may name a mode the project does not, each selector resolved against
|
|
56
67
|
* the registry, order preserved, duplicate names dropped (first wins). The
|
|
57
68
|
* schema guarantees a non-empty list when the field is present.
|
|
58
69
|
*
|
|
59
|
-
* - omitted
|
|
70
|
+
* - omitted: run the project's `config.breakpoints`, in order (the default).
|
|
60
71
|
*/
|
|
61
72
|
export declare function resolveRunSet(story: Story, config: ResolvedConfig): ResolvedBreakpoint[];
|
|
62
73
|
export declare function mergeStoryStatus(current: StoryStatus, next: StoryStatus): StoryStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runStory.d.ts","sourceRoot":"","sources":["../../src/runner/runStory.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"runStory.d.ts","sourceRoot":"","sources":["../../src/runner/runStory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,YAAY,CAAC;AAC1E,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAEV,WAAW,EACX,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,IAAI,GACd,OAAO,CAAC,WAAW,CAAC,CAoItB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,cAAc,GACrB,kBAAkB,EAAE,CAKtB;AAeD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,WAAW,GAChB,WAAW,CAEb"}
|
package/dist/runner/runStory.js
CHANGED
|
@@ -1,43 +1,39 @@
|
|
|
1
1
|
import { access, mkdir } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import {} from 'playwright';
|
|
4
4
|
import { resolveSelectorList, } from "../config.js";
|
|
5
5
|
import { applyFixture } from "./bridges/database.js";
|
|
6
6
|
import { runAction } from "./runAction.js";
|
|
7
7
|
const TRACE_SUBDIR = 'traces';
|
|
8
8
|
/**
|
|
9
|
-
* Drives
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Drives every selected breakpoint of one story against an already-launched
|
|
30
|
-
* browser. Split out from `runStory` (which owns browser lifecycle + fixtures)
|
|
31
|
-
* so tests can exercise the per-breakpoint loop — context isolation, the
|
|
32
|
-
* failed-action-does-not-abort-others guarantee, trace-zip uniqueness, `produces`
|
|
33
|
-
* persistence, and the throw-closes-context invariant — against fake
|
|
34
|
-
* Browser/BrowserContext/Page objects without launching a real Chromium.
|
|
9
|
+
* Drives every selected breakpoint of one story against the run's shared,
|
|
10
|
+
* already-launched browser. The run driver (`runAll`) launches ONE browser for
|
|
11
|
+
* the whole run and closes it once at the end, so this function never owns
|
|
12
|
+
* browser lifecycle. It only opens a fresh `browser.newContext()` per
|
|
13
|
+
* breakpoint. That per-breakpoint context is the isolation boundary: cookies,
|
|
14
|
+
* storage, and cache live on the context, not the browser, so stories sharing a
|
|
15
|
+
* browser never leak state into one another. Wraps each context in Playwright
|
|
16
|
+
* tracing so a failed action leaves behind a full-fidelity `trace.zip` for
|
|
17
|
+
* post-mortem in the Playwright trace viewer. If the story declares `produces`
|
|
18
|
+
* labels, the post-run storage state is persisted under
|
|
19
|
+
* `<authState>/<label>.json` so consumer stories can attach to it without
|
|
20
|
+
* replaying the producer's actions.
|
|
21
|
+
*
|
|
22
|
+
* Taking the browser as a parameter also lets tests exercise the per-breakpoint
|
|
23
|
+
* loop (context isolation, the failed-action-does-not-abort-others guarantee,
|
|
24
|
+
* trace-zip uniqueness, `produces` persistence, and the throw-closes-context
|
|
25
|
+
* invariant) against fake Browser/BrowserContext/Page objects without
|
|
26
|
+
* launching a real Chromium.
|
|
35
27
|
*/
|
|
36
28
|
export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
37
|
-
const { story, file, needs, produces, config, coverage } = options;
|
|
29
|
+
const { story, file, needs, authNeeds, produces, config, coverage } = options;
|
|
38
30
|
// Resolve the storage state once: it is viewport-independent, so every
|
|
39
|
-
// breakpoint context loads the same
|
|
40
|
-
|
|
31
|
+
// breakpoint context loads the same auth payload. Uses `authNeeds` (the
|
|
32
|
+
// story's ORIGINAL needs) rather than the scheduler-facing `needs`, which a
|
|
33
|
+
// breakpoint pass strips to its in-pass subset. A consumer whose producer
|
|
34
|
+
// rendered in a different pass must still load that producer's off-disk auth.
|
|
35
|
+
// Falls back to `needs` for direct callers/tests that omit `authNeeds`.
|
|
36
|
+
const storageStatePath = await resolveStorageStateForNeeds(config, authNeeds ?? needs);
|
|
41
37
|
// The run driver hands us a single breakpoint per call so each breakpoint is
|
|
42
38
|
// its own reset/seed pass (the database-isolation guarantee). Direct
|
|
43
39
|
// callers/tests that omit it fall back to the story's full run set, which
|
|
@@ -50,7 +46,7 @@ export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
|
50
46
|
// failed if any breakpoint had a failed/skipped action, else changed if any
|
|
51
47
|
// breakpoint drifted or introduced a new baseline, else pass.
|
|
52
48
|
let storyStatus = 'pass';
|
|
53
|
-
// `produces` writes the post-run storage state exactly once
|
|
49
|
+
// `produces` writes the post-run storage state exactly once, from the first
|
|
54
50
|
// breakpoint whose action sequence did not fail. Persisting per breakpoint
|
|
55
51
|
// would redundantly rewrite (and risk clobbering) the same `<label>.json`
|
|
56
52
|
// with state that is identical for auth purposes; one good run is enough.
|
|
@@ -62,15 +58,15 @@ export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
|
62
58
|
let firstTracePath;
|
|
63
59
|
for (const breakpoint of runSet) {
|
|
64
60
|
// Apply the story's own fixtures before the breakpoint context launches.
|
|
65
|
-
// The deeper cross-breakpoint isolation
|
|
61
|
+
// The deeper cross-breakpoint isolation, a destructive story (change
|
|
66
62
|
// password, empty read history) mutating globally-seeded rows it does not
|
|
67
|
-
// own a fixture for
|
|
63
|
+
// own a fixture for, is handled one level up: the run driver executes each
|
|
68
64
|
// breakpoint as a separate pass behind a full `database.reset()`, so this
|
|
69
65
|
// call only owns the story-local seed. Fixtures stay idempotent (each
|
|
70
66
|
// deletes its own rows before re-inserting), so a non-mutating story pays
|
|
71
67
|
// just a cheap re-apply. When this loop runs multiple breakpoints itself
|
|
72
68
|
// (a direct caller that passed no single `breakpoint`), the fixture re-apply
|
|
73
|
-
// is the only reset between them
|
|
69
|
+
// is the only reset between them. That path does not get the per-pass DB
|
|
74
70
|
// reset, so destructive multi-breakpoint stories must run through the driver.
|
|
75
71
|
for (const fixture of story.fixtures ?? []) {
|
|
76
72
|
await applyFixture(config, fixture);
|
|
@@ -84,13 +80,13 @@ export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
|
84
80
|
});
|
|
85
81
|
// The whole per-breakpoint lifecycle runs under try/finally so the context
|
|
86
82
|
// is ALWAYS closed, even when something inside throws. Throw policy: an
|
|
87
|
-
// *action* failing is a normal visual-regression outcome
|
|
83
|
+
// *action* failing is a normal visual-regression outcome. It returns a
|
|
88
84
|
// `failed` ActionResult, the loop records it, and the remaining breakpoints
|
|
89
85
|
// still run (the documented "one breakpoint failing does not abort the
|
|
90
86
|
// others" guarantee). A *thrown* exception here is different: it means the
|
|
91
87
|
// harness itself faulted (tracing/coverage threw, the page crashed, an
|
|
92
88
|
// unexpected error escaped `runActionsForBreakpoint`). That is not a diff to
|
|
93
|
-
// report
|
|
89
|
+
// report. It is an infra fault, so we let it propagate and abort the whole
|
|
94
90
|
// story. The `finally` guarantees we still close this context first, so a
|
|
95
91
|
// throw can never leak the in-flight BrowserContext (the bug this guards).
|
|
96
92
|
try {
|
|
@@ -117,8 +113,8 @@ export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
|
117
113
|
firstTracePath = tracePath;
|
|
118
114
|
}
|
|
119
115
|
// Persist once, from the first breakpoint that ran clean. A failure in
|
|
120
|
-
// this breakpoint does not abort the loop
|
|
121
|
-
// still run so the report shows every mode
|
|
116
|
+
// this breakpoint does not abort the loop (the remaining breakpoints
|
|
117
|
+
// still run so the report shows every mode) but it cannot supply the
|
|
122
118
|
// auth state.
|
|
123
119
|
if (!producedPersisted &&
|
|
124
120
|
breakpointRun.status !== 'failed' &&
|
|
@@ -146,13 +142,13 @@ export async function runStoryWithBrowser(browser, options, startedAt) {
|
|
|
146
142
|
/**
|
|
147
143
|
* Picks the breakpoint(s) this story runs at:
|
|
148
144
|
*
|
|
149
|
-
* - `story.breakpoints` set
|
|
145
|
+
* - `story.breakpoints` set: run exactly those, REPLACING the project's
|
|
150
146
|
* `config.breakpoints` (not intersected). The story's list stands alone:
|
|
151
147
|
* it may name a mode the project does not, each selector resolved against
|
|
152
148
|
* the registry, order preserved, duplicate names dropped (first wins). The
|
|
153
149
|
* schema guarantees a non-empty list when the field is present.
|
|
154
150
|
*
|
|
155
|
-
* - omitted
|
|
151
|
+
* - omitted: run the project's `config.breakpoints`, in order (the default).
|
|
156
152
|
*/
|
|
157
153
|
export function resolveRunSet(story, config) {
|
|
158
154
|
if (story.breakpoints && story.breakpoints.length > 0) {
|
|
@@ -179,7 +175,7 @@ export function mergeStoryStatus(current, next) {
|
|
|
179
175
|
* Runs every action of the story once, in order, against a single breakpoint's
|
|
180
176
|
* page. Preserves the existing within-breakpoint fail-fast: once an action
|
|
181
177
|
* fails (or names an unknown action), the remaining actions of THIS breakpoint
|
|
182
|
-
* are skipped
|
|
178
|
+
* are skipped. We never screenshot state that follows a broken step. The
|
|
183
179
|
* returned status is scoped to this breakpoint; the caller merges it into the
|
|
184
180
|
* story-wide status across all breakpoints.
|
|
185
181
|
*/
|
|
@@ -256,7 +252,7 @@ async function resolveStorageStateForNeeds(config, needs) {
|
|
|
256
252
|
catch {
|
|
257
253
|
// Producer ran but did not emit a storage state file. That is fine
|
|
258
254
|
// when the label only carries an ordering constraint, not an auth
|
|
259
|
-
// payload
|
|
255
|
+
// payload. Fall through to the next label.
|
|
260
256
|
}
|
|
261
257
|
}
|
|
262
258
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runStory.js","sourceRoot":"","sources":["../../src/runner/runStory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"runStory.js","sourceRoot":"","sources":["../../src/runner/runStory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,17 @@ import type { StoryResult } from '../schema/result.ts';
|
|
|
3
3
|
export interface ScheduledStory extends StoryFile {
|
|
4
4
|
needs: string[];
|
|
5
5
|
produces: string[];
|
|
6
|
+
/**
|
|
7
|
+
* The story's ORIGINAL needs, retained for AUTH resolution across a
|
|
8
|
+
* breakpoint pass even when `needs` (the scheduler-facing set) is stripped to
|
|
9
|
+
* the in-pass subset by {@link adaptNeedsForPass}. `resolveStorageStateForNeeds`
|
|
10
|
+
* reads this so a consumer whose producer rendered in a DIFFERENT pass still
|
|
11
|
+
* loads that producer's on-disk auth state. Otherwise the consumer would
|
|
12
|
+
* render logged-out. Absent on stories that never went through
|
|
13
|
+
* `adaptNeedsForPass` (direct callers/tests), where `needs` is already the
|
|
14
|
+
* full set; the auth path falls back to `needs` then.
|
|
15
|
+
*/
|
|
16
|
+
authNeeds?: string[];
|
|
6
17
|
}
|
|
7
18
|
export interface ScheduleSummary {
|
|
8
19
|
ready: ScheduledStory[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/runner/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/runner/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAgCpE;AASD,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,cAAc,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE9E;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,cAAc,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,EACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,GAC5D,OAAO,CAAC,WAAW,EAAE,CAAC,CA6GxB;AAgFD,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B"}
|