@juxtapose/core 0.7.0 → 0.9.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/dist/agent/handoff.d.ts +16 -0
- package/dist/agent/handoff.js +37 -2
- package/dist/agent/handoff.js.map +1 -1
- package/dist/analysis/affected.d.ts +19 -1
- package/dist/analysis/affected.js +50 -1
- package/dist/analysis/affected.js.map +1 -1
- package/dist/analysis/cause.js +2 -2
- package/dist/analysis/cause.js.map +1 -1
- package/dist/baseline/approve.js +2 -1
- package/dist/baseline/approve.js.map +1 -1
- package/dist/baseline/git-store.js +12 -5
- package/dist/baseline/git-store.js.map +1 -1
- package/dist/browser/browser.js +4 -1
- package/dist/browser/browser.js.map +1 -1
- package/dist/browser/cdp.d.ts +39 -3
- package/dist/browser/cdp.js +57 -17
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/daemon/client.js +4 -3
- package/dist/browser/daemon/client.js.map +1 -1
- package/dist/browser/daemon/state.js +4 -3
- package/dist/browser/daemon/state.js.map +1 -1
- package/dist/browser/daemon/supervisor-main.js +14 -9
- package/dist/browser/daemon/supervisor-main.js.map +1 -1
- package/dist/browser/daemon/supervisor.js +31 -25
- package/dist/browser/daemon/supervisor.js.map +1 -1
- package/dist/browser/flags.d.ts +14 -0
- package/dist/browser/flags.js +15 -0
- package/dist/browser/flags.js.map +1 -1
- package/dist/browser/guards.d.ts +6 -0
- package/dist/browser/guards.js +23 -0
- package/dist/browser/guards.js.map +1 -0
- package/dist/browser/install.js +10 -4
- package/dist/browser/install.js.map +1 -1
- package/dist/browser/launch.d.ts +2 -1
- package/dist/browser/launch.js +12 -4
- package/dist/browser/launch.js.map +1 -1
- package/dist/browser/page.d.ts +18 -1
- package/dist/browser/page.js +27 -16
- package/dist/browser/page.js.map +1 -1
- package/dist/browser/resolve.js +2 -1
- package/dist/browser/resolve.js.map +1 -1
- package/dist/browser/zip.js +4 -3
- package/dist/browser/zip.js.map +1 -1
- package/dist/capture/capture.d.ts +3 -1
- package/dist/capture/capture.js +81 -8
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/discover.d.ts +28 -0
- package/dist/capture/discover.js +109 -0
- package/dist/capture/discover.js.map +1 -0
- package/dist/capture/pool.d.ts +2 -0
- package/dist/capture/pool.js +3 -1
- package/dist/capture/pool.js.map +1 -1
- package/dist/capture/settle.js +4 -0
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/snap.js +3 -1
- package/dist/capture/snap.js.map +1 -1
- package/dist/capture/structure.d.ts +15 -33
- package/dist/capture/structure.js +81 -22
- package/dist/capture/structure.js.map +1 -1
- package/dist/capture/variants.d.ts +47 -0
- package/dist/capture/variants.js +192 -0
- package/dist/capture/variants.js.map +1 -0
- package/dist/diff/regions.js +8 -4
- package/dist/diff/regions.js.map +1 -1
- package/dist/diff/structural/deltas.d.ts +2 -3
- package/dist/diff/structural/deltas.js +12 -9
- package/dist/diff/structural/deltas.js.map +1 -1
- package/dist/diff/structural/disambiguate.js +8 -7
- package/dist/diff/structural/disambiguate.js.map +1 -1
- package/dist/diff/structural/label.js +1 -1
- package/dist/diff/structural/label.js.map +1 -1
- package/dist/diff/structural/match.js +13 -6
- package/dist/diff/structural/match.js.map +1 -1
- package/dist/diff/structural/shift.js +8 -6
- package/dist/diff/structural/shift.js.map +1 -1
- package/dist/diff/structural/summary.js +9 -5
- package/dist/diff/structural/summary.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +20 -0
- package/dist/platforms/urls.js +5 -1
- package/dist/platforms/urls.js.map +1 -1
- package/dist/report/comment.js +19 -8
- package/dist/report/comment.js.map +1 -1
- package/dist/report/format.d.ts +17 -0
- package/dist/report/format.js +16 -0
- package/dist/report/format.js.map +1 -1
- package/dist/report/github.js +21 -7
- package/dist/report/github.js.map +1 -1
- package/dist/report/html.js +40 -6
- package/dist/report/html.js.map +1 -1
- package/dist/report/run-report.d.ts +10 -0
- package/dist/report/run-report.js +24 -0
- package/dist/report/run-report.js.map +1 -0
- package/dist/run/run.d.ts +2 -0
- package/dist/run/run.js +15 -0
- package/dist/run/run.js.map +1 -1
- package/dist/types.d.ts +47 -1
- package/package.json +2 -1
package/dist/report/html.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// This complements rather than duplicates the addon panel. The panel is for
|
|
9
9
|
// local review with a dev server running; this is for a reviewer looking at a
|
|
10
10
|
// pull request who has checked nothing out.
|
|
11
|
-
import { describeMagnitude } from './format.js';
|
|
11
|
+
import { captureLabel, describeMagnitude } from './format.js';
|
|
12
12
|
export function buildHtmlReport({ report, images }) {
|
|
13
13
|
const needsReview = report.results.filter((r) => r.status === 'fail' || r.status === 'new' || r.status === 'stale');
|
|
14
14
|
const s = report.summary;
|
|
@@ -37,7 +37,9 @@ export function buildHtmlReport({ report, images }) {
|
|
|
37
37
|
|
|
38
38
|
${needsReview.length === 0
|
|
39
39
|
? `<p class="empty">Every captured story matches its approved baseline.</p>`
|
|
40
|
-
: needsReview
|
|
40
|
+
: groupByStory(needsReview)
|
|
41
|
+
.map((group) => storyGroup(group, images))
|
|
42
|
+
.join('\n')}
|
|
41
43
|
|
|
42
44
|
<script>${SCRIPT}</script>
|
|
43
45
|
`;
|
|
@@ -45,7 +47,35 @@ ${needsReview.length === 0
|
|
|
45
47
|
function stat(label, value, tone = '') {
|
|
46
48
|
return `<div class="${tone}"><dt>${label}</dt><dd>${value}</dd></div>`;
|
|
47
49
|
}
|
|
48
|
-
|
|
50
|
+
/** Captures grouped by story, in first-seen order: a story's variants nest
|
|
51
|
+
* under it rather than reading as unrelated stories. */
|
|
52
|
+
function groupByStory(results) {
|
|
53
|
+
const groups = new Map();
|
|
54
|
+
for (const r of results) {
|
|
55
|
+
const key = r.baseStoryId ?? r.storyId;
|
|
56
|
+
const group = groups.get(key);
|
|
57
|
+
if (group)
|
|
58
|
+
group.push(r);
|
|
59
|
+
else
|
|
60
|
+
groups.set(key, [r]);
|
|
61
|
+
}
|
|
62
|
+
return [...groups.values()];
|
|
63
|
+
}
|
|
64
|
+
function storyGroup(group, images) {
|
|
65
|
+
const [first] = group;
|
|
66
|
+
// A lone default capture renders exactly as before variants existed.
|
|
67
|
+
if (group.length === 1 && first && first.variant === undefined)
|
|
68
|
+
return storySection(first, images.get(first.storyId), 'h2', first.storyId);
|
|
69
|
+
const story = first?.baseStoryId ?? first?.storyId ?? '';
|
|
70
|
+
return `
|
|
71
|
+
<article class="story">
|
|
72
|
+
<h2>${escapeHtml(story)}</h2>
|
|
73
|
+
${group
|
|
74
|
+
.map((r) => storySection(r, images.get(r.storyId), 'h3', r.variant ?? 'default', captureLabel(r)))
|
|
75
|
+
.join('\n')}
|
|
76
|
+
</article>`;
|
|
77
|
+
}
|
|
78
|
+
function storySection(result, imgs, level, label, title = label) {
|
|
49
79
|
const baseline = dataUri(imgs?.baseline);
|
|
50
80
|
const current = dataUri(imgs?.current);
|
|
51
81
|
const diff = dataUri(imgs?.diff);
|
|
@@ -55,11 +85,11 @@ function storySection(result, imgs) {
|
|
|
55
85
|
const comparable = Boolean(baseline && current);
|
|
56
86
|
return `
|
|
57
87
|
<section>
|
|
58
|
-
|
|
88
|
+
<${level}${level === 'h3' ? ` title="${escapeHtml(title)}"` : ''}>
|
|
59
89
|
<span class="badge ${result.status}">${statusLabel(result.status)}</span>
|
|
60
|
-
${escapeHtml(
|
|
90
|
+
${escapeHtml(label)}
|
|
61
91
|
${result.status === 'fail' ? `<span class="pct">${escapeHtml(describeMagnitude(result))}</span>` : ''}
|
|
62
|
-
|
|
92
|
+
</${level}>
|
|
63
93
|
${result.error ? `<p class="error">${escapeHtml(result.error)}</p>` : ''}
|
|
64
94
|
${comparable
|
|
65
95
|
? `
|
|
@@ -143,6 +173,10 @@ dl .bad dd { color: var(--bad); } dl .warn dd { color: var(--warn); }
|
|
|
143
173
|
.meta { color: var(--muted); font-size: 13px; margin: 0 0 28px; }
|
|
144
174
|
.empty { color: var(--muted); }
|
|
145
175
|
section { border-top: 1px solid var(--line); padding: 20px 0; }
|
|
176
|
+
article.story { border-top: 1px solid var(--line); padding-top: 20px; }
|
|
177
|
+
article.story > h2 { margin-bottom: 4px; }
|
|
178
|
+
article.story section { border-top: none; padding: 12px 0 12px 16px; border-left: 2px solid var(--line); }
|
|
179
|
+
h3 { font-size: 14px; font-weight: 600; display: flex; align-items: center; gap: 8px; margin: 0 0 8px; }
|
|
146
180
|
h2 { font-size: 15px; font-weight: 600; display: flex; align-items: center;
|
|
147
181
|
gap: 10px; margin: 0 0 12px; }
|
|
148
182
|
.badge { font-size: 11px; text-transform: uppercase; letter-spacing: .04em;
|
package/dist/report/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,uEAAuE;AACvE,8EAA8E;AAC9E,0EAA0E;AAC1E,4EAA4E;AAC5E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,4CAA4C;AAG5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RunReport } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* What every reader dereferences before anything else: a results array whose
|
|
4
|
+
* entries carry a string storyId. The rest of the report is trusted as `jux
|
|
5
|
+
* run` wrote it; this catches the file that is not a report at all (truncated,
|
|
6
|
+
* hand-edited, another tool's) with a message instead of a TypeError.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isRunReport(v: unknown): v is RunReport;
|
|
9
|
+
/** JSON.parse plus isRunReport; throws, naming `source`, on either failure. */
|
|
10
|
+
export declare function parseRunReport(text: string, source?: string): RunReport;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// packages/core/src/report/run-report.ts
|
|
2
|
+
//
|
|
3
|
+
// Reading report.json back: `jux approve`, `check`, `handoff`, the MCP server
|
|
4
|
+
// and the review server all start from it.
|
|
5
|
+
import { isRecord } from '../browser/guards.js';
|
|
6
|
+
/**
|
|
7
|
+
* What every reader dereferences before anything else: a results array whose
|
|
8
|
+
* entries carry a string storyId. The rest of the report is trusted as `jux
|
|
9
|
+
* run` wrote it; this catches the file that is not a report at all (truncated,
|
|
10
|
+
* hand-edited, another tool's) with a message instead of a TypeError.
|
|
11
|
+
*/
|
|
12
|
+
export function isRunReport(v) {
|
|
13
|
+
return (isRecord(v) &&
|
|
14
|
+
Array.isArray(v['results']) &&
|
|
15
|
+
v['results'].every((r) => isRecord(r) && typeof r['storyId'] === 'string'));
|
|
16
|
+
}
|
|
17
|
+
/** JSON.parse plus isRunReport; throws, naming `source`, on either failure. */
|
|
18
|
+
export function parseRunReport(text, source = 'report.json') {
|
|
19
|
+
const parsed = JSON.parse(text);
|
|
20
|
+
if (!isRunReport(parsed))
|
|
21
|
+
throw new Error(`jux: ${source} is not a run report (no results with story ids)`);
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=run-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-report.js","sourceRoot":"","sources":["../../src/report/run-report.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,8EAA8E;AAC9E,2CAA2C;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,OAAO,CACL,QAAQ,CAAC,CAAC,CAAC;QACX,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAM,GAAG,aAAa;IACjE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,kDAAkD,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/run/run.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface RunOptions {
|
|
|
21
21
|
/** Receives each story's images so the caller decides where they land. */
|
|
22
22
|
onArtifact?: (artifact: RunArtifact) => Promise<void>;
|
|
23
23
|
onProgress?: (done: number, total: number, storyId: string) => void;
|
|
24
|
+
/** Non-fatal capture notices; the caller decides where they go. */
|
|
25
|
+
onWarning?: (message: string) => void;
|
|
24
26
|
signal?: AbortSignal;
|
|
25
27
|
/** Collects per-phase wall time. Pass one to fold in phases the caller timed
|
|
26
28
|
* itself (enumerate, affected, launch); omit and one is made internally. */
|
package/dist/run/run.js
CHANGED
|
@@ -30,6 +30,7 @@ export async function runCapture(opts) {
|
|
|
30
30
|
warmSwitch: opts.config?.warmSwitch,
|
|
31
31
|
viewport,
|
|
32
32
|
onProgress: opts.onProgress,
|
|
33
|
+
...(opts.onWarning ? { onWarning: opts.onWarning } : {}),
|
|
33
34
|
signal: opts.signal,
|
|
34
35
|
});
|
|
35
36
|
// Capture is measured as the whole streamed loop rather than per story: the
|
|
@@ -40,6 +41,7 @@ export async function runCapture(opts) {
|
|
|
40
41
|
if (outcome.skipped) {
|
|
41
42
|
results.push({
|
|
42
43
|
storyId: outcome.story.storyId,
|
|
44
|
+
...variantOf(outcome.story),
|
|
43
45
|
status: 'skip',
|
|
44
46
|
mismatchPixels: 0,
|
|
45
47
|
mismatchPercent: 0,
|
|
@@ -51,6 +53,7 @@ export async function runCapture(opts) {
|
|
|
51
53
|
if (outcome.error || !outcome.snapshot) {
|
|
52
54
|
results.push({
|
|
53
55
|
storyId: outcome.story.storyId,
|
|
56
|
+
...variantOf(outcome.story),
|
|
54
57
|
status: 'fail',
|
|
55
58
|
mismatchPixels: 0,
|
|
56
59
|
mismatchPercent: 0,
|
|
@@ -93,6 +96,7 @@ async function judge(snapshot, story, manifest, opts, p) {
|
|
|
93
96
|
const status = toDiffStatus(baselineStatus);
|
|
94
97
|
const base = {
|
|
95
98
|
storyId: story.storyId,
|
|
99
|
+
...variantOf(story),
|
|
96
100
|
status,
|
|
97
101
|
mismatchPixels: 0,
|
|
98
102
|
mismatchPercent: 0,
|
|
@@ -193,6 +197,17 @@ async function tryStructural(opts, story, snapshot, pixels, p) {
|
|
|
193
197
|
return undefined;
|
|
194
198
|
}
|
|
195
199
|
}
|
|
200
|
+
/** The grouping fields a report needs, present only on a variant capture so
|
|
201
|
+
* a default capture's result serializes exactly as it did before variants. */
|
|
202
|
+
function variantOf(story) {
|
|
203
|
+
return story.variant !== undefined && story.baseStoryId !== undefined
|
|
204
|
+
? {
|
|
205
|
+
baseStoryId: story.baseStoryId,
|
|
206
|
+
variant: story.variant,
|
|
207
|
+
variantParams: story.variantParams ?? {},
|
|
208
|
+
}
|
|
209
|
+
: {};
|
|
210
|
+
}
|
|
196
211
|
function tally(results) {
|
|
197
212
|
const summary = {
|
|
198
213
|
pass: 0,
|
package/dist/run/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run/run.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,2EAA2E;AAC3E,qEAAqE;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,UAAU,EAEV,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAe,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAa,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run/run.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -27,12 +27,41 @@ export interface StoryParams {
|
|
|
27
27
|
* stories whose play function or delay makes a keystroke-triggered capture
|
|
28
28
|
* cost more than it returns. Default true. */
|
|
29
29
|
liveCapture?: boolean;
|
|
30
|
+
/** Named capture variants of this story: each is captured, judged and
|
|
31
|
+
* approved on its own under the key `${storyId}__${name}`. `false` opts
|
|
32
|
+
* this story out of a project-wide variant of that name. */
|
|
33
|
+
variants?: Record<string, VariantSpec | false>;
|
|
34
|
+
/** Set on a variant's resolved params; a variant-only field. The default
|
|
35
|
+
* capture is always light, so a story's own `colorScheme` is ignored. */
|
|
36
|
+
colorScheme?: ColorScheme;
|
|
37
|
+
}
|
|
38
|
+
export type ColorScheme = 'light' | 'dark';
|
|
39
|
+
/** One named variant: any per-story option, plus a color scheme and the name
|
|
40
|
+
* of another variant to start from. `skip` is not a field; set the variant to
|
|
41
|
+
* `false` to drop it. */
|
|
42
|
+
export interface VariantSpec extends Omit<StoryParams, 'skip' | 'variants' | 'liveCapture'> {
|
|
43
|
+
colorScheme?: ColorScheme;
|
|
44
|
+
/** Another variant (of this story or the project) whose fields this one
|
|
45
|
+
* starts from. Chains resolve; a cycle or unknown name is a config error. */
|
|
46
|
+
extends?: string;
|
|
30
47
|
}
|
|
31
48
|
export type { Viewport } from './browser/types.js';
|
|
32
49
|
/** One capturable story, normalised across platforms. */
|
|
33
50
|
export interface StoryManifest {
|
|
34
|
-
/** Stable, URL-safe.
|
|
51
|
+
/** Stable, URL-safe. The capture key: the platform-native id (Storybook's
|
|
52
|
+
* `id`, Ladle's key) for a default capture, `${baseStoryId}__${variant}`
|
|
53
|
+
* for a variant. Everything keyed by story (manifest, baselines, run
|
|
54
|
+
* images, report.json) uses this. */
|
|
35
55
|
storyId: string;
|
|
56
|
+
/** Set on variant entries: the platform's own id, which every platform call
|
|
57
|
+
* receives. Absent on a default capture, where it equals `storyId`. */
|
|
58
|
+
baseStoryId?: string;
|
|
59
|
+
/** Set on variant entries: the variant's name. */
|
|
60
|
+
variant?: string;
|
|
61
|
+
/** Set on variant entries: the fields the variant and its `extends` chain
|
|
62
|
+
* set, already merged into `params`. Kept apart because live params merge
|
|
63
|
+
* under them — a variant's viewport must beat the story's own. */
|
|
64
|
+
variantParams?: Omit<VariantSpec, 'extends'>;
|
|
36
65
|
/** Group/kind, e.g. "Components/Button". */
|
|
37
66
|
title: string;
|
|
38
67
|
/** Story name within the group, e.g. "Primary". */
|
|
@@ -44,6 +73,9 @@ export interface StoryManifest {
|
|
|
44
73
|
}
|
|
45
74
|
export interface Snapshot {
|
|
46
75
|
storyId: string;
|
|
76
|
+
/** Copied from the StoryManifest: set only on a variant capture. */
|
|
77
|
+
baseStoryId?: string;
|
|
78
|
+
variant?: string;
|
|
47
79
|
/** WebP-encoded. PNG is an intermediate, never stored. */
|
|
48
80
|
image: Buffer;
|
|
49
81
|
viewport: Viewport;
|
|
@@ -222,7 +254,15 @@ export interface StructuralVerdict {
|
|
|
222
254
|
}
|
|
223
255
|
export type DiffStatus = 'pass' | 'fail' | 'new' | 'stale' | 'skip';
|
|
224
256
|
export interface DiffResult {
|
|
257
|
+
/** The capture key. */
|
|
225
258
|
storyId: string;
|
|
259
|
+
/** Set only on a variant capture, so reports can group without parsing keys. */
|
|
260
|
+
baseStoryId?: string;
|
|
261
|
+
variant?: string;
|
|
262
|
+
/** Set only on a variant capture: what the variant sets (its resolved
|
|
263
|
+
* `extends` chain). Recorded for the same reason as `viewport` — a handoff
|
|
264
|
+
* can say the conditions it was captured under without re-enumerating. */
|
|
265
|
+
variantParams?: Omit<VariantSpec, 'extends'>;
|
|
226
266
|
status: DiffStatus;
|
|
227
267
|
mismatchPixels: number;
|
|
228
268
|
mismatchPercent: number;
|
|
@@ -313,6 +353,8 @@ export interface UrlEntry {
|
|
|
313
353
|
/** Absolute, or relative to --origin. */
|
|
314
354
|
url: string;
|
|
315
355
|
params?: StoryParams;
|
|
356
|
+
/** Same as `params.variants`; the two are merged, and these win. */
|
|
357
|
+
variants?: Record<string, VariantSpec | false>;
|
|
316
358
|
}
|
|
317
359
|
/** Project config, from juxtapose.config.{ts,js,json} or package.json#juxtapose. */
|
|
318
360
|
export interface ProjectConfig {
|
|
@@ -335,6 +377,10 @@ export interface ProjectConfig {
|
|
|
335
377
|
viewport?: Viewport;
|
|
336
378
|
threshold?: number;
|
|
337
379
|
minDiffPercent?: number;
|
|
380
|
+
/** Variants every story gets, by name. A story's own variant of the same
|
|
381
|
+
* name wins; a story sets one to `false` to opt out. Applies to every
|
|
382
|
+
* platform, the urls list included. */
|
|
383
|
+
variants?: Record<string, VariantSpec | false>;
|
|
338
384
|
storage?: StorageConfig;
|
|
339
385
|
/** `jux mcp` settings. */
|
|
340
386
|
mcp?: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juxtapose/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Platform-agnostic capture, diff, baseline and analysis core for juxtapose.",
|
|
6
6
|
"keywords": [
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"dist"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"devtools-protocol": "0.0.1653615",
|
|
33
34
|
"pixelmatch": "^6.0.0",
|
|
34
35
|
"sharp": "^0.35.3"
|
|
35
36
|
},
|