@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
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// Per-story capture variants (spec 2026-10-13-variants-design.md).
|
|
2
|
+
//
|
|
3
|
+
// A variant is just another capture job: expansion happens once, after the
|
|
4
|
+
// platform enumerates, and everything downstream (pool, shuffle, warm browser,
|
|
5
|
+
// baselines, report) sees one StoryManifest per capture key. Pure on purpose:
|
|
6
|
+
// it does not care where a story's `variants` came from (index, meta.json, a
|
|
7
|
+
// url entry, or a preview extract), so a platform can change how it discovers
|
|
8
|
+
// them without touching this.
|
|
9
|
+
import { compareCodeUnits } from '../diff/structural/deltas.js';
|
|
10
|
+
/** Underscores are excluded so the `__` key separator can't occur in a name. */
|
|
11
|
+
export const VARIANT_NAME = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
12
|
+
export const VARIANT_SEPARATOR = '__';
|
|
13
|
+
/** A bad variant declaration. The CLI reports it and exits 2. */
|
|
14
|
+
export class VariantConfigError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(`jux: ${message}`);
|
|
17
|
+
this.name = 'VariantConfigError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export const captureKey = (baseStoryId, variant) => `${baseStoryId}${VARIANT_SEPARATOR}${variant}`;
|
|
21
|
+
/** The id every platform call receives: the platform's own, never the key. */
|
|
22
|
+
export const platformStoryId = (story) => story.baseStoryId ?? story.storyId;
|
|
23
|
+
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
24
|
+
/**
|
|
25
|
+
* Expand each story into its default capture plus one entry per variant,
|
|
26
|
+
* sorted by capture key in code-unit order.
|
|
27
|
+
*
|
|
28
|
+
* Throws VariantConfigError on a bad name, a malformed spec, an unknown or
|
|
29
|
+
* cyclic `extends`, or two captures that would share a key.
|
|
30
|
+
*/
|
|
31
|
+
export function expandVariants(stories, projectVariants) {
|
|
32
|
+
const project = checkDeclared(projectVariants, 'project config');
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const story of stories) {
|
|
35
|
+
// `variants` is a declaration, not a capture setting, and `colorScheme`
|
|
36
|
+
// is variant-only: the default capture is always light.
|
|
37
|
+
const { variants: ownRaw, colorScheme: _ignored, ...baseParams } = story.params;
|
|
38
|
+
out.push({ ...story, params: baseParams });
|
|
39
|
+
// A skipped story skips every variant: there is nothing to vary.
|
|
40
|
+
if (baseParams.skip === true)
|
|
41
|
+
continue;
|
|
42
|
+
const own = checkDeclared(ownRaw, `story '${story.storyId}'`);
|
|
43
|
+
// Story wins by name; `false` drops the name entirely.
|
|
44
|
+
const merged = new Map();
|
|
45
|
+
for (const [name, spec] of Object.entries(project)) {
|
|
46
|
+
if (spec !== false)
|
|
47
|
+
merged.set(name, spec);
|
|
48
|
+
}
|
|
49
|
+
for (const [name, spec] of Object.entries(own)) {
|
|
50
|
+
if (spec === false)
|
|
51
|
+
merged.delete(name);
|
|
52
|
+
else
|
|
53
|
+
merged.set(name, spec);
|
|
54
|
+
}
|
|
55
|
+
for (const name of [...merged.keys()].sort(compareCodeUnits)) {
|
|
56
|
+
const layer = resolveChain(story.storyId, name, merged);
|
|
57
|
+
out.push({
|
|
58
|
+
...story,
|
|
59
|
+
storyId: captureKey(story.storyId, name),
|
|
60
|
+
baseStoryId: story.storyId,
|
|
61
|
+
variant: name,
|
|
62
|
+
variantParams: layer,
|
|
63
|
+
// Base params, then the extends chain, then the variant itself.
|
|
64
|
+
params: { ...baseParams, ...layer },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
out.sort((a, b) => compareCodeUnits(a.storyId, b.storyId));
|
|
69
|
+
for (let i = 1; i < out.length; i++) {
|
|
70
|
+
const prev = out[i - 1];
|
|
71
|
+
const cur = out[i];
|
|
72
|
+
if (prev.storyId === cur.storyId) {
|
|
73
|
+
throw new VariantConfigError(`capture key '${cur.storyId}' is produced by both ${describe(prev)} and ${describe(cur)}; rename the variant or the story`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
const describe = (s) => s.variant === undefined
|
|
79
|
+
? `story '${s.storyId}'`
|
|
80
|
+
: `story '${s.baseStoryId}' variant '${s.variant}'`;
|
|
81
|
+
/** Validate names and shapes where they are declared, before any merge, so
|
|
82
|
+
* the error names the place the user has to edit. */
|
|
83
|
+
function checkDeclared(raw, where) {
|
|
84
|
+
if (raw === undefined)
|
|
85
|
+
return {};
|
|
86
|
+
if (!isRecord(raw)) {
|
|
87
|
+
throw new VariantConfigError(`${where}: 'variants' must be an object of named variants`);
|
|
88
|
+
}
|
|
89
|
+
for (const [name, spec] of Object.entries(raw)) {
|
|
90
|
+
if (!VARIANT_NAME.test(name)) {
|
|
91
|
+
throw new VariantConfigError(`${where}: variant name '${name}' must match ${VARIANT_NAME.source} (lowercase letters, digits and dashes; no underscores)`);
|
|
92
|
+
}
|
|
93
|
+
if (spec === false)
|
|
94
|
+
continue;
|
|
95
|
+
if (!isRecord(spec)) {
|
|
96
|
+
throw new VariantConfigError(`${where}: variant '${name}' must be an object of capture settings, or false to opt out`);
|
|
97
|
+
}
|
|
98
|
+
if ('skip' in spec) {
|
|
99
|
+
throw new VariantConfigError(`${where}: variant '${name}' sets 'skip'; set the variant to false instead`);
|
|
100
|
+
}
|
|
101
|
+
const scheme = spec['colorScheme'];
|
|
102
|
+
if (scheme !== undefined && scheme !== 'light' && scheme !== 'dark') {
|
|
103
|
+
throw new VariantConfigError(`${where}: variant '${name}' colorScheme must be 'light' or 'dark'`);
|
|
104
|
+
}
|
|
105
|
+
const ext = spec['extends'];
|
|
106
|
+
if (ext !== undefined && typeof ext !== 'string') {
|
|
107
|
+
throw new VariantConfigError(`${where}: variant '${name}' extends must be a variant name`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return raw;
|
|
111
|
+
}
|
|
112
|
+
/** The variant's own layer: its extends chain (farthest ancestor first),
|
|
113
|
+
* then the variant itself, with `extends` removed. */
|
|
114
|
+
function resolveChain(storyId, name, merged) {
|
|
115
|
+
const chain = [];
|
|
116
|
+
const seen = [];
|
|
117
|
+
let cur = name;
|
|
118
|
+
while (cur !== undefined) {
|
|
119
|
+
if (seen.includes(cur)) {
|
|
120
|
+
throw new VariantConfigError(`story '${storyId}' variant '${name}': extends cycle ${[...seen, cur].join(' -> ')}`);
|
|
121
|
+
}
|
|
122
|
+
seen.push(cur);
|
|
123
|
+
const spec = merged.get(cur);
|
|
124
|
+
if (!spec) {
|
|
125
|
+
// Only reachable for an ancestor: `name` itself came from `merged`.
|
|
126
|
+
throw new VariantConfigError(`story '${storyId}' variant '${seen[seen.length - 2]}' extends unknown variant '${cur}'`);
|
|
127
|
+
}
|
|
128
|
+
chain.unshift(spec);
|
|
129
|
+
cur = spec.extends;
|
|
130
|
+
}
|
|
131
|
+
const layer = {};
|
|
132
|
+
for (const spec of chain)
|
|
133
|
+
Object.assign(layer, spec);
|
|
134
|
+
delete layer.extends;
|
|
135
|
+
return layer;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Merge live params (read from the rendered preview) for one capture.
|
|
139
|
+
*
|
|
140
|
+
* Live params override the manifest — the preview is the story's own
|
|
141
|
+
* declaration, the index a lossy projection of it — but they merge UNDER a
|
|
142
|
+
* variant's layer: a story's own live `viewport` must not undo the mobile
|
|
143
|
+
* variant's. `variants` and `colorScheme` in live params are declarations,
|
|
144
|
+
* not settings for this capture, so they are dropped.
|
|
145
|
+
*/
|
|
146
|
+
export function mergeLiveParams(story, live) {
|
|
147
|
+
const params = { ...story.params };
|
|
148
|
+
if (!live)
|
|
149
|
+
return params;
|
|
150
|
+
const { variants: _v, colorScheme: _c, ...settings } = live;
|
|
151
|
+
Object.assign(params, settings, story.variantParams ?? {});
|
|
152
|
+
return params;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Pick items by story id: a base id selects the story and every variant of
|
|
156
|
+
* it, a capture key selects exactly that capture. Ids that match nothing are
|
|
157
|
+
* returned so the caller can report them.
|
|
158
|
+
*/
|
|
159
|
+
export function selectByStoryId(items, ids) {
|
|
160
|
+
const wanted = new Set(ids);
|
|
161
|
+
const hit = new Set();
|
|
162
|
+
const selected = items.filter((s) => {
|
|
163
|
+
if (wanted.has(s.storyId)) {
|
|
164
|
+
hit.add(s.storyId);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
if (s.baseStoryId !== undefined && wanted.has(s.baseStoryId)) {
|
|
168
|
+
hit.add(s.baseStoryId);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
});
|
|
173
|
+
return { selected, unknown: ids.filter((id) => !hit.has(id)) };
|
|
174
|
+
}
|
|
175
|
+
/** Structural equality for JSON-shaped values: key order doesn't matter,
|
|
176
|
+
* array order does. */
|
|
177
|
+
export function deepEqual(a, b) {
|
|
178
|
+
if (a === b)
|
|
179
|
+
return true;
|
|
180
|
+
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
|
|
181
|
+
return false;
|
|
182
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
183
|
+
return false;
|
|
184
|
+
if (Array.isArray(a) && Array.isArray(b))
|
|
185
|
+
return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
|
|
186
|
+
const ra = a;
|
|
187
|
+
const rb = b;
|
|
188
|
+
const ka = Object.keys(ra);
|
|
189
|
+
return (ka.length === Object.keys(rb).length &&
|
|
190
|
+
ka.every((k) => Object.hasOwn(rb, k) && deepEqual(ra[k], rb[k])));
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/capture/variants.ts"],"names":[],"mappings":"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"}
|
package/dist/diff/regions.js
CHANGED
|
@@ -18,6 +18,7 @@ const DEFAULT_GAP = 8;
|
|
|
18
18
|
* replaced. Test for the red marking instead.
|
|
19
19
|
*/
|
|
20
20
|
function isChanged(diff, offset) {
|
|
21
|
+
// The caller walks offsets inside the width * height * 4 RGBA buffer.
|
|
21
22
|
return diff[offset] > 200 && diff[offset + 1] < 100 && diff[offset + 2] < 100;
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
@@ -50,14 +51,16 @@ export function computeChangedRegions(diff, width, height, gap = DEFAULT_GAP) {
|
|
|
50
51
|
const boxes = [];
|
|
51
52
|
for (const span of spans) {
|
|
52
53
|
const touched = [];
|
|
53
|
-
for (
|
|
54
|
-
if (overlaps(span,
|
|
54
|
+
for (const [i, box] of boxes.entries()) {
|
|
55
|
+
if (overlaps(span, box, gap))
|
|
55
56
|
touched.push(i);
|
|
56
57
|
}
|
|
57
58
|
if (touched.length === 0) {
|
|
58
59
|
boxes.push({ x1: span.x1, y1: span.y, x2: span.x2, y2: span.y });
|
|
59
60
|
continue;
|
|
60
61
|
}
|
|
62
|
+
// Every index in touched came from boxes, and splices below run
|
|
63
|
+
// back-to-front, so each still points at a live box.
|
|
61
64
|
const target = boxes[touched[0]];
|
|
62
65
|
target.x1 = Math.min(target.x1, span.x1);
|
|
63
66
|
target.x2 = Math.max(target.x2, span.x2);
|
|
@@ -66,12 +69,13 @@ export function computeChangedRegions(diff, width, height, gap = DEFAULT_GAP) {
|
|
|
66
69
|
// Fold any other boxes this span bridged into the first, back-to-front so
|
|
67
70
|
// the splices don't shift indices we still need.
|
|
68
71
|
for (let i = touched.length - 1; i >= 1; i--) {
|
|
69
|
-
const
|
|
72
|
+
const at = touched[i];
|
|
73
|
+
const other = boxes[at];
|
|
70
74
|
target.x1 = Math.min(target.x1, other.x1);
|
|
71
75
|
target.x2 = Math.max(target.x2, other.x2);
|
|
72
76
|
target.y1 = Math.min(target.y1, other.y1);
|
|
73
77
|
target.y2 = Math.max(target.y2, other.y2);
|
|
74
|
-
boxes.splice(
|
|
78
|
+
boxes.splice(at, 1);
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
return boxes.map((b) => ({
|
package/dist/diff/regions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regions.js","sourceRoot":"","sources":["../../src/diff/regions.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,kCAAkC;AAWlC,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB;;;;;;;;;;;GAWG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc;IAC7C,OAAO,IAAI,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"regions.js","sourceRoot":"","sources":["../../src/diff/regions.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,kCAAkC;AAWlC,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB;;;;;;;;;;;GAWG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc;IAC7C,sEAAsE;IACtE,OAAO,IAAI,CAAC,MAAM,CAAE,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,KAAa,EACb,MAAc,EACd,MAAc,WAAW;IAEzB,qEAAqE;IACrE,gDAAgD;IAChD,MAAM,KAAK,GAA4C,EAAE,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,KAAK,GAAG,CAAC,CAAC;iBAClC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxC,KAAK,GAAG,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,EAAE;IACF,0EAA0E;IAC1E,2EAA2E;IAC3E,+DAA+D;IAC/D,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,gEAAgE;QAChE,qDAAqD;QACrD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,CAAE,CAAC;QACnC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAExC,0EAA0E;QAC1E,iDAAiD;QACjD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAE,CAAC;YACzB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC,EAAE,CAAC,CAAC,EAAE;QACP,CAAC,EAAE,CAAC,CAAC,EAAE;QACP,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CACf,IAA2C,EAC3C,GAAQ,EACR,GAAW;IAEX,OAAO,CACL,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG;QACtB,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG;QACtB,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG;QACvB,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Delta, StructureRect, StructureSnapshot } from '../../types.js';
|
|
2
2
|
import type { ElementMatch } from './match.js';
|
|
3
|
+
import { compareCodeUnits } from '../../report/format.js';
|
|
3
4
|
export interface Fact {
|
|
4
5
|
delta: Delta;
|
|
5
6
|
/** Old and new rects of the element(s) this fact is about, for coverage. */
|
|
@@ -24,6 +25,4 @@ export interface Source {
|
|
|
24
25
|
export declare const KIND_RANK: Record<Delta['kind'], number>;
|
|
25
26
|
export declare function computeFacts(a: StructureSnapshot, b: StructureSnapshot, match: ElementMatch): Fact[];
|
|
26
27
|
export declare function sortFacts(facts: Fact[]): Fact[];
|
|
27
|
-
|
|
28
|
-
* `localeCompare` is not one. */
|
|
29
|
-
export declare const compareCodeUnits: (a: string, b: string) => number;
|
|
28
|
+
export { compareCodeUnits };
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
// effective colour — reporting it 40 times would bury the one fact that
|
|
7
7
|
// matters. So an inherited delta is emitted only where the element's own
|
|
8
8
|
// stored value changed, or where the parents' effective values already agree.
|
|
9
|
-
import { INHERITED_PROPS, STRUCTURE_PROPS, effectiveStyle, round, } from '../../capture/structure.js';
|
|
9
|
+
import { INHERITED_PROPS, STRUCTURE_PROPS, effectiveStyle, elementAt, round, } from '../../capture/structure.js';
|
|
10
10
|
import { abstractLabel, clip, label } from './label.js';
|
|
11
|
+
import { compareCodeUnits } from '../../report/format.js';
|
|
11
12
|
/** Within one position, which fact reads first. */
|
|
12
13
|
export const KIND_RANK = {
|
|
13
14
|
removed: 0,
|
|
@@ -33,6 +34,9 @@ export function computeFacts(a, b, match) {
|
|
|
33
34
|
* following, so their rects can ride on an ancestor's fact. */
|
|
34
35
|
const byElement = new Map();
|
|
35
36
|
const followers = [];
|
|
37
|
+
// Indices in `match` come from matchElements over these same element
|
|
38
|
+
// arrays, so they are in range by construction. Parent pointers are data
|
|
39
|
+
// read from a sidecar and go through elementAt.
|
|
36
40
|
for (const [i, j] of match.pairs) {
|
|
37
41
|
const ea = a.elements[i];
|
|
38
42
|
const eb = b.elements[j];
|
|
@@ -123,7 +127,7 @@ export function computeFacts(a, b, match) {
|
|
|
123
127
|
// Nearest baseline ancestor with a geometry fact: the move or resize the
|
|
124
128
|
// child followed. Walked on the baseline tree, the side `source` indexes.
|
|
125
129
|
for (const { i, rects } of followers) {
|
|
126
|
-
for (let k = a.elements[i].parent; k !== null; k = a
|
|
130
|
+
for (let k = a.elements[i].parent; k !== null; k = elementAt(a, k).parent) {
|
|
127
131
|
const own = byElement
|
|
128
132
|
.get(k)
|
|
129
133
|
?.find((f) => f.delta.kind === 'moved' || f.delta.kind === 'resized');
|
|
@@ -173,7 +177,7 @@ function borderless(s, i, colorProp) {
|
|
|
173
177
|
* either it stores its own value on a side, or its parents' effective values
|
|
174
178
|
* agree (so the difference starts here). */
|
|
175
179
|
function originatesHere(a, b, i, j, aToB, prop) {
|
|
176
|
-
const ea = a.elements[i];
|
|
180
|
+
const ea = a.elements[i]; // i, j: a matched pair
|
|
177
181
|
const eb = b.elements[j];
|
|
178
182
|
if (ea.styles[prop] !== undefined || eb.styles[prop] !== undefined)
|
|
179
183
|
return true;
|
|
@@ -191,12 +195,12 @@ function originatesHere(a, b, i, j, aToB, prop) {
|
|
|
191
195
|
* still reads as following when its parent's own move was itself
|
|
192
196
|
* suppressed. */
|
|
193
197
|
function parentChange(a, b, i, j, aToB) {
|
|
194
|
-
const pa = a.elements[i].parent;
|
|
198
|
+
const pa = a.elements[i].parent; // i, j: a matched pair
|
|
195
199
|
const pb = b.elements[j].parent;
|
|
196
200
|
if (pa === null || pb === null || aToB.get(pa) !== pb)
|
|
197
201
|
return undefined;
|
|
198
|
-
const ra = a
|
|
199
|
-
const rb = b
|
|
202
|
+
const ra = elementAt(a, pa).rect;
|
|
203
|
+
const rb = elementAt(b, pb).rect;
|
|
200
204
|
return {
|
|
201
205
|
dx: round(rb.x - ra.x),
|
|
202
206
|
dy: round(rb.y - ra.y),
|
|
@@ -212,7 +216,6 @@ export function sortFacts(facts) {
|
|
|
212
216
|
function factKey(d) {
|
|
213
217
|
return d.kind === 'style' ? d.prop : d.kind === 'attr' ? d.attr : '';
|
|
214
218
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
export const compareCodeUnits = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
219
|
+
// Defined with the browser-safe formatters so the addon shares it.
|
|
220
|
+
export { compareCodeUnits };
|
|
218
221
|
//# sourceMappingURL=deltas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltas.js","sourceRoot":"","sources":["../../../src/diff/structural/deltas.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,2EAA2E;AAC3E,wEAAwE;AACxE,yEAAyE;AACzE,8EAA8E;AAE9E,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,KAAK,GACN,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deltas.js","sourceRoot":"","sources":["../../../src/diff/structural/deltas.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,13 +12,12 @@
|
|
|
12
12
|
// them, the element's ordinal among same-labelled elements on its side of the
|
|
13
13
|
// diff (`div.card (2nd)`). Both are properties of the page, not of the diff,
|
|
14
14
|
// so the same change labels the same way on every run.
|
|
15
|
+
import { elementAt } from '../../capture/structure.js';
|
|
15
16
|
import { MAX_LABEL, clip, label } from './label.js';
|
|
16
17
|
export function disambiguate(facts, baseline, current) {
|
|
17
18
|
const snap = (s) => (s.side === 'baseline' ? baseline : current);
|
|
18
|
-
const nth = {
|
|
19
|
-
|
|
20
|
-
current: undefined,
|
|
21
|
-
};
|
|
19
|
+
const nth = {};
|
|
20
|
+
// ordinals has one entry per element, and a source indexes an element.
|
|
22
21
|
const nthOf = (s) => (nth[s.side] ??= ordinals(snap(s)))[s.index];
|
|
23
22
|
const key = (s) => `${s.side}:${s.index}`;
|
|
24
23
|
const labelOf = (f) => ('el' in f.delta ? f.delta.el : f.delta.after);
|
|
@@ -43,7 +42,9 @@ export function disambiguate(facts, baseline, current) {
|
|
|
43
42
|
const distinct = scoped.every((x) => x !== undefined) && new Set(scoped).size === scoped.length;
|
|
44
43
|
for (const [k, s] of sources.entries()) {
|
|
45
44
|
const suffix = ` (${ordinal(nthOf(s))})`;
|
|
46
|
-
rename.set(key(s),
|
|
45
|
+
rename.set(key(s),
|
|
46
|
+
// distinct implies every scoped label is defined.
|
|
47
|
+
distinct ? scoped[k] : clip(l, MAX_LABEL - suffix.length) + suffix);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
if (rename.size === 0)
|
|
@@ -59,8 +60,8 @@ export function disambiguate(facts, baseline, current) {
|
|
|
59
60
|
/** Label of the nearest ancestor that names itself (role+name, id, test id);
|
|
60
61
|
* a class or a path does not tell two siblings' parents apart. */
|
|
61
62
|
function labelledAncestor(s, index) {
|
|
62
|
-
for (let p = s
|
|
63
|
-
const e = s
|
|
63
|
+
for (let p = elementAt(s, index).parent; p !== null; p = elementAt(s, p).parent) {
|
|
64
|
+
const e = elementAt(s, p);
|
|
64
65
|
if (e.tag === 'masked')
|
|
65
66
|
continue;
|
|
66
67
|
if ((e.role && e.name) || e.id !== undefined || e.testId !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disambiguate.js","sourceRoot":"","sources":["../../../src/diff/structural/disambiguate.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,iEAAiE;AACjE,0EAA0E;AAC1E,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,kEAAkE;AAClE,iEAAiE;AACjE,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,uDAAuD;
|
|
1
|
+
{"version":3,"file":"disambiguate.js","sourceRoot":"","sources":["../../../src/diff/structural/disambiguate.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,iEAAiE;AACjE,0EAA0E;AAC1E,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,kEAAkE;AAClE,iEAAiE;AACjE,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,uDAAuD;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAA2B,EAC3B,OAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,GAAG,GAAgD,EAAE,CAAC;IAC5D,uEAAuE;IACvE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;IAC3E,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5E,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,CAAC;QAC5D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;YAAE,SAAS;QAC3B,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GACZ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;QACjF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzC,MAAM,CAAC,GAAG,CACR,GAAG,CAAC,CAAC,CAAC;YACN,kDAAkD;YAClD,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAClB,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED;mEACmE;AACnE,SAAS,gBAAgB,CAAC,CAAoB,EAAE,KAAa;IAC3D,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChF,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,SAAS;QACjC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YACpE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;mBAGmB;AACnB,SAAS,QAAQ,CAAC,CAAoB;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -36,7 +36,7 @@ function clipPath(path) {
|
|
|
36
36
|
if (path.length <= MAX_LABEL)
|
|
37
37
|
return path;
|
|
38
38
|
const parts = path.split('>');
|
|
39
|
-
let out = parts[parts.length - 1];
|
|
39
|
+
let out = parts[parts.length - 1]; // split returns at least one part
|
|
40
40
|
for (let k = parts.length - 2; k >= 0; k--) {
|
|
41
41
|
const next = `${parts[k]}>${out}`;
|
|
42
42
|
if (next.length + 2 > MAX_LABEL)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/diff/structural/label.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,iDAAiD;AAIjD;;8BAE8B;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC;IACxD,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AAEH;uEACuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B,MAAM,UAAU,KAAK,CAAC,EAAoB;IACxC,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI;QACpB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,MAAM,IAAI,EAAE,SAAS,CAAC,CAAC;IAClE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7E,OAAO,QAAQ,CACb,EAAE,CAAC,IAAI;SACJ,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC;SAC5D,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CACrC,CAAC;AACJ,CAAC;AAED;+EAC+E;AAC/E,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/diff/structural/label.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@ export function matchElements(a, b) {
|
|
|
37
37
|
// `text`/`attr` deltas rather than removed + added.
|
|
38
38
|
// Never across conflicting explicit identities: `div#row-1` removed and
|
|
39
39
|
// `div#banner` added are two different elements, not one edited one.
|
|
40
|
+
// i and j come from childLists over these same element arrays.
|
|
40
41
|
const second = align(first.leftA, first.leftB, (i, j) => sameKind(a.elements[i], b.elements[j]));
|
|
41
42
|
for (const [i, j] of [...first.matched, ...second.matched]) {
|
|
42
43
|
pairs.push([i, j]);
|
|
@@ -90,19 +91,25 @@ function lcs(ca, cb, same) {
|
|
|
90
91
|
const m = cb.length;
|
|
91
92
|
// L[i][j] = LCS length of ca[i..] and cb[j..]
|
|
92
93
|
const L = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));
|
|
94
|
+
// Every read below has i <= n and j <= m: L has n + 1 rows of m + 1 cells,
|
|
95
|
+
// and ca/cb are read only at i < n, j < m.
|
|
93
96
|
for (let i = n - 1; i >= 0; i--) {
|
|
97
|
+
const row = L[i];
|
|
98
|
+
const below = L[i + 1];
|
|
94
99
|
for (let j = m - 1; j >= 0; j--) {
|
|
95
|
-
|
|
96
|
-
?
|
|
97
|
-
: Math.max(
|
|
100
|
+
row[j] = same(ca[i], cb[j])
|
|
101
|
+
? below[j + 1] + 1
|
|
102
|
+
: Math.max(below[j], row[j + 1]);
|
|
98
103
|
}
|
|
99
104
|
}
|
|
100
105
|
const out = [];
|
|
101
106
|
let i = 0;
|
|
102
107
|
let j = 0;
|
|
103
108
|
while (i < n && j < m) {
|
|
104
|
-
|
|
105
|
-
|
|
109
|
+
const ai = ca[i];
|
|
110
|
+
const bj = cb[j];
|
|
111
|
+
if (same(ai, bj)) {
|
|
112
|
+
out.push([ai, bj]);
|
|
106
113
|
i++;
|
|
107
114
|
j++;
|
|
108
115
|
}
|
|
@@ -124,7 +131,7 @@ function greedy(ca, cb, same) {
|
|
|
124
131
|
for (const i of ca) {
|
|
125
132
|
let k = j;
|
|
126
133
|
while (k < cb.length && !same(i, cb[k]))
|
|
127
|
-
k++;
|
|
134
|
+
k++; // k < cb.length
|
|
128
135
|
if (k < cb.length) {
|
|
129
136
|
out.push([i, cb[k]]);
|
|
130
137
|
j = k + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/diff/structural/match.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAa5E,sEAAsE;AACtE,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B;wEACwE;AACxE,MAAM,UAAU,WAAW,CAAC,EAAoB;IAC9C,IAAI,EAAE,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;IACrD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;IAC9D,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI;QAAE,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACjE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnE,OAAO,EAAE,CAAC,GAAG,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAoB,EAAE,CAAoB;IACtE,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAU,EAAQ,EAAE;QAC5C,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,oEAAoE;QACpE,0EAA0E;QAC1E,oDAAoD;QACpD,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtD,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/diff/structural/match.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
// LCS can see, and leaving those as 40 `moved` deltas defeats the purpose.
|
|
9
9
|
import { compareCodeUnits, sortFacts } from './deltas.js';
|
|
10
10
|
const MIN_RUN = 3;
|
|
11
|
+
const isMoved = (f) => f.delta.kind === 'moved';
|
|
11
12
|
export function synthesizeShifts(facts) {
|
|
12
13
|
const anchors = facts.filter((f) => f.delta.kind !== 'moved' && f.delta.kind !== 'shift');
|
|
13
|
-
const moved = facts.filter(
|
|
14
|
+
const moved = facts.filter(isMoved);
|
|
14
15
|
if (moved.length < MIN_RUN)
|
|
15
16
|
return facts;
|
|
16
17
|
// Group by displacement, keeping document order within a group.
|
|
@@ -44,6 +45,7 @@ export function synthesizeShifts(facts) {
|
|
|
44
45
|
let start = 0;
|
|
45
46
|
for (let k = 1; k <= g.length; k++) {
|
|
46
47
|
if (k < g.length &&
|
|
48
|
+
// 1 <= k < g.length: both members exist.
|
|
47
49
|
pos.get(g[k]) === pos.get(g[k - 1]) + 1 &&
|
|
48
50
|
!causeBetween(anchorOrders, g[k - 1].order, g[k].order))
|
|
49
51
|
continue;
|
|
@@ -80,13 +82,11 @@ export function synthesizeShifts(facts) {
|
|
|
80
82
|
* the same cause: in `inserted` the logo drops off the button's line between
|
|
81
83
|
* the banner and the rows, and the rows moved because of the banner. */
|
|
82
84
|
function collapse(run, anchors, moved) {
|
|
85
|
+
// Only runs of at least MIN_RUN reach here.
|
|
83
86
|
const first = run[0];
|
|
84
87
|
const last = run[run.length - 1];
|
|
85
88
|
const d = first.delta;
|
|
86
|
-
const other = moved.filter((f) =>
|
|
87
|
-
const m = f.delta;
|
|
88
|
-
return m.dx !== d.dx || m.dy !== d.dy;
|
|
89
|
-
});
|
|
89
|
+
const other = moved.filter((f) => f.delta.dx !== d.dx || f.delta.dy !== d.dy);
|
|
90
90
|
const base = (f) => f.source.index; // moves are matched: baseline side
|
|
91
91
|
const crossed = other
|
|
92
92
|
.filter((f) => (base(f) < base(first) && f.order > last.order) ||
|
|
@@ -117,6 +117,8 @@ function collapse(run, anchors, moved) {
|
|
|
117
117
|
* read as the element. */
|
|
118
118
|
function headOf(f, moved) {
|
|
119
119
|
const m = f.delta;
|
|
120
|
+
// f is always one of moved (an anchor drawn from it), so k starts in range
|
|
121
|
+
// and only walks down to 0.
|
|
120
122
|
let k = moved.indexOf(f);
|
|
121
123
|
while (k > 0) {
|
|
122
124
|
const p = moved[k - 1].delta;
|
|
@@ -135,7 +137,7 @@ function causeBetween(orders, lo, hi) {
|
|
|
135
137
|
while (a < b) {
|
|
136
138
|
const m = (a + b) >> 1;
|
|
137
139
|
if (orders[m] <= lo)
|
|
138
|
-
a = m + 1;
|
|
140
|
+
a = m + 1; // a <= m < b <= orders.length
|
|
139
141
|
else
|
|
140
142
|
b = m;
|
|
141
143
|
}
|