@juxtapose/core 0.9.0 → 0.11.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 +3 -1
- package/dist/agent/handoff.js +17 -0
- package/dist/agent/handoff.js.map +1 -1
- package/dist/browser/page.d.ts +20 -4
- package/dist/browser/page.js +15 -6
- package/dist/browser/page.js.map +1 -1
- package/dist/capture/capture.d.ts +7 -0
- package/dist/capture/capture.js +60 -9
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/config-errors.d.ts +10 -0
- package/dist/capture/config-errors.js +20 -0
- package/dist/capture/config-errors.js.map +1 -0
- package/dist/capture/idle.d.ts +88 -0
- package/dist/capture/idle.js +558 -0
- package/dist/capture/idle.js.map +1 -0
- package/dist/capture/network-policy.d.ts +21 -0
- package/dist/capture/network-policy.js +114 -0
- package/dist/capture/network-policy.js.map +1 -0
- package/dist/capture/pool.d.ts +6 -0
- package/dist/capture/pool.js +1 -0
- package/dist/capture/pool.js.map +1 -1
- package/dist/capture/settle-options.d.ts +80 -0
- package/dist/capture/settle-options.js +236 -0
- package/dist/capture/settle-options.js.map +1 -0
- package/dist/capture/settle.d.ts +60 -18
- package/dist/capture/settle.js +157 -100
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/snap.d.ts +3 -0
- package/dist/capture/snap.js +7 -1
- package/dist/capture/snap.js.map +1 -1
- package/dist/capture/variants.d.ts +1 -4
- package/dist/capture/variants.js +25 -10
- package/dist/capture/variants.js.map +1 -1
- package/dist/diff/structural.d.ts +4 -1
- package/dist/diff/structural.js +3 -0
- package/dist/diff/structural.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/run/run.d.ts +4 -0
- package/dist/run/run.js +20 -1
- package/dist/run/run.js.map +1 -1
- package/dist/types.d.ts +77 -1
- package/package.json +1 -1
package/dist/capture/settle.js
CHANGED
|
@@ -2,106 +2,13 @@
|
|
|
2
2
|
// (Platform.settle) has resolved. Everything here applies to any DOM, which is
|
|
3
3
|
// why it lives in core rather than in an adapter.
|
|
4
4
|
//
|
|
5
|
-
// The
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/** Hard cap on waiting for quiescence. A story that never goes idle — a
|
|
13
|
-
* spinner that survived the CSS freeze, a polling widget — still gets
|
|
14
|
-
* captured rather than hanging the run. Kept tight: this cost is paid on
|
|
15
|
-
* every such story, times the whole suite. */
|
|
16
|
-
export const DOM_IDLE_TIMEOUT_MS = 500;
|
|
17
|
-
/**
|
|
18
|
-
* Installed via evaluate before each story render. Resolves `window.__juxWait`
|
|
19
|
-
* once the DOM has been mutation-free for `idleMs`, or `timeoutMs` elapses.
|
|
20
|
-
*
|
|
21
|
-
* Counts in-flight fetches too: a story that fires a request on mount would
|
|
22
|
-
* otherwise report "idle" in the gap between mount and response, and we'd
|
|
23
|
-
* screenshot the loading state — intermittently.
|
|
24
|
-
*/
|
|
25
|
-
const SETTLE_SCRIPT = `
|
|
26
|
-
var done = false;
|
|
27
|
-
window.__juxWait = new Promise(function (resolve) {
|
|
28
|
-
var pending = 0;
|
|
29
|
-
var idleTimer = null;
|
|
30
|
-
|
|
31
|
-
function finish() {
|
|
32
|
-
if (done) return;
|
|
33
|
-
done = true;
|
|
34
|
-
observer.disconnect();
|
|
35
|
-
clearTimeout(idleTimer);
|
|
36
|
-
clearTimeout(capTimer);
|
|
37
|
-
if (window.__juxFetchOrig) {
|
|
38
|
-
window.fetch = window.__juxFetchOrig;
|
|
39
|
-
delete window.__juxFetchOrig;
|
|
40
|
-
}
|
|
41
|
-
resolve();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
var capTimer = setTimeout(finish, timeoutMs);
|
|
45
|
-
|
|
46
|
-
function scheduleIdle() {
|
|
47
|
-
clearTimeout(idleTimer);
|
|
48
|
-
if (pending === 0) idleTimer = setTimeout(finish, idleMs);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (!window.__juxFetchOrig) {
|
|
52
|
-
window.__juxFetchOrig = window.fetch;
|
|
53
|
-
window.fetch = function () {
|
|
54
|
-
pending++;
|
|
55
|
-
clearTimeout(idleTimer);
|
|
56
|
-
return window.__juxFetchOrig.apply(this, arguments).finally(function () {
|
|
57
|
-
pending--;
|
|
58
|
-
scheduleIdle();
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
var observer = new MutationObserver(scheduleIdle);
|
|
64
|
-
observer.observe(document.documentElement, {
|
|
65
|
-
childList: true, subtree: true, attributes: true, characterData: true,
|
|
66
|
-
});
|
|
67
|
-
scheduleIdle();
|
|
68
|
-
});
|
|
69
|
-
`;
|
|
70
|
-
/** Arm the quiescence observer. Call before triggering a story render. */
|
|
71
|
-
export async function armSettle(page) {
|
|
72
|
-
await page
|
|
73
|
-
.evaluate(`(function (idleMs, timeoutMs) { ${SETTLE_SCRIPT} })(${DOM_IDLE_MS}, ${DOM_IDLE_TIMEOUT_MS})`)
|
|
74
|
-
.catch(() => { });
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Await quiescence, webfonts and image decode in a single round trip.
|
|
78
|
-
*
|
|
79
|
-
* Deliberately one `evaluate` rather than three. At ~1.2s per story and 8
|
|
80
|
-
* parallel pages, CDP round-trips are a measurable share of wall clock; the
|
|
81
|
-
* original tool cut per-story time meaningfully by collapsing these.
|
|
82
|
-
*/
|
|
83
|
-
export async function drain(page) {
|
|
84
|
-
// The window cast inside is a cast, not a global Window augmentation: the
|
|
85
|
-
// callback runs in the page, and declaring the hook globally would leak it
|
|
86
|
-
// into core's public types. (Comments stay out here: TypeScript keeps them
|
|
87
|
-
// in the callback's source, which is what the page evaluates.)
|
|
88
|
-
await page
|
|
89
|
-
.evaluate(async () => {
|
|
90
|
-
const w = window;
|
|
91
|
-
await (w.__juxWait ?? Promise.resolve());
|
|
92
|
-
// Webfonts: a story captured mid-swap diffs against one captured after,
|
|
93
|
-
// for every glyph on the page.
|
|
94
|
-
await document.fonts?.ready?.catch?.(() => { });
|
|
95
|
-
// Decode, not just load — an undecoded image can still paint late.
|
|
96
|
-
await Promise.all(Array.from(document.images).map((img) => img.complete
|
|
97
|
-
? Promise.resolve()
|
|
98
|
-
: new Promise((r) => {
|
|
99
|
-
img.addEventListener('load', () => r(), { once: true });
|
|
100
|
-
img.addEventListener('error', () => r(), { once: true });
|
|
101
|
-
})));
|
|
102
|
-
})
|
|
103
|
-
.catch(() => { });
|
|
104
|
-
}
|
|
5
|
+
// The order, in captureStory:
|
|
6
|
+
// freeze animations → platform render signal → waitForSelector →
|
|
7
|
+
// event-driven idle wait (idle.ts) → delay → paint barrier → recheck
|
|
8
|
+
//
|
|
9
|
+
// The idle wait replaced a 150 ms DOM-quiet window plus a `drain` that awaited
|
|
10
|
+
// fonts and every incomplete image with no cap; see idle.ts for what was
|
|
11
|
+
// measured and why.
|
|
105
12
|
/**
|
|
106
13
|
* Zero out animations and transitions.
|
|
107
14
|
*
|
|
@@ -127,6 +34,156 @@ export async function waitForSelector(page, selector, timeoutMs) {
|
|
|
127
34
|
// configuration error and throws synchronously from the page before the wait.
|
|
128
35
|
await page.waitForSelector(selector, { timeout: timeoutMs }).catch(() => { });
|
|
129
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Drop and rebuild every `will-change` compositor layer, so each is rastered
|
|
39
|
+
* once, from the page as it stands now.
|
|
40
|
+
*
|
|
41
|
+
* Chrome picks a layer's raster translation (the subpixel offset its content
|
|
42
|
+
* is rasterized at) when it first rasterizes the layer, and keeps it on a
|
|
43
|
+
* `will-change: transform` layer so a moving transform never re-rasters. When
|
|
44
|
+
* the transform changes after that first raster (an animation that ran a
|
|
45
|
+
* frame before the freeze, or a `translateX(-100%)` whose width grew when a
|
|
46
|
+
* font loaded) the layer keeps the old offset, and its glyph antialiasing
|
|
47
|
+
* records the page's history instead of its final state. That history is
|
|
48
|
+
* timing: one Chakra marquee captured 3 different hashes depending on run
|
|
49
|
+
* context (issue #136), with the same frozen transform in all of them.
|
|
50
|
+
*
|
|
51
|
+
* A frame with `will-change: auto` composites the element into its parent;
|
|
52
|
+
* removing the override makes a new layer, rastered at its current
|
|
53
|
+
* transform. Measured on a translateX marquee fixture through snapPages, 40
|
|
54
|
+
* captures per arm: animated 39/40 and load-delayed 40/40 differed from the
|
|
55
|
+
* same page with a static transform; with this, 0/80. On the Chakra story
|
|
56
|
+
* the three contexts now capture one hash, the same one a page frozen from
|
|
57
|
+
* its first frame and then rebuilt this way gives. A device-scale round trip
|
|
58
|
+
* and `--disable-threaded-animation` leave the stale raster; freezing
|
|
59
|
+
* animations from the first frame (an init script) fixes the fixture but not
|
|
60
|
+
* Chakra, whose marquee widens when its font loads.
|
|
61
|
+
*
|
|
62
|
+
* Only the elements whose computed `will-change` is not `auto` are touched,
|
|
63
|
+
* through an inline `!important` declaration, in the document and in every
|
|
64
|
+
* open shadow root. The first version adopted a `* { will-change: auto
|
|
65
|
+
* !important }` sheet instead, and that went wrong in four measured ways:
|
|
66
|
+
* - `will-change: transform` (or filter, perspective) gives an element a
|
|
67
|
+
* containing block for fixed descendants and a stacking context. Dropping
|
|
68
|
+
* it moved those descendants to the viewport for two frames, so a latching
|
|
69
|
+
* IntersectionObserver captured "seen" 6/6, a ResizeObserver reacting
|
|
70
|
+
* through a 30 ms timer captured the wrong layout 3-4/6, and every such
|
|
71
|
+
* page took the recheck. Where the computed transform, translate and
|
|
72
|
+
* filter are all `none`, the element also gets `translate: 0px
|
|
73
|
+
* !important` for the two frames: an identity 2D transform, with no layer
|
|
74
|
+
* of its own and the same containing block. 0/6 after, and no recheck.
|
|
75
|
+
* - An adopted sheet does not reach shadow roots: a marquee in one stayed
|
|
76
|
+
* stale 4/4. 0/4 after.
|
|
77
|
+
* - An inline `will-change: transform !important` beats an author
|
|
78
|
+
* `!important` sheet: stale 4/4. 0/4 after.
|
|
79
|
+
* - Adopting any `*` sheet forces a whole-document style recalc, which by
|
|
80
|
+
* itself re-rastered a frozen fill-forwards transform animation with no
|
|
81
|
+
* will-change (Chakra button--custom-spinner) to a hash a static page
|
|
82
|
+
* never gives. Touching only will-change elements leaves those alone.
|
|
83
|
+
* The writes run through `__juxIdle.untracked` (idle.ts), so the mutation
|
|
84
|
+
* counter, and with it the recheck in captureStory, never sees them. Each
|
|
85
|
+
* declaration is put back as it was, in the second frame or on timeout.
|
|
86
|
+
* A page with no will-change element, most stories, skips the two frames:
|
|
87
|
+
* 16-18 ms became the scan, 0.7 / 1.9 / 6.9 ms on 200 / 2k / 10k elements.
|
|
88
|
+
*
|
|
89
|
+
* Scope: this rebuilds `will-change: transform` layers. A layer promoted
|
|
90
|
+
* another way (`translateZ(0)`, `translate3d`, `backdrop-filter`) or by
|
|
91
|
+
* `will-change: opacity` or `filter` keeps its first raster: stale 3-4/4 when
|
|
92
|
+
* it grows after that raster, before and after this. Will-change on a
|
|
93
|
+
* pseudo-element is not reached either, since it takes no inline style.
|
|
94
|
+
* Those need a different mechanism than a style toggle (see #145).
|
|
95
|
+
*/
|
|
96
|
+
export async function rerasterLayers(page, timeoutMs = 1000) {
|
|
97
|
+
await page
|
|
98
|
+
.evaluate((cap) => new Promise((resolve) => {
|
|
99
|
+
// will-change values that give the element a containing block for
|
|
100
|
+
// fixed descendants, as a transform or filter would.
|
|
101
|
+
const CB = /transform|translate|rotate|scale|filter|perspective/;
|
|
102
|
+
const hits = [];
|
|
103
|
+
const visit = (root) => {
|
|
104
|
+
const els = root.querySelectorAll('*');
|
|
105
|
+
for (let i = 0; i < els.length; i++) {
|
|
106
|
+
const el = els[i];
|
|
107
|
+
const cs = getComputedStyle(el);
|
|
108
|
+
if (cs.willChange !== 'auto' && el.style) {
|
|
109
|
+
hits.push([
|
|
110
|
+
el,
|
|
111
|
+
CB.test(cs.willChange) &&
|
|
112
|
+
cs.transform === 'none' &&
|
|
113
|
+
cs.translate === 'none' &&
|
|
114
|
+
cs.filter === 'none',
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
if (el.shadowRoot)
|
|
118
|
+
visit(el.shadowRoot);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
visit(document);
|
|
122
|
+
if (hits.length === 0) {
|
|
123
|
+
resolve();
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const idle = window.__juxIdle;
|
|
127
|
+
const quiet = (fn) => (idle?.untracked ? idle.untracked(fn) : fn());
|
|
128
|
+
const saved = [];
|
|
129
|
+
quiet(() => {
|
|
130
|
+
for (const [el, keepCb] of hits) {
|
|
131
|
+
const s = el.style;
|
|
132
|
+
const props = [];
|
|
133
|
+
const set = (prop, value) => {
|
|
134
|
+
props.push([prop, s.getPropertyValue(prop), s.getPropertyPriority(prop)]);
|
|
135
|
+
s.setProperty(prop, value, 'important');
|
|
136
|
+
};
|
|
137
|
+
const attr = el.getAttribute('style');
|
|
138
|
+
const css = s.cssText;
|
|
139
|
+
set('will-change', 'auto');
|
|
140
|
+
if (keepCb)
|
|
141
|
+
set('translate', '0px');
|
|
142
|
+
saved.push({ el, attr, css, props });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
// Per declaration, so a page that wrote other inline styles in these
|
|
146
|
+
// two frames keeps its writes; the attribute text itself too when
|
|
147
|
+
// nothing else changed.
|
|
148
|
+
let restored = false;
|
|
149
|
+
const restore = () => {
|
|
150
|
+
if (restored)
|
|
151
|
+
return;
|
|
152
|
+
restored = true;
|
|
153
|
+
quiet(() => {
|
|
154
|
+
for (const { el, attr, css, props } of saved) {
|
|
155
|
+
for (const [prop, value, priority] of props) {
|
|
156
|
+
if (value)
|
|
157
|
+
el.style.setProperty(prop, value, priority);
|
|
158
|
+
else
|
|
159
|
+
el.style.removeProperty(prop);
|
|
160
|
+
}
|
|
161
|
+
if (el.style.cssText !== css)
|
|
162
|
+
continue;
|
|
163
|
+
// Read first: Chrome serializes a CSSOM-edited style attribute
|
|
164
|
+
// lazily, and without this read removeAttribute was undone by
|
|
165
|
+
// the next read, leaving style="".
|
|
166
|
+
el.getAttribute('style');
|
|
167
|
+
if (attr === null)
|
|
168
|
+
el.removeAttribute('style');
|
|
169
|
+
else
|
|
170
|
+
el.setAttribute('style', attr);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const timer = setTimeout(() => {
|
|
175
|
+
restore();
|
|
176
|
+
resolve();
|
|
177
|
+
}, cap);
|
|
178
|
+
// Two frames: the second is committed without the layers.
|
|
179
|
+
requestAnimationFrame(() => requestAnimationFrame(() => {
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
restore();
|
|
182
|
+
resolve();
|
|
183
|
+
}));
|
|
184
|
+
}), timeoutMs)
|
|
185
|
+
.catch(() => { });
|
|
186
|
+
}
|
|
130
187
|
/**
|
|
131
188
|
* Block until the compositor has actually presented a frame.
|
|
132
189
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,kDAAkD;AAClD,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"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"}
|
package/dist/capture/snap.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Browser } from '../browser/browser.js';
|
|
2
2
|
import type { CaptureEnv, Snapshot, StoryParams, Viewport } from '../types.js';
|
|
3
|
+
import type { SettleLayer } from './settle-options.js';
|
|
3
4
|
export interface SnapOptions {
|
|
4
5
|
url: string;
|
|
5
6
|
viewport?: Viewport;
|
|
@@ -17,6 +18,8 @@ export interface SnapPagesOptions {
|
|
|
17
18
|
urls: string[];
|
|
18
19
|
viewport?: Viewport;
|
|
19
20
|
params?: StoryParams;
|
|
21
|
+
/** The project config's settle options, below `params`. */
|
|
22
|
+
projectSettle?: SettleLayer;
|
|
20
23
|
/** Acquired by the caller (acquireBrowser); not closed here. */
|
|
21
24
|
browser: Browser;
|
|
22
25
|
}
|
package/dist/capture/snap.js
CHANGED
|
@@ -34,7 +34,13 @@ export async function snapPages(opts) {
|
|
|
34
34
|
try {
|
|
35
35
|
// A url platform enumerates exactly the one entry it was given.
|
|
36
36
|
const [story] = await platform.enumerate({ projectRoot: process.cwd() });
|
|
37
|
-
const snapshot = await captureStory(page, story, {
|
|
37
|
+
const snapshot = await captureStory(page, story, {
|
|
38
|
+
platform,
|
|
39
|
+
baseUrl: url,
|
|
40
|
+
...(opts.projectSettle
|
|
41
|
+
? { settleLayers: { project: opts.projectSettle } }
|
|
42
|
+
: {}),
|
|
43
|
+
}, viewport);
|
|
38
44
|
if (!snapshot)
|
|
39
45
|
throw new Error('page declared skip');
|
|
40
46
|
pages.push({ url, snapshot, status });
|
package/dist/capture/snap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snap.js","sourceRoot":"","sources":["../../src/capture/snap.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,6EAA6E;AAC7E,0DAA0D;AAK1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"snap.js","sourceRoot":"","sources":["../../src/capture/snap.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,7 @@ import type { StoryManifest, StoryParams, VariantSpec } from '../types.js';
|
|
|
2
2
|
/** Underscores are excluded so the `__` key separator can't occur in a name. */
|
|
3
3
|
export declare const VARIANT_NAME: RegExp;
|
|
4
4
|
export declare const VARIANT_SEPARATOR = "__";
|
|
5
|
-
|
|
6
|
-
export declare class VariantConfigError extends Error {
|
|
7
|
-
constructor(message: string);
|
|
8
|
-
}
|
|
5
|
+
export { VariantConfigError } from './config-errors.js';
|
|
9
6
|
export declare const captureKey: (baseStoryId: string, variant: string) => string;
|
|
10
7
|
/** The id every platform call receives: the platform's own, never the key. */
|
|
11
8
|
export declare const platformStoryId: (story: {
|
package/dist/capture/variants.js
CHANGED
|
@@ -6,17 +6,14 @@
|
|
|
6
6
|
// it does not care where a story's `variants` came from (index, meta.json, a
|
|
7
7
|
// url entry, or a preview extract), so a platform can change how it discovers
|
|
8
8
|
// them without touching this.
|
|
9
|
+
import { checkNetwork } from './network-policy.js';
|
|
9
10
|
import { compareCodeUnits } from '../diff/structural/deltas.js';
|
|
11
|
+
import { VariantConfigError } from './config-errors.js';
|
|
12
|
+
import { checkSettle, mergeSettle } from './settle-options.js';
|
|
10
13
|
/** Underscores are excluded so the `__` key separator can't occur in a name. */
|
|
11
14
|
export const VARIANT_NAME = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
12
15
|
export const VARIANT_SEPARATOR = '__';
|
|
13
|
-
|
|
14
|
-
export class VariantConfigError extends Error {
|
|
15
|
-
constructor(message) {
|
|
16
|
-
super(`jux: ${message}`);
|
|
17
|
-
this.name = 'VariantConfigError';
|
|
18
|
-
}
|
|
19
|
-
}
|
|
16
|
+
export { VariantConfigError } from './config-errors.js';
|
|
20
17
|
export const captureKey = (baseStoryId, variant) => `${baseStoryId}${VARIANT_SEPARATOR}${variant}`;
|
|
21
18
|
/** The id every platform call receives: the platform's own, never the key. */
|
|
22
19
|
export const platformStoryId = (story) => story.baseStoryId ?? story.storyId;
|
|
@@ -35,6 +32,8 @@ export function expandVariants(stories, projectVariants) {
|
|
|
35
32
|
// `variants` is a declaration, not a capture setting, and `colorScheme`
|
|
36
33
|
// is variant-only: the default capture is always light.
|
|
37
34
|
const { variants: ownRaw, colorScheme: _ignored, ...baseParams } = story.params;
|
|
35
|
+
checkSettle(baseParams.settle, `story '${story.storyId}'`);
|
|
36
|
+
checkNetwork(baseParams.network, `story '${story.storyId}'`);
|
|
38
37
|
out.push({ ...story, params: baseParams });
|
|
39
38
|
// A skipped story skips every variant: there is nothing to vary.
|
|
40
39
|
if (baseParams.skip === true)
|
|
@@ -61,7 +60,7 @@ export function expandVariants(stories, projectVariants) {
|
|
|
61
60
|
variant: name,
|
|
62
61
|
variantParams: layer,
|
|
63
62
|
// Base params, then the extends chain, then the variant itself.
|
|
64
|
-
params: { ...baseParams, ...layer },
|
|
63
|
+
params: withSettle({ ...baseParams, ...layer }, baseParams.settle, layer.settle),
|
|
65
64
|
});
|
|
66
65
|
}
|
|
67
66
|
}
|
|
@@ -102,6 +101,8 @@ function checkDeclared(raw, where) {
|
|
|
102
101
|
if (scheme !== undefined && scheme !== 'light' && scheme !== 'dark') {
|
|
103
102
|
throw new VariantConfigError(`${where}: variant '${name}' colorScheme must be 'light' or 'dark'`);
|
|
104
103
|
}
|
|
104
|
+
checkSettle(spec['settle'], `${where}: variant '${name}'`);
|
|
105
|
+
checkNetwork(spec['network'], `${where}: variant '${name}'`);
|
|
105
106
|
const ext = spec['extends'];
|
|
106
107
|
if (ext !== undefined && typeof ext !== 'string') {
|
|
107
108
|
throw new VariantConfigError(`${where}: variant '${name}' extends must be a variant name`);
|
|
@@ -129,11 +130,22 @@ function resolveChain(storyId, name, merged) {
|
|
|
129
130
|
cur = spec.extends;
|
|
130
131
|
}
|
|
131
132
|
const layer = {};
|
|
132
|
-
for (const spec of chain)
|
|
133
|
+
for (const spec of chain) {
|
|
134
|
+
const settle = mergeSettle(layer.settle, spec.settle);
|
|
133
135
|
Object.assign(layer, spec);
|
|
136
|
+
if (settle)
|
|
137
|
+
layer.settle = settle;
|
|
138
|
+
}
|
|
134
139
|
delete layer.extends;
|
|
135
140
|
return layer;
|
|
136
141
|
}
|
|
142
|
+
/** `params` with `settle` merged field by field rather than replaced, so a
|
|
143
|
+
* variant's `settle.timeout` keeps the story's `settle.network`. Untouched
|
|
144
|
+
* (no `settle` key) when neither side sets one. */
|
|
145
|
+
function withSettle(params, under, over) {
|
|
146
|
+
const settle = mergeSettle(under, over);
|
|
147
|
+
return settle ? { ...params, settle } : params;
|
|
148
|
+
}
|
|
137
149
|
/**
|
|
138
150
|
* Merge live params (read from the rendered preview) for one capture.
|
|
139
151
|
*
|
|
@@ -149,7 +161,10 @@ export function mergeLiveParams(story, live) {
|
|
|
149
161
|
return params;
|
|
150
162
|
const { variants: _v, colorScheme: _c, ...settings } = live;
|
|
151
163
|
Object.assign(params, settings, story.variantParams ?? {});
|
|
152
|
-
|
|
164
|
+
const variantSettle = story.variantParams?.settle;
|
|
165
|
+
return variantSettle
|
|
166
|
+
? withSettle(params, settings.settle ?? story.params.settle, variantSettle)
|
|
167
|
+
: params;
|
|
153
168
|
}
|
|
154
169
|
/**
|
|
155
170
|
* Pick items by story id: a base id selects the story and every variant of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/capture/variants.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,2EAA2E;AAC3E,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,8BAA8B;AAE9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/capture/variants.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DiffOutput } from './diff.js';
|
|
2
|
-
import type { Cause, ChangedRegion, StructureSnapshot, StructuralVerdict } from '../types.js';
|
|
2
|
+
import type { CaptureFlag, Cause, ChangedRegion, StructureSnapshot, StructuralVerdict } from '../types.js';
|
|
3
3
|
export interface StructuralDiffInput {
|
|
4
4
|
baseline?: StructureSnapshot;
|
|
5
5
|
current?: StructureSnapshot;
|
|
@@ -16,6 +16,9 @@ export interface StructuralDiffInput {
|
|
|
16
16
|
};
|
|
17
17
|
/** From `jux run --since`; `jux diff` has no changed-file set. */
|
|
18
18
|
cause?: Cause;
|
|
19
|
+
/** The current capture's settle flag, if any (`settle-timeout`,
|
|
20
|
+
* `settle-fallback`): appended to the verdict's flags. */
|
|
21
|
+
settleFlag?: CaptureFlag;
|
|
19
22
|
}
|
|
20
23
|
export declare const MAX_DELTAS = 20;
|
|
21
24
|
/** JSON.stringify(verdict).length never exceeds this. */
|
package/dist/diff/structural.js
CHANGED
|
@@ -55,6 +55,9 @@ export function structuralDiffWithCoverage(input) {
|
|
|
55
55
|
};
|
|
56
56
|
const { classification, styleTags } = classify(ctx);
|
|
57
57
|
const flags = computeFlags(ctx);
|
|
58
|
+
// Last, so the flags computeFlags orders keep their positions.
|
|
59
|
+
if (input.settleFlag)
|
|
60
|
+
flags.push(input.settleFlag);
|
|
58
61
|
const deltas = facts.slice(0, MAX_DELTAS).map((f) => f.delta);
|
|
59
62
|
const summary = buildSummary({
|
|
60
63
|
classification,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/diff/structural.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,8FAA8F;AAC9F,4EAA4E;AAC5E,wEAAwE;AACxE,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/diff/structural.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export type { StoryParams, VariantSpec, ColorScheme, Viewport, StoryManifest, Snapshot, StructureSnapshot, StructureElement, StructureRect, CaptureEnv, ChangedRegion, Delta, Classification, StyleTag, Flag, StructuralVerdict, Cause, CauseKind, DiffStatus, DiffResult, RunReport, RunGroup, ApprovalMeta, BaselineEntry, BaselineManifest, ProjectConfig, UrlEntry, StorageConfig, BaselineStore, } from './types.js';
|
|
1
|
+
export type { StoryParams, VariantSpec, ColorScheme, Viewport, StoryManifest, Snapshot, StructureSnapshot, StructureElement, StructureRect, CaptureEnv, ChangedRegion, Delta, Classification, StyleTag, Flag, StructuralVerdict, Cause, CauseKind, DiffStatus, DiffResult, RunReport, RunGroup, ApprovalMeta, BaselineEntry, BaselineManifest, ProjectConfig, UrlEntry, StorageConfig, BaselineStore, SettleParams, NetworkParams, SettleReport, CaptureFlag, } from './types.js';
|
|
2
2
|
export type { Platform, EnumerateTarget, SettleContext } from './platform.js';
|
|
3
3
|
export { navigateToStory } from './url-platform.js';
|
|
4
4
|
export { createUrlPlatform } from './platforms/urls.js';
|
|
5
5
|
export { waitForSelector } from './capture/settle.js';
|
|
6
6
|
export { expandVariants, selectByStoryId, captureKey, platformStoryId, VariantConfigError, VARIANT_NAME, } from './capture/variants.js';
|
|
7
|
+
export { checkSettle, checkPatterns, checkProjectSettle, isSettleTimeout, settleFlag, SettleConfigError, DEFAULT_SETTLE_TIMEOUT_MS, MAX_SETTLE_TIMEOUT_MS, DEFAULT_NETWORK_IGNORE, type SettleLayer, } from './capture/settle-options.js';
|
|
8
|
+
export { checkNetwork } from './capture/network-policy.js';
|
|
7
9
|
export { discoverParams, prepareCaptures, type PrepareOptions, } from './capture/discover.js';
|
|
8
10
|
export { GitBaselineStore, encodeStoryId } from './baseline/git-store.js';
|
|
9
11
|
export { hashImage } from './baseline/status.js';
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,10 @@ export { waitForSelector } from './capture/settle.js';
|
|
|
15
15
|
// Per-story capture variants: expansion after enumeration, and selection by a
|
|
16
16
|
// base id (story + all variants) or a capture key (one capture).
|
|
17
17
|
export { expandVariants, selectByStoryId, captureKey, platformStoryId, VariantConfigError, VARIANT_NAME, } from './capture/variants.js';
|
|
18
|
+
// Settle options: validation and layering shared by the CLI, the MCP server
|
|
19
|
+
// and the review server, so a bad value is reported the same way everywhere.
|
|
20
|
+
export { checkSettle, checkPatterns, checkProjectSettle, isSettleTimeout, settleFlag, SettleConfigError, DEFAULT_SETTLE_TIMEOUT_MS, MAX_SETTLE_TIMEOUT_MS, DEFAULT_NETWORK_IGNORE, } from './capture/settle-options.js';
|
|
21
|
+
export { checkNetwork } from './capture/network-policy.js';
|
|
18
22
|
export { discoverParams, prepareCaptures, } from './capture/discover.js';
|
|
19
23
|
// Implementing a baseline store. `encodeStoryId` matters for anyone building
|
|
20
24
|
// keys from a story id — they are platform-supplied and not path-safe.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,yEAAyE;AACzE,6EAA6E;AAC7E,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,iEAAiE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/run/run.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { BaselineStore, DiffStatus, ProjectConfig, RunReport, StoryManifest
|
|
|
4
4
|
import { type AncestryCheck } from '../baseline/status.js';
|
|
5
5
|
import { type Phases } from './phases.js';
|
|
6
6
|
import type { CauseIndex } from '../analysis/cause.js';
|
|
7
|
+
import { type SettleLayer } from '../capture/settle-options.js';
|
|
7
8
|
export declare const DEFAULT_VIEWPORT: Viewport;
|
|
8
9
|
export interface RunOptions {
|
|
9
10
|
browser: Browser;
|
|
@@ -29,6 +30,9 @@ export interface RunOptions {
|
|
|
29
30
|
phases?: Phases;
|
|
30
31
|
/** From `jux run --since`: consulted only for a story that failed. */
|
|
31
32
|
cause?: CauseIndex;
|
|
33
|
+
/** Per-call settle options (CLI flags, MCP arguments), layered over every
|
|
34
|
+
* story's own. The project's come from `config`. */
|
|
35
|
+
settle?: SettleLayer;
|
|
32
36
|
}
|
|
33
37
|
export interface RunArtifact {
|
|
34
38
|
storyId: string;
|