tuffgal 0.1.0-alpha.10 → 0.1.0-alpha.11
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 +28 -17
- package/README.md +2 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +68 -13
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/config.d.ts +29 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -1
- package/dist/config.js.map +1 -1
- package/dist/reporter/assets/report.css +88 -1
- package/dist/reporter/assets/report.js +194 -5
- package/dist/reporter/template.d.ts +1 -1
- package/dist/reporter/template.d.ts.map +1 -1
- package/dist/reporter/template.js +171 -24
- package/dist/reporter/template.js.map +1 -1
- package/dist/reporter/writeReport.d.ts +1 -1
- package/dist/reporter/writeReport.d.ts.map +1 -1
- package/dist/reporter/writeReport.js +2 -2
- package/dist/reporter/writeReport.js.map +1 -1
- package/dist/runner/approve.d.ts +11 -3
- package/dist/runner/approve.d.ts.map +1 -1
- package/dist/runner/approve.js +15 -3
- package/dist/runner/approve.js.map +1 -1
- package/dist/runner/breakpointPasses.d.ts +39 -0
- package/dist/runner/breakpointPasses.d.ts.map +1 -0
- package/dist/runner/breakpointPasses.js +107 -0
- package/dist/runner/breakpointPasses.js.map +1 -0
- package/dist/runner/bridges/database.d.ts +4 -3
- package/dist/runner/bridges/database.d.ts.map +1 -1
- package/dist/runner/bridges/database.js +4 -3
- package/dist/runner/bridges/database.js.map +1 -1
- package/dist/runner/run.d.ts +10 -1
- package/dist/runner/run.d.ts.map +1 -1
- package/dist/runner/run.js +80 -12
- package/dist/runner/run.js.map +1 -1
- package/dist/runner/runAction.js +1 -1
- package/dist/runner/runAction.js.map +1 -1
- package/dist/runner/runStory.d.ts +7 -4
- package/dist/runner/runStory.d.ts.map +1 -1
- package/dist/runner/runStory.js +35 -27
- package/dist/runner/runStory.js.map +1 -1
- package/dist/runner/storyFilter.d.ts +8 -0
- package/dist/runner/storyFilter.d.ts.map +1 -1
- package/dist/runner/storyFilter.js +11 -0
- package/dist/runner/storyFilter.js.map +1 -1
- package/dist/schema/result.d.ts +11 -1
- package/dist/schema/result.d.ts.map +1 -1
- package/dist/schema/result.js.map +1 -1
- package/dist/screenshots/capture.d.ts +10 -5
- package/dist/screenshots/capture.d.ts.map +1 -1
- package/dist/screenshots/capture.js +17 -12
- package/dist/screenshots/capture.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,29 +6,38 @@ this project uses [Pride Versioning](https://pridever.org) → `PROUD.DEFAULT.SH
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
_Nothing
|
|
9
|
+
_Nothing just yet_
|
|
10
10
|
|
|
11
|
-
## [0.1.0-alpha.
|
|
11
|
+
## [0.1.0-alpha.11] — 2026-06-26
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Approve by breakpoint (e.g. `approve --desktop`, `approve --breakpoint <name>`)
|
|
16
|
+
- Approve by story (e.g. `approve user-logs-in`)
|
|
17
|
+
- `captureMode` config to limit screenshots to viewport-only or full page
|
|
18
|
+
- Documentation for CLI and reports
|
|
19
|
+
- `interactiveMode` config to view baseline/actual/diffs in a single-image view
|
|
20
|
+
- New baselines can now be filtered in the HTML report
|
|
21
|
+
- New baselines are now listed in the terminal summary report
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Screenshots default to viewport-only (were previously full page)
|
|
12
26
|
|
|
13
27
|
### Fixed
|
|
14
28
|
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
collided on the second mode, an already-read link no longer showed as unread,
|
|
20
|
-
an emptied list had nothing left to empty). Fixtures are now re-applied before
|
|
21
|
-
**every** breakpoint, resetting that state to a known baseline per mode.
|
|
22
|
-
Fixtures are idempotent, so non-mutating stories are unaffected.
|
|
29
|
+
- Multiple breakpoint runs no longer leak database state
|
|
30
|
+
- Report filters now only show matching actions inside each story
|
|
31
|
+
|
|
32
|
+
## [0.1.0-alpha.10] — 2026-06-22
|
|
23
33
|
|
|
24
34
|
### Added
|
|
25
35
|
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`breakpoint` overrides the injected value.
|
|
36
|
+
- `${breakpoint}` interpolation token
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Per-breakpoint database isolation
|
|
32
41
|
|
|
33
42
|
## [0.1.0-alpha.9] — 2026-06-21
|
|
34
43
|
|
|
@@ -161,7 +170,9 @@ styling or interactivity.
|
|
|
161
170
|
Initial public alpha. Tuffgal extracted from [Linklater](https://github.com/nschneble/linklater)'s
|
|
162
171
|
in-tree visual testing workspace.
|
|
163
172
|
|
|
164
|
-
[Unreleased]: https://github.com/nschneble/tuffgal/compare/v0.1.0-alpha.
|
|
173
|
+
[Unreleased]: https://github.com/nschneble/tuffgal/compare/v0.1.0-alpha.11...HEAD
|
|
174
|
+
[0.1.0-alpha.11]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.11
|
|
175
|
+
[0.1.0-alpha.10]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.10
|
|
165
176
|
[0.1.0-alpha.9]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.9
|
|
166
177
|
[0.1.0-alpha.8]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.8
|
|
167
178
|
[0.1.0-alpha.7]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.7
|
package/README.md
CHANGED
|
@@ -67,10 +67,12 @@ composite action.
|
|
|
67
67
|
- [Authoring guide](docs/authoring.md)
|
|
68
68
|
- [Changelog](CHANGELOG.md)
|
|
69
69
|
- [CI integration](docs/ci.md)
|
|
70
|
+
- [CLI reference](docs/cli.md)
|
|
70
71
|
- [Config reference](docs/config.md)
|
|
71
72
|
- [Migrating from Cypress](docs/migration-cypress.md)
|
|
72
73
|
- [Migrating from Playwright](docs/migration-playwright.md)
|
|
73
74
|
- [Product requirements](docs/prd-v1.md)
|
|
75
|
+
- [Reporting data (results.json)](docs/reporting.md)
|
|
74
76
|
- [Supervisor](docs/supervisor.md)
|
|
75
77
|
|
|
76
78
|
## License
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
declare const COMMANDS: readonly ["approve", "help", "init", "run", "supervise"];
|
|
3
|
+
type Command = (typeof COMMANDS)[number];
|
|
4
|
+
interface ParsedArguments {
|
|
5
|
+
command: Command;
|
|
6
|
+
coverage: boolean;
|
|
7
|
+
headed: boolean;
|
|
8
|
+
manageServers: boolean;
|
|
9
|
+
healthcheckIntervalMs?: number;
|
|
10
|
+
idleLimitMs?: number;
|
|
11
|
+
maxRespawns?: number;
|
|
12
|
+
maxRuntimeMs?: number;
|
|
13
|
+
newOnly: boolean;
|
|
14
|
+
storyFilter?: string;
|
|
15
|
+
/** Bare positional argument (e.g. `approve user-logs-in`). */
|
|
16
|
+
positional?: string;
|
|
17
|
+
/** `--breakpoint <name>` (repeatable) plus `--<name>` shorthands. */
|
|
18
|
+
breakpoints: string[];
|
|
19
|
+
workers?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function parseArguments(argv: string[]): ParsedArguments;
|
|
2
22
|
export {};
|
|
3
23
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AASA,QAAA,MAAM,QAAQ,0DAA2D,CAAC;AAC1E,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAKzC,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAgG9D"}
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
2
3
|
import { approveAll } from "./runner/approve.js";
|
|
3
4
|
import { init } from "./commands/init.js";
|
|
4
|
-
import { loadConfig } from "./config.js";
|
|
5
|
+
import { BREAKPOINTS, loadConfig } from "./config.js";
|
|
5
6
|
import { runAll } from "./runner/run.js";
|
|
7
|
+
import { normaliseStoryArg } from "./runner/storyFilter.js";
|
|
6
8
|
import { supervise } from "./commands/supervise.js";
|
|
7
9
|
const COMMANDS = ['approve', 'help', 'init', 'run', 'supervise'];
|
|
8
|
-
|
|
10
|
+
/** Registry breakpoint names that double as `--<name>` approve shorthands. */
|
|
11
|
+
const BREAKPOINT_FLAGS = Object.keys(BREAKPOINTS);
|
|
12
|
+
export function parseArguments(argv) {
|
|
9
13
|
const [command, ...rest] = argv;
|
|
10
14
|
const parsed = {
|
|
11
15
|
command: COMMANDS.includes(command)
|
|
@@ -15,6 +19,14 @@ function parseArguments(argv) {
|
|
|
15
19
|
manageServers: false,
|
|
16
20
|
coverage: false,
|
|
17
21
|
newOnly: false,
|
|
22
|
+
breakpoints: [],
|
|
23
|
+
};
|
|
24
|
+
const addBreakpoint = (name) => {
|
|
25
|
+
if (name === undefined || name === '') {
|
|
26
|
+
throw new Error('--breakpoint requires a mode name (e.g. desktop)');
|
|
27
|
+
}
|
|
28
|
+
if (!parsed.breakpoints.includes(name))
|
|
29
|
+
parsed.breakpoints.push(name);
|
|
18
30
|
};
|
|
19
31
|
for (let index = 0; index < rest.length; index += 1) {
|
|
20
32
|
const arg = rest[index];
|
|
@@ -30,6 +42,23 @@ function parseArguments(argv) {
|
|
|
30
42
|
else if (arg.startsWith('--story=')) {
|
|
31
43
|
parsed.storyFilter = arg.slice('--story='.length);
|
|
32
44
|
}
|
|
45
|
+
else if (arg === '--breakpoint') {
|
|
46
|
+
addBreakpoint(rest[index + 1]);
|
|
47
|
+
index += 1;
|
|
48
|
+
}
|
|
49
|
+
else if (arg.startsWith('--breakpoint=')) {
|
|
50
|
+
addBreakpoint(arg.slice('--breakpoint='.length));
|
|
51
|
+
}
|
|
52
|
+
else if (arg.startsWith('--') &&
|
|
53
|
+
BREAKPOINT_FLAGS.includes(arg.slice(2))) {
|
|
54
|
+
addBreakpoint(arg.slice(2));
|
|
55
|
+
}
|
|
56
|
+
else if (!arg.startsWith('-')) {
|
|
57
|
+
if (parsed.positional !== undefined) {
|
|
58
|
+
throw new Error(`unexpected extra argument "${arg}" (already got "${parsed.positional}")`);
|
|
59
|
+
}
|
|
60
|
+
parsed.positional = arg;
|
|
61
|
+
}
|
|
33
62
|
else if (arg === '--workers') {
|
|
34
63
|
parsed.workers = numericFlag('--workers', rest[index + 1]);
|
|
35
64
|
index += 1;
|
|
@@ -113,7 +142,9 @@ function printHelp() {
|
|
|
113
142
|
' --coverage Capture V8 JS + CSS coverage and emit a monocart report.',
|
|
114
143
|
'',
|
|
115
144
|
'Approve options:',
|
|
145
|
+
' <story> Positional story to approve (name or path); same as --story.',
|
|
116
146
|
' --new-only Only promote new baselines; skip changed.',
|
|
147
|
+
' --breakpoint <name> Only approve this mode; repeatable. Also --desktop/--mobile/etc.',
|
|
117
148
|
'',
|
|
118
149
|
'Supervise options:',
|
|
119
150
|
' --healthcheck-interval N Probe interval in ms (default 30_000).',
|
|
@@ -122,14 +153,24 @@ function printHelp() {
|
|
|
122
153
|
' --max-respawns N Respawn budget after unhealthy/exit (default 3).',
|
|
123
154
|
].join('\n') + '\n');
|
|
124
155
|
}
|
|
156
|
+
function failExit(message) {
|
|
157
|
+
process.stderr.write(`tuffgal error: ${message}\n`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
125
160
|
async function main() {
|
|
126
161
|
const args = parseArguments(process.argv.slice(2));
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
162
|
+
// `--new-only` and the breakpoint filters narrow an approval set; they have no
|
|
163
|
+
// meaning on the other subcommands.
|
|
164
|
+
if (args.command !== 'approve') {
|
|
165
|
+
if (args.newOnly) {
|
|
166
|
+
failExit('--new-only is only valid with the `approve` subcommand');
|
|
167
|
+
}
|
|
168
|
+
if (args.breakpoints.length > 0) {
|
|
169
|
+
failExit('--breakpoint (and --desktop/--mobile/…) is only valid with the `approve` subcommand');
|
|
170
|
+
}
|
|
171
|
+
if (args.positional !== undefined) {
|
|
172
|
+
failExit(`unexpected argument "${args.positional}"`);
|
|
173
|
+
}
|
|
133
174
|
}
|
|
134
175
|
if (args.command === 'help') {
|
|
135
176
|
printHelp();
|
|
@@ -151,9 +192,18 @@ async function main() {
|
|
|
151
192
|
process.exit(result.totals.failed > 0 ? 1 : 0);
|
|
152
193
|
}
|
|
153
194
|
if (args.command === 'approve') {
|
|
195
|
+
// A story may be named positionally (`approve user-logs-in`) or via
|
|
196
|
+
// `--story`, but not both.
|
|
197
|
+
if (args.positional !== undefined && args.storyFilter !== undefined) {
|
|
198
|
+
failExit('name a story positionally or with --story, not both');
|
|
199
|
+
}
|
|
200
|
+
const storyFilter = args.positional !== undefined
|
|
201
|
+
? normaliseStoryArg(args.positional)
|
|
202
|
+
: args.storyFilter;
|
|
154
203
|
const summary = await approveAll(config, {
|
|
155
|
-
storyFilter
|
|
204
|
+
storyFilter,
|
|
156
205
|
newOnly: args.newOnly,
|
|
206
|
+
breakpoints: args.breakpoints,
|
|
157
207
|
});
|
|
158
208
|
process.stdout.write(`\nApproved ${summary.approved} baselines; skipped ${summary.skipped} actions.\n`);
|
|
159
209
|
}
|
|
@@ -166,8 +216,13 @@ async function main() {
|
|
|
166
216
|
});
|
|
167
217
|
}
|
|
168
218
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
219
|
+
// Only drive the CLI when run as the entry point. Importing this module (e.g.
|
|
220
|
+
// from a unit test exercising `parseArguments`) must not kick off a real run.
|
|
221
|
+
if (process.argv[1] &&
|
|
222
|
+
import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
223
|
+
main().catch((error) => {
|
|
224
|
+
process.stderr.write(`tuffgal error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
173
228
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoFA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C9D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -38,6 +38,11 @@ export default defineConfig({
|
|
|
38
38
|
// modes via its own \`breakpoints\` field, which replace these for that story.
|
|
39
39
|
// breakpoints: ['mobile', 'tablet', 'laptop', 'desktop'],
|
|
40
40
|
|
|
41
|
+
// Screenshot scope. 'viewport' (default) crops to each breakpoint's
|
|
42
|
+
// width x height — what the user sees above the fold. 'fullPage' composites
|
|
43
|
+
// the whole scrollable document, however tall.
|
|
44
|
+
// captureMode: 'viewport',
|
|
45
|
+
|
|
41
46
|
defaultTimeoutMs: 10_000,
|
|
42
47
|
navigationTimeoutMs: 15_000,
|
|
43
48
|
frozenTime: '2026-01-15T12:00:00.000Z',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AAEhE,MAAM,eAAe,GAAG
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AAEhE,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEvB,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;CAGxB,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,sBAAsB,GAAG,2BAA2B;gBAC9D,+CAA+C,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,mBAAmB,IAAI,CAC9D,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,EAAE;QACF,qCAAqC;QACrC,0DAA0D;QAC1D,sDAAsD;QACtD,qDAAqD;QACrD,kDAAkD;QAClD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
export interface DatabaseBridge {
|
|
7
7
|
/**
|
|
8
8
|
* Wipes the test database and reseeds the deterministic test user. Called
|
|
9
|
-
* once before
|
|
9
|
+
* once per breakpoint pass, before that pass dispatches its first story — so
|
|
10
|
+
* a single-breakpoint run calls it once, and an N-breakpoint run calls it N
|
|
11
|
+
* times, giving each breakpoint a pristine database. Keep it fast.
|
|
10
12
|
*/
|
|
11
13
|
reset?: () => Promise<void>;
|
|
12
14
|
/**
|
|
@@ -74,6 +76,15 @@ export declare const BREAKPOINTS: {
|
|
|
74
76
|
};
|
|
75
77
|
/** A built-in breakpoint name. Other modules reuse this for per-mode work. */
|
|
76
78
|
export type BreakpointName = keyof typeof BREAKPOINTS;
|
|
79
|
+
/**
|
|
80
|
+
* How much of the page each screenshot captures:
|
|
81
|
+
* - `viewport` — only the breakpoint's `width x height` box, matching what a
|
|
82
|
+
* real user sees above the fold. The default.
|
|
83
|
+
* - `fullPage` — the whole scrollable document, however tall. Catches
|
|
84
|
+
* below-the-fold regressions at the cost of viewport fidelity (a long page
|
|
85
|
+
* renders at e.g. 1280x2500 instead of 1280x800).
|
|
86
|
+
*/
|
|
87
|
+
export type CaptureMode = 'viewport' | 'fullPage';
|
|
77
88
|
/**
|
|
78
89
|
* One resolved breakpoint mode: a name plus the viewport dimensions to render
|
|
79
90
|
* at. Built from a {@link BreakpointSelector} (a registry entry, optionally
|
|
@@ -144,6 +155,13 @@ export interface TuffgalConfig {
|
|
|
144
155
|
* the field to run a single `desktop` breakpoint (1280x800).
|
|
145
156
|
*/
|
|
146
157
|
breakpoints?: BreakpointSelector[];
|
|
158
|
+
/**
|
|
159
|
+
* How much of the page each screenshot captures. `viewport` (default) crops
|
|
160
|
+
* to the breakpoint's `width x height` so diffs reflect what the user sees
|
|
161
|
+
* above the fold; `fullPage` composites the whole scrollable document. See
|
|
162
|
+
* {@link CaptureMode}.
|
|
163
|
+
*/
|
|
164
|
+
captureMode?: CaptureMode;
|
|
147
165
|
/** Default Playwright locator + action timeout. Defaults to 10_000. */
|
|
148
166
|
defaultTimeoutMs?: number;
|
|
149
167
|
/** Default navigation timeout. Defaults to 15_000. */
|
|
@@ -167,6 +185,12 @@ export interface TuffgalConfig {
|
|
|
167
185
|
* `customCoverage.flows` in the report.
|
|
168
186
|
*/
|
|
169
187
|
flowInventory?: string;
|
|
188
|
+
/**
|
|
189
|
+
* Render the interactive screenshot viewer instead of the static radio-tab
|
|
190
|
+
* report. Defaults to `false`, so the report keeps its historical radio-tab
|
|
191
|
+
* output unless a project explicitly opts in.
|
|
192
|
+
*/
|
|
193
|
+
interactiveMode?: boolean;
|
|
170
194
|
}
|
|
171
195
|
/**
|
|
172
196
|
* Resolved config — every optional field replaced with a concrete value
|
|
@@ -187,6 +211,8 @@ export interface ResolvedConfig {
|
|
|
187
211
|
* noUncheckedIndexedAccess.
|
|
188
212
|
*/
|
|
189
213
|
breakpoints: [ResolvedBreakpoint, ...ResolvedBreakpoint[]];
|
|
214
|
+
/** Resolved screenshot scope; defaults to `viewport`. */
|
|
215
|
+
captureMode: CaptureMode;
|
|
190
216
|
defaultTimeoutMs: number;
|
|
191
217
|
navigationTimeoutMs: number;
|
|
192
218
|
frozenTime: string;
|
|
@@ -194,6 +220,8 @@ export interface ResolvedConfig {
|
|
|
194
220
|
database: DatabaseBridge | undefined;
|
|
195
221
|
devServers: DevServerBridge | undefined;
|
|
196
222
|
flowInventory: string | undefined;
|
|
223
|
+
/** Resolved interactive-viewer flag; defaults to `false`. */
|
|
224
|
+
interactiveMode: boolean;
|
|
197
225
|
}
|
|
198
226
|
/**
|
|
199
227
|
* Helper that returns its argument unchanged. Use in a `tuffgal.config.ts`
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -29,10 +29,12 @@ export const BREAKPOINTS = {
|
|
|
29
29
|
desktop: { width: 1280, height: 800 },
|
|
30
30
|
};
|
|
31
31
|
const DEFAULTS = {
|
|
32
|
+
captureMode: 'viewport',
|
|
32
33
|
defaultTimeoutMs: 10_000,
|
|
33
34
|
navigationTimeoutMs: 15_000,
|
|
34
35
|
frozenTime: '2026-01-15T12:00:00.000Z',
|
|
35
36
|
authStateRelative: '.auth',
|
|
37
|
+
interactiveMode: false,
|
|
36
38
|
};
|
|
37
39
|
/**
|
|
38
40
|
* Helper that returns its argument unchanged. Use in a `tuffgal.config.ts`
|
|
@@ -114,6 +116,15 @@ export function assertValidConfig(input, source) {
|
|
|
114
116
|
fail(`\`${key}\` must be a string when provided.`);
|
|
115
117
|
}
|
|
116
118
|
}
|
|
119
|
+
if (config.interactiveMode !== undefined &&
|
|
120
|
+
typeof config.interactiveMode !== 'boolean') {
|
|
121
|
+
fail('`interactiveMode` must be a boolean when provided.');
|
|
122
|
+
}
|
|
123
|
+
if (config.captureMode !== undefined &&
|
|
124
|
+
config.captureMode !== 'viewport' &&
|
|
125
|
+
config.captureMode !== 'fullPage') {
|
|
126
|
+
fail("`captureMode` must be 'viewport' or 'fullPage' when provided.");
|
|
127
|
+
}
|
|
117
128
|
if (config.breakpoints !== undefined) {
|
|
118
129
|
const validNames = Object.keys(BREAKPOINTS);
|
|
119
130
|
const breakpoints = config.breakpoints;
|
|
@@ -132,7 +143,8 @@ export function assertValidConfig(input, source) {
|
|
|
132
143
|
const override = entry;
|
|
133
144
|
for (const dim of ['width', 'height']) {
|
|
134
145
|
if (override[dim] !== undefined &&
|
|
135
|
-
(typeof override[dim] !== 'number' ||
|
|
146
|
+
(typeof override[dim] !== 'number' ||
|
|
147
|
+
override[dim] <= 0)) {
|
|
136
148
|
fail(`\`breakpoints[].${dim}\` must be a positive number when provided.`);
|
|
137
149
|
}
|
|
138
150
|
}
|
|
@@ -155,6 +167,7 @@ function resolveConfig(input, rootDir) {
|
|
|
155
167
|
apiHost: input.apiHost,
|
|
156
168
|
storageStatePins: input.storageStatePins ?? [],
|
|
157
169
|
breakpoints,
|
|
170
|
+
captureMode: input.captureMode ?? DEFAULTS.captureMode,
|
|
158
171
|
defaultTimeoutMs: input.defaultTimeoutMs ?? DEFAULTS.defaultTimeoutMs,
|
|
159
172
|
navigationTimeoutMs: input.navigationTimeoutMs ?? DEFAULTS.navigationTimeoutMs,
|
|
160
173
|
frozenTime: input.frozenTime ?? DEFAULTS.frozenTime,
|
|
@@ -164,6 +177,7 @@ function resolveConfig(input, rootDir) {
|
|
|
164
177
|
flowInventory: input.flowInventory
|
|
165
178
|
? resolve(rootDir, input.flowInventory)
|
|
166
179
|
: undefined,
|
|
180
|
+
interactiveMode: input.interactiveMode ?? DEFAULTS.interactiveMode,
|
|
167
181
|
};
|
|
168
182
|
}
|
|
169
183
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,15 @@
|
|
|
57
57
|
box-sizing: border-box;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/* The story filter prunes stories, breakpoint groups, and actions by toggling
|
|
61
|
+
the native `hidden` attribute. Those are layout containers, so a future
|
|
62
|
+
`display:` rule on `.action`/`.breakpoint-group` would outrank the UA
|
|
63
|
+
`[hidden]` default and silently resurrect filtered rows as visible and
|
|
64
|
+
keyboard-focusable. Pin it so `hidden` always wins. */
|
|
65
|
+
[hidden] {
|
|
66
|
+
display: none !important;
|
|
67
|
+
}
|
|
68
|
+
|
|
60
69
|
html {
|
|
61
70
|
-webkit-font-smoothing: antialiased;
|
|
62
71
|
-moz-osx-font-smoothing: grayscale;
|
|
@@ -182,6 +191,10 @@ h2 {
|
|
|
182
191
|
color: var(--pass);
|
|
183
192
|
}
|
|
184
193
|
|
|
194
|
+
.summary-item[data-status='new'] .indicator {
|
|
195
|
+
color: var(--new);
|
|
196
|
+
}
|
|
197
|
+
|
|
185
198
|
.summary-item[data-status='changed'] .indicator {
|
|
186
199
|
color: var(--changed);
|
|
187
200
|
}
|
|
@@ -331,6 +344,10 @@ h2 {
|
|
|
331
344
|
box-shadow: inset 3px 0 0 var(--failed);
|
|
332
345
|
}
|
|
333
346
|
|
|
347
|
+
.story[data-status='new'] {
|
|
348
|
+
box-shadow: inset 3px 0 0 var(--new);
|
|
349
|
+
}
|
|
350
|
+
|
|
334
351
|
.story[data-status='changed'] {
|
|
335
352
|
box-shadow: inset 3px 0 0 var(--changed);
|
|
336
353
|
}
|
|
@@ -357,6 +374,11 @@ h2 {
|
|
|
357
374
|
color: var(--pass);
|
|
358
375
|
}
|
|
359
376
|
|
|
377
|
+
.story[data-status='new'] .story-marker,
|
|
378
|
+
.story[data-status='new'] .story-file {
|
|
379
|
+
color: var(--new);
|
|
380
|
+
}
|
|
381
|
+
|
|
360
382
|
.story[data-status='changed'] .story-marker,
|
|
361
383
|
.story[data-status='changed'] .story-file {
|
|
362
384
|
color: var(--changed);
|
|
@@ -380,7 +402,9 @@ h2 {
|
|
|
380
402
|
text-wrap: pretty;
|
|
381
403
|
}
|
|
382
404
|
|
|
383
|
-
|
|
405
|
+
/* `:not([hidden])` on both sides so a filter that hides the first group does
|
|
406
|
+
not strand its separator on the new first-visible group. */
|
|
407
|
+
.breakpoint-group:not([hidden]) + .breakpoint-group:not([hidden]) {
|
|
384
408
|
margin-top: 0.75rem;
|
|
385
409
|
padding-top: 0.75rem;
|
|
386
410
|
border-top: 1px dashed var(--border);
|
|
@@ -629,6 +653,69 @@ summary.action-row:focus-visible {
|
|
|
629
653
|
color: var(--text-subtle);
|
|
630
654
|
}
|
|
631
655
|
|
|
656
|
+
/* No diff image to show (dimension mismatch). The note IS the primary content
|
|
657
|
+
of this slot, so it keeps full `--text` weight; italic alone marks the
|
|
658
|
+
"no data" state. */
|
|
659
|
+
.diff-stats--unavailable .label {
|
|
660
|
+
font-style: italic;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/* Interactive screenshot viewer (interactiveMode). The radio group + caption
|
|
664
|
+
sit in this fieldset, which lives OUTSIDE the clipped `.shot-stage`, so the
|
|
665
|
+
chip focus ring is never clipped by the stage overflow nor painted over
|
|
666
|
+
screenshot pixels. The chips reuse `.chip--toggle` (border `--border-bright`,
|
|
667
|
+
`--accent` focus ring), so no new focus tokens are introduced here. */
|
|
668
|
+
.shot-interactive {
|
|
669
|
+
display: flex;
|
|
670
|
+
flex-wrap: wrap;
|
|
671
|
+
align-items: center;
|
|
672
|
+
gap: 0.5rem;
|
|
673
|
+
margin: 0.5rem 0 0.5rem 2.2rem;
|
|
674
|
+
padding: 0;
|
|
675
|
+
border: 0;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/* Persistent caption naming the committed variant. Text on `--text` (≥4.5:1),
|
|
679
|
+
so the active variant is never conveyed by color alone — it pairs the checked
|
|
680
|
+
chip's accent border with this readable label. aria-hidden keeps it visual
|
|
681
|
+
only: the checked radio is the single accessible source of committed state. */
|
|
682
|
+
.shot-caption {
|
|
683
|
+
margin: 0 0 0 0.25rem;
|
|
684
|
+
color: var(--text);
|
|
685
|
+
font-size: 0.8125rem;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.shot-caption-variant {
|
|
689
|
+
font-weight: 600;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/* The stage clips the screenshot to the viewport height. Its border uses
|
|
693
|
+
`--border-bright` (3:1 non-text contrast). overflow:hidden only ever clips
|
|
694
|
+
the image — the controls live in the sibling fieldset above. */
|
|
695
|
+
.shot-stage {
|
|
696
|
+
margin-top: 0.5rem;
|
|
697
|
+
margin-left: 2.2rem;
|
|
698
|
+
padding: 0.5rem;
|
|
699
|
+
border: 1px solid var(--border-bright);
|
|
700
|
+
background: var(--bg);
|
|
701
|
+
width: fit-content;
|
|
702
|
+
max-width: 100%;
|
|
703
|
+
overflow: hidden;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/* Scale the screenshot to fit within the viewport height (and the panel width)
|
|
707
|
+
so a tall capture never forces the page to scroll. width/height:auto preserve
|
|
708
|
+
the aspect ratio while `max-height` caps it to the viewport. */
|
|
709
|
+
.shot-image {
|
|
710
|
+
display: block;
|
|
711
|
+
width: auto;
|
|
712
|
+
height: auto;
|
|
713
|
+
max-width: 100%;
|
|
714
|
+
max-height: 85vh;
|
|
715
|
+
outline: 1px solid var(--img-outline);
|
|
716
|
+
outline-offset: -1px;
|
|
717
|
+
}
|
|
718
|
+
|
|
632
719
|
@media (prefers-reduced-motion: reduce) {
|
|
633
720
|
.skip-link,
|
|
634
721
|
summary.action-row::after,
|