@pdf-testkit/core 0.1.1 → 0.1.3
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/diff/diff.d.ts.map +1 -1
- package/dist/diff/diff.js +1 -0
- package/dist/diff/diff.js.map +1 -1
- package/dist/diff/group.d.ts +42 -0
- package/dist/diff/group.d.ts.map +1 -0
- package/dist/diff/group.js +783 -0
- package/dist/diff/group.js.map +1 -0
- package/dist/events.d.ts +6 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/extract/fromPdf.d.ts.map +1 -1
- package/dist/extract/fromPdf.js +17 -4
- package/dist/extract/fromPdf.js.map +1 -1
- package/dist/extract/pdfjs/textRuns.d.ts.map +1 -1
- package/dist/extract/pdfjs/textRuns.js +6 -1
- package/dist/extract/pdfjs/textRuns.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/diff/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC;AAExG,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,IAAI,GAAE,WAAgB,GACrB,UAAU,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC;AAExG,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,IAAI,GAAE,WAAgB,GACrB,UAAU,CAyHZ"}
|
package/dist/diff/diff.js
CHANGED
|
@@ -102,6 +102,7 @@ export function diffSnapshots(baseline, next, opts = {}) {
|
|
|
102
102
|
type: 'element-removed',
|
|
103
103
|
severity: severityOf('element-removed'),
|
|
104
104
|
confidence: node.confidence,
|
|
105
|
+
nodeId: node.id,
|
|
105
106
|
role: node.role,
|
|
106
107
|
textPreview: textPreview(node.text),
|
|
107
108
|
pageIndex: node.pageIndex,
|
package/dist/diff/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Causal grouping of semantic events for *human-facing* output only.
|
|
3
|
+
*
|
|
4
|
+
* A single structural change fans out into a large flat event list: on the
|
|
5
|
+
* FormePDF invoice fixture, adding 14 table rows produces 123 events — 97 of
|
|
6
|
+
* them the table's own subtree, 14 downstream page shifts, 4 the new page's
|
|
7
|
+
* repeated footer, and 6 the three totals actually changing value. Every one is
|
|
8
|
+
* individually accurate, and the list is still useless: a reviewer scrolling
|
|
9
|
+
* past 123 rows approves without reading, which is the exact failure mode a
|
|
10
|
+
* semantic differ exists to prevent.
|
|
11
|
+
*
|
|
12
|
+
* This module does NOT change what `diffSnapshots` emits. `DiffResult.events`,
|
|
13
|
+
* the `--json` output, and `shouldFail` all keep the full precise per-element
|
|
14
|
+
* list — machine consumers must not lose resolution. Grouping is a *view*, never
|
|
15
|
+
* a filter: the union of every group's `events` equals the input list exactly,
|
|
16
|
+
* and a test asserts it.
|
|
17
|
+
*
|
|
18
|
+
* It lives in core rather than in each formatter because the CLI, the matcher
|
|
19
|
+
* failure message, and the GitHub Action all render the same list and all have
|
|
20
|
+
* the same problem; three independently-maintained copies of a causality
|
|
21
|
+
* heuristic is a drift bug waiting to happen.
|
|
22
|
+
*/
|
|
23
|
+
import type { DiffOptions, SemanticEvent, Severity } from '../events.js';
|
|
24
|
+
import type { StructuralSnapshot } from '../types.js';
|
|
25
|
+
export type GroupKind = 'single' | 'table-resized' | 'page-shift-cascade' | 'new-page-furniture' | 'value-changed';
|
|
26
|
+
export interface EventGroup {
|
|
27
|
+
kind: GroupKind;
|
|
28
|
+
/** The member event that defines this group's severity and headline. */
|
|
29
|
+
root: SemanticEvent;
|
|
30
|
+
/** Always equals `root.severity`: a group never absorbs anything more severe. */
|
|
31
|
+
severity: Severity;
|
|
32
|
+
/** One line. For a `single` group this is just `root.message`. */
|
|
33
|
+
summary: string;
|
|
34
|
+
/** Every member, root first. Union across all groups === the input, exactly. */
|
|
35
|
+
events: SemanticEvent[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Collapse `events` into causally-related groups. Pass the same `opts` used for
|
|
39
|
+
* the `diffSnapshots` call that produced `events` so node matching agrees.
|
|
40
|
+
*/
|
|
41
|
+
export declare function groupEvents(baseline: StructuralSnapshot, next: StructuralSnapshot, events: SemanticEvent[], opts?: DiffOptions): EventGroup[];
|
|
42
|
+
//# sourceMappingURL=group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/diff/group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAqB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGhF,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,wEAAwE;IACxE,IAAI,EAAE,aAAa,CAAC;IACpB,iFAAiF;IACjF,QAAQ,EAAE,QAAQ,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAyDD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,GAAE,WAAgB,GACrB,UAAU,EAAE,CA+Od"}
|
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Causal grouping of semantic events for *human-facing* output only.
|
|
3
|
+
*
|
|
4
|
+
* A single structural change fans out into a large flat event list: on the
|
|
5
|
+
* FormePDF invoice fixture, adding 14 table rows produces 123 events — 97 of
|
|
6
|
+
* them the table's own subtree, 14 downstream page shifts, 4 the new page's
|
|
7
|
+
* repeated footer, and 6 the three totals actually changing value. Every one is
|
|
8
|
+
* individually accurate, and the list is still useless: a reviewer scrolling
|
|
9
|
+
* past 123 rows approves without reading, which is the exact failure mode a
|
|
10
|
+
* semantic differ exists to prevent.
|
|
11
|
+
*
|
|
12
|
+
* This module does NOT change what `diffSnapshots` emits. `DiffResult.events`,
|
|
13
|
+
* the `--json` output, and `shouldFail` all keep the full precise per-element
|
|
14
|
+
* list — machine consumers must not lose resolution. Grouping is a *view*, never
|
|
15
|
+
* a filter: the union of every group's `events` equals the input list exactly,
|
|
16
|
+
* and a test asserts it.
|
|
17
|
+
*
|
|
18
|
+
* It lives in core rather than in each formatter because the CLI, the matcher
|
|
19
|
+
* failure message, and the GitHub Action all render the same list and all have
|
|
20
|
+
* the same problem; three independently-maintained copies of a causality
|
|
21
|
+
* heuristic is a drift bug waiting to happen.
|
|
22
|
+
*/
|
|
23
|
+
import { matchNodes } from './match.js';
|
|
24
|
+
const RANK = { info: 0, warn: 1, error: 2 };
|
|
25
|
+
/**
|
|
26
|
+
* Below this, a cascade is already readable as a flat list and collapsing it
|
|
27
|
+
* would only cost information.
|
|
28
|
+
*/
|
|
29
|
+
const MIN_CASCADE_MEMBERS = 3;
|
|
30
|
+
/** Roles that are structural children of a table rather than content of their own. */
|
|
31
|
+
const TABLE_PARTS = new Set(['row', 'cell']);
|
|
32
|
+
/**
|
|
33
|
+
* Events that say where a node went. The rest (`text-overflowed-container`,
|
|
34
|
+
* `heading-hierarchy-changed`) are extra observations *about* a node that may
|
|
35
|
+
* also have a structural event, so they must never displace it when answering
|
|
36
|
+
* "what happened to this node".
|
|
37
|
+
*/
|
|
38
|
+
const STRUCTURAL = new Set([
|
|
39
|
+
'element-added',
|
|
40
|
+
'element-removed',
|
|
41
|
+
'element-moved-to-different-page',
|
|
42
|
+
'table-moved',
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Collapse `events` into causally-related groups. Pass the same `opts` used for
|
|
46
|
+
* the `diffSnapshots` call that produced `events` so node matching agrees.
|
|
47
|
+
*/
|
|
48
|
+
export function groupEvents(baseline, next, events, opts = {}) {
|
|
49
|
+
if (events.length === 0)
|
|
50
|
+
return [];
|
|
51
|
+
const ignore = new Set(opts.ignoreRoles ?? []);
|
|
52
|
+
const baseNodes = baseline.nodes.filter((n) => !ignore.has(n.role));
|
|
53
|
+
const nextNodes = next.nodes.filter((n) => !ignore.has(n.role));
|
|
54
|
+
const baseById = byId(baseNodes);
|
|
55
|
+
const nextById = byId(nextNodes);
|
|
56
|
+
const baseRank = readingRank(baseNodes);
|
|
57
|
+
const nextRank = readingRank(nextNodes);
|
|
58
|
+
// Re-run the matcher rather than threading its result out of `diffSnapshots`:
|
|
59
|
+
// it is deterministic over the same inputs, and grouping needs the *pairing*
|
|
60
|
+
// (which base node became which next node) that the flat event list drops.
|
|
61
|
+
const { pairs } = matchNodes(baseNodes, nextNodes);
|
|
62
|
+
const baseToNext = new Map();
|
|
63
|
+
const nextToBase = new Map();
|
|
64
|
+
for (const p of pairs) {
|
|
65
|
+
baseToNext.set(p.base.id, p.next.id);
|
|
66
|
+
nextToBase.set(p.next.id, p.base.id);
|
|
67
|
+
}
|
|
68
|
+
// Event indices that carry a resolvable node, split by which snapshot the id
|
|
69
|
+
// belongs to. `element-removed` is the only one pointing at the baseline.
|
|
70
|
+
// One node can produce several events (an added cell that also overflows), so
|
|
71
|
+
// a structural event always wins the slot over a decorative one.
|
|
72
|
+
const eventIdxByNextId = new Map();
|
|
73
|
+
const eventIdxByBaseId = new Map();
|
|
74
|
+
events.forEach((e, i) => {
|
|
75
|
+
if (!('nodeId' in e))
|
|
76
|
+
return;
|
|
77
|
+
const into = e.type === 'element-removed' ? eventIdxByBaseId : eventIdxByNextId;
|
|
78
|
+
const held = into.get(e.nodeId);
|
|
79
|
+
if (held != null && !STRUCTURAL.has(e.type))
|
|
80
|
+
return;
|
|
81
|
+
if (held != null && STRUCTURAL.has(events[held].type))
|
|
82
|
+
return;
|
|
83
|
+
into.set(e.nodeId, i);
|
|
84
|
+
});
|
|
85
|
+
const pageCountIdx = events.findIndex((e) => e.type === 'page-count-changed');
|
|
86
|
+
const repeated = repeatedNormTexts(nextNodes);
|
|
87
|
+
/** The document lost pages rather than gaining them. */
|
|
88
|
+
const shed = next.pageCount < baseline.pageCount;
|
|
89
|
+
/**
|
|
90
|
+
* Where a node sits in the *new* document's reading order. A removed node has
|
|
91
|
+
* no position there at all, so it borrows the slot just after the last
|
|
92
|
+
* surviving thing that preceded it in the baseline — which is exactly where
|
|
93
|
+
* its absence is felt, and lets a deletion be cited as the cause of a shift.
|
|
94
|
+
*/
|
|
95
|
+
const baseByRank = new Map();
|
|
96
|
+
for (const n of baseNodes) {
|
|
97
|
+
const r = baseRank.get(n.id);
|
|
98
|
+
if (r != null)
|
|
99
|
+
baseByRank.set(r, n);
|
|
100
|
+
}
|
|
101
|
+
const rankInNext = (nodeId) => {
|
|
102
|
+
const direct = nextRank.get(nodeId);
|
|
103
|
+
if (direct != null)
|
|
104
|
+
return direct;
|
|
105
|
+
const from = baseRank.get(nodeId);
|
|
106
|
+
if (from == null)
|
|
107
|
+
return null;
|
|
108
|
+
for (let r = from - 1; r >= 0; r--) {
|
|
109
|
+
const prev = baseByRank.get(r);
|
|
110
|
+
const mapped = prev == null ? undefined : baseToNext.get(prev.id);
|
|
111
|
+
const rank = mapped == null ? undefined : nextRank.get(mapped);
|
|
112
|
+
if (rank != null)
|
|
113
|
+
return rank + 0.5;
|
|
114
|
+
}
|
|
115
|
+
return -0.5; // Removed from the very top of the document.
|
|
116
|
+
};
|
|
117
|
+
/** -1 = unclaimed. Otherwise the index of the group this event belongs to. */
|
|
118
|
+
const claim = new Array(events.length).fill(-1);
|
|
119
|
+
const groups = [];
|
|
120
|
+
const open = (kind, rootIdx, summary, label) => {
|
|
121
|
+
const id = groups.length;
|
|
122
|
+
groups.push({ kind, rootIdx, members: [rootIdx], summary, label });
|
|
123
|
+
claim[rootIdx] = id;
|
|
124
|
+
return id;
|
|
125
|
+
};
|
|
126
|
+
const attach = (groupId, idx) => {
|
|
127
|
+
if (claim[idx] !== -1)
|
|
128
|
+
return;
|
|
129
|
+
claim[idx] = groupId;
|
|
130
|
+
groups[groupId].members.push(idx);
|
|
131
|
+
};
|
|
132
|
+
// ── Rule 4 — paired value change ───────────────────────────────────────────
|
|
133
|
+
// Runs FIRST, and deliberately pairs rather than collapses. A removed+added
|
|
134
|
+
// text at the same slot is a real content change (here: three totals moving
|
|
135
|
+
// by ~3x). Letting a later rule fold it into a "downstream cascade" summary
|
|
136
|
+
// would hide the one fact in the whole diff a reviewer must not miss.
|
|
137
|
+
for (const [removedIdx, addedIdx] of pairValueChanges(events, baseById, nextById, baseToNext)) {
|
|
138
|
+
const removed = events[removedIdx];
|
|
139
|
+
const added = events[addedIdx];
|
|
140
|
+
const before = 'textPreview' in removed ? removed.textPreview : '';
|
|
141
|
+
const after = 'textPreview' in added ? added.textPreview : '';
|
|
142
|
+
const role = 'role' in added ? added.role : 'element';
|
|
143
|
+
const id = open('value-changed', addedIdx, `${role} "${before}" → "${after}"`);
|
|
144
|
+
attach(id, removedIdx);
|
|
145
|
+
}
|
|
146
|
+
// ── Rule 3 — page furniture ────────────────────────────────────────────────
|
|
147
|
+
// A page that did not exist in the baseline brings a fresh copy of every
|
|
148
|
+
// repeated fixed element with it; a page that goes away takes its copy with
|
|
149
|
+
// it. Either way those adds/removes are a restatement of `page-count-changed`,
|
|
150
|
+
// not independent findings — so the rule reads whichever snapshot holds the
|
|
151
|
+
// pages that only exist on one side.
|
|
152
|
+
if (pageCountIdx !== -1) {
|
|
153
|
+
const side = shed
|
|
154
|
+
? {
|
|
155
|
+
type: 'element-removed',
|
|
156
|
+
nodes: baseNodes,
|
|
157
|
+
index: baseById,
|
|
158
|
+
eventIdx: eventIdxByBaseId,
|
|
159
|
+
repeated: repeatedNormTexts(baseNodes),
|
|
160
|
+
firstGonePage: next.pageCount,
|
|
161
|
+
}
|
|
162
|
+
: {
|
|
163
|
+
type: 'element-added',
|
|
164
|
+
nodes: nextNodes,
|
|
165
|
+
index: nextById,
|
|
166
|
+
eventIdx: eventIdxByNextId,
|
|
167
|
+
repeated,
|
|
168
|
+
firstGonePage: baseline.pageCount,
|
|
169
|
+
};
|
|
170
|
+
const furniture = [];
|
|
171
|
+
for (const root of subtreeRoots(side.type, events, claim, side.index, side.eventIdx)) {
|
|
172
|
+
if (root.node.pageIndex < side.firstGonePage)
|
|
173
|
+
continue;
|
|
174
|
+
// A table row is content wherever it sits. Line-item text can repeat
|
|
175
|
+
// across pages by coincidence, and mistaking that for a running footer
|
|
176
|
+
// would drag half a table into the page-count group.
|
|
177
|
+
if (root.node.role === 'table' || TABLE_PARTS.has(root.node.role))
|
|
178
|
+
continue;
|
|
179
|
+
const subtree = collectSubtree(root.node, side.nodes);
|
|
180
|
+
if (!subtree.some((n) => n.normText != null && side.repeated.has(n.normText)))
|
|
181
|
+
continue;
|
|
182
|
+
for (const n of subtree) {
|
|
183
|
+
const idx = side.eventIdx.get(n.id);
|
|
184
|
+
if (idx != null && claim[idx] === -1)
|
|
185
|
+
furniture.push(idx);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (furniture.length > 0) {
|
|
189
|
+
const id = open('new-page-furniture', pageCountIdx, furnitureSummary(events[pageCountIdx], furniture.length), 'the page-count change');
|
|
190
|
+
for (const idx of furniture)
|
|
191
|
+
attach(id, idx);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ── Rule 1 — table subtree resize ──────────────────────────────────────────
|
|
195
|
+
// Restricted to row/cell/table roles on purpose. "Anything added under a node
|
|
196
|
+
// that changed" would swallow a new paragraph inside a container that merely
|
|
197
|
+
// moved; a row or a cell, by contrast, has no meaning apart from its table.
|
|
198
|
+
// A table that spans a page break carries a continuation fragment, which the
|
|
199
|
+
// extractor reports as a whole separate table. Those are resolved back to the
|
|
200
|
+
// fragment that actually paired — on *both* sides, since the fragment that
|
|
201
|
+
// exists alone lives in the baseline when the table shrank.
|
|
202
|
+
const tables = {
|
|
203
|
+
baseById,
|
|
204
|
+
nextById,
|
|
205
|
+
baseToNext,
|
|
206
|
+
nextToBase,
|
|
207
|
+
contBase: continuationAnchors(baseNodes, baseRank, baseToNext, pageCountIdx !== -1),
|
|
208
|
+
contNext: continuationAnchors(nextNodes, nextRank, nextToBase, pageCountIdx !== -1),
|
|
209
|
+
eventIdxByBaseId,
|
|
210
|
+
eventIdxByNextId,
|
|
211
|
+
};
|
|
212
|
+
const tableGroups = new Map(); // canonical table key -> group id
|
|
213
|
+
for (let i = 0; i < events.length; i++) {
|
|
214
|
+
if (claim[i] !== -1)
|
|
215
|
+
continue;
|
|
216
|
+
const e = events[i];
|
|
217
|
+
if (e.type !== 'element-added' && e.type !== 'element-removed')
|
|
218
|
+
continue;
|
|
219
|
+
const key = owningTable(e, tables);
|
|
220
|
+
if (key == null)
|
|
221
|
+
continue;
|
|
222
|
+
let gid = tableGroups.get(key);
|
|
223
|
+
if (gid == null) {
|
|
224
|
+
const rootIdx = tableRootIdx(key, tables);
|
|
225
|
+
if (rootIdx == null || claim[rootIdx] !== -1)
|
|
226
|
+
continue;
|
|
227
|
+
gid = open('table-resized', rootIdx, '');
|
|
228
|
+
tableGroups.set(key, gid);
|
|
229
|
+
}
|
|
230
|
+
attach(gid, i);
|
|
231
|
+
}
|
|
232
|
+
for (const [key, gid] of tableGroups) {
|
|
233
|
+
const g = groups[gid];
|
|
234
|
+
const { summary, label } = tableSummary(key, tables, g.members, events);
|
|
235
|
+
g.summary = summary;
|
|
236
|
+
g.label = label;
|
|
237
|
+
}
|
|
238
|
+
// ── Rule 2 — uniform page-shift cascade ────────────────────────────────────
|
|
239
|
+
// Partitioned by page *delta*, not destination: on the invoice fixture 8
|
|
240
|
+
// elements go page 1→2 and 6 go page 2→3, so "everything moved to page 3"
|
|
241
|
+
// would be flatly wrong. Partitioning by delta also separates two independent
|
|
242
|
+
// insertions automatically, since they produce +1 and +2 regions.
|
|
243
|
+
const movesByDelta = new Map();
|
|
244
|
+
events.forEach((e, i) => {
|
|
245
|
+
if (claim[i] !== -1 || e.type !== 'element-moved-to-different-page')
|
|
246
|
+
return;
|
|
247
|
+
const d = e.toPage - e.fromPage;
|
|
248
|
+
const bucket = movesByDelta.get(d);
|
|
249
|
+
if (bucket)
|
|
250
|
+
bucket.push(i);
|
|
251
|
+
else
|
|
252
|
+
movesByDelta.set(d, [i]);
|
|
253
|
+
});
|
|
254
|
+
for (const [delta, idxs] of movesByDelta) {
|
|
255
|
+
if (idxs.length < MIN_CASCADE_MEMBERS)
|
|
256
|
+
continue;
|
|
257
|
+
const ranked = idxs
|
|
258
|
+
.map((i) => ({ i, rank: nextRank.get(events[i].nodeId) ?? -1 }))
|
|
259
|
+
.filter((m) => m.rank >= 0)
|
|
260
|
+
.sort((a, b) => a.rank - b.rank);
|
|
261
|
+
if (ranked.length < MIN_CASCADE_MEMBERS)
|
|
262
|
+
continue;
|
|
263
|
+
// A shared delta does not imply a shared cause: two separate insertions in
|
|
264
|
+
// different parts of a document both push everything after them one page
|
|
265
|
+
// down. Split the bucket into contiguous document runs and judge each on
|
|
266
|
+
// its own, so a genuine two-region regression reports as two findings
|
|
267
|
+
// rather than one false "everything shifted" line.
|
|
268
|
+
const movedIds = new Set(ranked.map((m) => events[m.i].nodeId));
|
|
269
|
+
for (const run of contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated, movedIds)) {
|
|
270
|
+
if (run.length < MIN_CASCADE_MEMBERS)
|
|
271
|
+
continue;
|
|
272
|
+
const cause = nearestPrecedingCause(groups, events, rankInNext, run[0].rank, pageCountIdx);
|
|
273
|
+
if (cause == null)
|
|
274
|
+
continue; // No root -> no group. "These moved, cause unknown" helps nobody.
|
|
275
|
+
const id = open('page-shift-cascade', run[0].i, cascadeSummary(run.length, delta, run.map((m) => m.i), events, cause));
|
|
276
|
+
for (const m of run)
|
|
277
|
+
attach(id, m.i);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// ── Everything else stays exactly as the diff reported it ──────────────────
|
|
281
|
+
for (let i = 0; i < events.length; i++) {
|
|
282
|
+
if (claim[i] === -1)
|
|
283
|
+
open('single', i, events[i].message);
|
|
284
|
+
}
|
|
285
|
+
return finalize(groups, events);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Enforce the hard severity invariant, then order for reading.
|
|
289
|
+
*
|
|
290
|
+
* A group never contains an event more severe than its root. An overflow error
|
|
291
|
+
* riding along on an added table cell, or a heading break sitting inside a
|
|
292
|
+
* shifted run, is ejected to its own top-level row rather than being quietly
|
|
293
|
+
* demoted into a warn-level summary. Severity has to mean the same thing
|
|
294
|
+
* everywhere or the gate stops meaning anything.
|
|
295
|
+
*/
|
|
296
|
+
function finalize(raw, events) {
|
|
297
|
+
// `at` is the root's index in the original event list; it orders groups within
|
|
298
|
+
// a severity band so output follows the order the diff engine reported.
|
|
299
|
+
const built = [];
|
|
300
|
+
for (const g of raw) {
|
|
301
|
+
const root = events[g.rootIdx];
|
|
302
|
+
const kept = [];
|
|
303
|
+
for (const idx of g.members) {
|
|
304
|
+
if (idx !== g.rootIdx && RANK[events[idx].severity] > RANK[root.severity]) {
|
|
305
|
+
const ejected = events[idx];
|
|
306
|
+
built.push({
|
|
307
|
+
at: idx,
|
|
308
|
+
group: { kind: 'single', root: ejected, severity: ejected.severity, summary: ejected.message, events: [ejected] },
|
|
309
|
+
});
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
kept.push(idx);
|
|
313
|
+
}
|
|
314
|
+
kept.sort((a, b) => (a === g.rootIdx ? -1 : b === g.rootIdx ? 1 : a - b));
|
|
315
|
+
// A group that lost everything but its root is just that event again.
|
|
316
|
+
const kind = kept.length === 1 ? 'single' : g.kind;
|
|
317
|
+
built.push({
|
|
318
|
+
at: g.rootIdx,
|
|
319
|
+
group: {
|
|
320
|
+
kind,
|
|
321
|
+
root,
|
|
322
|
+
severity: root.severity,
|
|
323
|
+
summary: kind === 'single' ? root.message : g.summary,
|
|
324
|
+
events: kept.map((i) => events[i]),
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
built.sort((a, b) => RANK[b.group.severity] - RANK[a.group.severity] || a.at - b.at);
|
|
329
|
+
return built.map((b) => b.group);
|
|
330
|
+
}
|
|
331
|
+
// ── Rule 4 helpers ──────────────────────────────────────────────────────────
|
|
332
|
+
/**
|
|
333
|
+
* A removed node and an added node are the *same slot* when they share a role,
|
|
334
|
+
* their parents correspond, and they sit at the same ordinal among their
|
|
335
|
+
* parent's same-role children.
|
|
336
|
+
*
|
|
337
|
+
* "Correspond" deliberately does not mean the matcher paired the two parents.
|
|
338
|
+
* Layout containers are anonymous — a FormePDF `View` has no text — so they all
|
|
339
|
+
* share the matcher's exact key and pair by global reading-order rank, which
|
|
340
|
+
* shifts wholesale the moment one container is inserted. Anchoring on a matched
|
|
341
|
+
* *child* instead (the "Subtotal" label next to the amount) is stable, because
|
|
342
|
+
* that child has content to match on.
|
|
343
|
+
*/
|
|
344
|
+
function pairValueChanges(events, baseById, nextById, baseToNext) {
|
|
345
|
+
const removed = [];
|
|
346
|
+
const added = [];
|
|
347
|
+
events.forEach((e, i) => {
|
|
348
|
+
if (e.type === 'element-removed') {
|
|
349
|
+
const n = baseById.get(e.nodeId);
|
|
350
|
+
if (n && isTexty(n.role))
|
|
351
|
+
removed.push({ idx: i, node: n });
|
|
352
|
+
}
|
|
353
|
+
else if (e.type === 'element-added') {
|
|
354
|
+
const n = nextById.get(e.nodeId);
|
|
355
|
+
if (n && isTexty(n.role))
|
|
356
|
+
added.push({ idx: i, node: n });
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
if (removed.length === 0 || added.length === 0)
|
|
360
|
+
return [];
|
|
361
|
+
const baseSiblings = siblingOrdinals([...baseById.values()]);
|
|
362
|
+
const nextSiblings = siblingOrdinals([...nextById.values()]);
|
|
363
|
+
const parentAnchor = anchorParents(baseById, nextById, baseToNext);
|
|
364
|
+
const taken = new Set();
|
|
365
|
+
const out = [];
|
|
366
|
+
for (const r of removed) {
|
|
367
|
+
if (r.node.parentId == null)
|
|
368
|
+
continue;
|
|
369
|
+
const mappedParent = parentAnchor.get(r.node.parentId);
|
|
370
|
+
if (mappedParent == null)
|
|
371
|
+
continue;
|
|
372
|
+
const match = added.find((a) => !taken.has(a.idx) &&
|
|
373
|
+
a.node.role === r.node.role &&
|
|
374
|
+
a.node.parentId === mappedParent &&
|
|
375
|
+
nextSiblings.get(a.node.id) === baseSiblings.get(r.node.id));
|
|
376
|
+
if (match) {
|
|
377
|
+
taken.add(match.idx);
|
|
378
|
+
out.push([r.idx, match.idx]);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return out;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* base parent id -> next parent id, inferred from where that parent's *matched
|
|
385
|
+
* children* ended up. Requires an outright winner: a tie means the children
|
|
386
|
+
* disagree about where their parent went, and a guess there is worse than
|
|
387
|
+
* declining to pair.
|
|
388
|
+
*/
|
|
389
|
+
function anchorParents(baseById, nextById, baseToNext) {
|
|
390
|
+
const votes = new Map();
|
|
391
|
+
for (const [baseId, nextId] of baseToNext) {
|
|
392
|
+
const b = baseById.get(baseId);
|
|
393
|
+
const n = nextById.get(nextId);
|
|
394
|
+
if (!b?.parentId || !n?.parentId)
|
|
395
|
+
continue;
|
|
396
|
+
let bucket = votes.get(b.parentId);
|
|
397
|
+
if (!bucket)
|
|
398
|
+
votes.set(b.parentId, (bucket = new Map()));
|
|
399
|
+
bucket.set(n.parentId, (bucket.get(n.parentId) ?? 0) + 1);
|
|
400
|
+
}
|
|
401
|
+
const out = new Map();
|
|
402
|
+
for (const [baseParent, bucket] of votes) {
|
|
403
|
+
const ranked = [...bucket].sort((a, b) => b[1] - a[1]);
|
|
404
|
+
if (ranked.length === 1 || ranked[0][1] > ranked[1][1])
|
|
405
|
+
out.set(baseParent, ranked[0][0]);
|
|
406
|
+
}
|
|
407
|
+
return out;
|
|
408
|
+
}
|
|
409
|
+
function siblingOrdinals(nodes) {
|
|
410
|
+
const byParent = new Map();
|
|
411
|
+
for (const n of nodes) {
|
|
412
|
+
const key = `${n.parentId ?? ''}|${n.role}`;
|
|
413
|
+
const bucket = byParent.get(key);
|
|
414
|
+
if (bucket)
|
|
415
|
+
bucket.push(n);
|
|
416
|
+
else
|
|
417
|
+
byParent.set(key, [n]);
|
|
418
|
+
}
|
|
419
|
+
const out = new Map();
|
|
420
|
+
for (const bucket of byParent.values()) {
|
|
421
|
+
bucket.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order);
|
|
422
|
+
bucket.forEach((n, i) => out.set(n.id, i));
|
|
423
|
+
}
|
|
424
|
+
return out;
|
|
425
|
+
}
|
|
426
|
+
// ── Rule 3 helpers ──────────────────────────────────────────────────────────
|
|
427
|
+
/** normTexts appearing on two or more pages — the running header/footer signature. */
|
|
428
|
+
function repeatedNormTexts(nodes) {
|
|
429
|
+
const pages = new Map();
|
|
430
|
+
for (const n of nodes) {
|
|
431
|
+
if (n.normText == null)
|
|
432
|
+
continue;
|
|
433
|
+
const seen = pages.get(n.normText);
|
|
434
|
+
if (seen)
|
|
435
|
+
seen.add(n.pageIndex);
|
|
436
|
+
else
|
|
437
|
+
pages.set(n.normText, new Set([n.pageIndex]));
|
|
438
|
+
}
|
|
439
|
+
const out = new Set();
|
|
440
|
+
for (const [text, seen] of pages)
|
|
441
|
+
if (seen.size >= 2)
|
|
442
|
+
out.add(text);
|
|
443
|
+
return out;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Nodes added (or removed) whose parent was not itself added (or removed) — the
|
|
447
|
+
* tops of the subtrees that appeared or vanished wholesale.
|
|
448
|
+
*/
|
|
449
|
+
function subtreeRoots(type, events, claim, index, eventIdx) {
|
|
450
|
+
const isSameChange = (id) => {
|
|
451
|
+
const idx = eventIdx.get(id);
|
|
452
|
+
return idx != null && events[idx].type === type;
|
|
453
|
+
};
|
|
454
|
+
const out = [];
|
|
455
|
+
events.forEach((e, i) => {
|
|
456
|
+
if (claim[i] !== -1 || e.type !== type)
|
|
457
|
+
return;
|
|
458
|
+
const node = index.get(e.nodeId);
|
|
459
|
+
if (!node)
|
|
460
|
+
return;
|
|
461
|
+
if (node.parentId != null && isSameChange(node.parentId))
|
|
462
|
+
return;
|
|
463
|
+
out.push({ idx: i, node });
|
|
464
|
+
});
|
|
465
|
+
return out;
|
|
466
|
+
}
|
|
467
|
+
function collectSubtree(root, nodes) {
|
|
468
|
+
const children = new Map();
|
|
469
|
+
for (const n of nodes) {
|
|
470
|
+
if (n.parentId == null)
|
|
471
|
+
continue;
|
|
472
|
+
const bucket = children.get(n.parentId);
|
|
473
|
+
if (bucket)
|
|
474
|
+
bucket.push(n);
|
|
475
|
+
else
|
|
476
|
+
children.set(n.parentId, [n]);
|
|
477
|
+
}
|
|
478
|
+
const out = [];
|
|
479
|
+
const stack = [root];
|
|
480
|
+
while (stack.length > 0) {
|
|
481
|
+
const n = stack.pop();
|
|
482
|
+
out.push(n);
|
|
483
|
+
for (const c of children.get(n.id) ?? [])
|
|
484
|
+
stack.push(c);
|
|
485
|
+
}
|
|
486
|
+
return out;
|
|
487
|
+
}
|
|
488
|
+
function furnitureSummary(pageCount, extra) {
|
|
489
|
+
if (pageCount.type !== 'page-count-changed')
|
|
490
|
+
return pageCount.message;
|
|
491
|
+
const shed = pageCount.to < pageCount.from;
|
|
492
|
+
const pages = Math.abs(pageCount.to - pageCount.from);
|
|
493
|
+
const noun = `repeated header/footer element${extra === 1 ? '' : 's'}`;
|
|
494
|
+
const where = `${shed ? 'removed' : 'new'} page${pages === 1 ? '' : 's'}`;
|
|
495
|
+
return `${pageCount.message} (${shed ? '-' : '+'}${extra} ${noun} on the ${where})`;
|
|
496
|
+
}
|
|
497
|
+
// ── Rule 1 helpers ──────────────────────────────────────────────────────────
|
|
498
|
+
/**
|
|
499
|
+
* Within one snapshot, map every table fragment that exists only on this side to
|
|
500
|
+
* the nearest preceding fragment the matcher recognised. A table crossing a page
|
|
501
|
+
* break is reported by the extractor as two whole tables, and which side holds
|
|
502
|
+
* the extra fragment depends purely on which way the change went — so this runs
|
|
503
|
+
* over the baseline and the new snapshot alike, keyed off `paired` (this side's
|
|
504
|
+
* ids that the matcher resolved to a counterpart).
|
|
505
|
+
*
|
|
506
|
+
* Pairing rather than event type is the anchor test on purpose: the surviving
|
|
507
|
+
* fragment's event is filed under the *other* snapshot's id, so asking "does
|
|
508
|
+
* this fragment have a non-additive event here" answers yes going forwards and
|
|
509
|
+
* no going backwards, which is exactly how deletions stopped grouping.
|
|
510
|
+
*
|
|
511
|
+
* Only when the page count changed: absent that, a second table really is a
|
|
512
|
+
* second table and deserves its own top-level event.
|
|
513
|
+
*/
|
|
514
|
+
function continuationAnchors(nodes, rank, paired, pageCountChanged) {
|
|
515
|
+
const out = new Map();
|
|
516
|
+
if (!pageCountChanged)
|
|
517
|
+
return out;
|
|
518
|
+
const tables = nodes
|
|
519
|
+
.filter((n) => n.role === 'table')
|
|
520
|
+
.sort((a, b) => (rank.get(a.id) ?? 0) - (rank.get(b.id) ?? 0));
|
|
521
|
+
let anchor = null;
|
|
522
|
+
for (const t of tables) {
|
|
523
|
+
if (paired.has(t.id))
|
|
524
|
+
anchor = t.id;
|
|
525
|
+
else if (anchor != null)
|
|
526
|
+
out.set(t.id, anchor);
|
|
527
|
+
}
|
|
528
|
+
return out;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* The canonical key of the logical table this add/remove belongs to, or null.
|
|
532
|
+
*
|
|
533
|
+
* The key is side-prefixed (`next:<id>` / `base:<id>`) because a table only
|
|
534
|
+
* present in the baseline has no new-snapshot id to be named by, and forcing one
|
|
535
|
+
* is what made deletions ungroupable: every descendant of a vanished fragment
|
|
536
|
+
* failed its `baseToNext` lookup and fell out as a loose row.
|
|
537
|
+
*/
|
|
538
|
+
function owningTable(e, t) {
|
|
539
|
+
const fromBase = e.type === 'element-removed';
|
|
540
|
+
const index = fromBase ? t.baseById : t.nextById;
|
|
541
|
+
const cont = fromBase ? t.contBase : t.contNext;
|
|
542
|
+
const node = 'nodeId' in e ? index.get(e.nodeId) : undefined;
|
|
543
|
+
if (!node)
|
|
544
|
+
return null;
|
|
545
|
+
let table;
|
|
546
|
+
if (node.role === 'table') {
|
|
547
|
+
// A table's own add/remove groups only when it is a continuation fragment of
|
|
548
|
+
// a table that survived; otherwise it is a finding in its own right.
|
|
549
|
+
const anchor = cont.get(node.id);
|
|
550
|
+
if (anchor == null)
|
|
551
|
+
return null;
|
|
552
|
+
table = index.get(anchor);
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
if (!TABLE_PARTS.has(node.role))
|
|
556
|
+
return null;
|
|
557
|
+
let cur = node;
|
|
558
|
+
while (cur?.parentId != null) {
|
|
559
|
+
const parent = index.get(cur.parentId);
|
|
560
|
+
if (!parent)
|
|
561
|
+
return null;
|
|
562
|
+
if (parent.role === 'table') {
|
|
563
|
+
table = parent;
|
|
564
|
+
break;
|
|
565
|
+
}
|
|
566
|
+
cur = parent;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (!table)
|
|
570
|
+
return null;
|
|
571
|
+
// Rows and cells under a continuation fragment belong to its anchor table.
|
|
572
|
+
const anchorId = cont.get(table.id) ?? table.id;
|
|
573
|
+
const nextId = fromBase ? t.baseToNext.get(anchorId) : anchorId;
|
|
574
|
+
if (nextId != null && t.eventIdxByNextId.has(nextId))
|
|
575
|
+
return `next:${nextId}`;
|
|
576
|
+
const baseId = fromBase ? anchorId : t.nextToBase.get(anchorId);
|
|
577
|
+
if (baseId != null && t.eventIdxByBaseId.has(baseId))
|
|
578
|
+
return `base:${baseId}`;
|
|
579
|
+
return null;
|
|
580
|
+
}
|
|
581
|
+
function splitKey(key) {
|
|
582
|
+
const at = key.indexOf(':');
|
|
583
|
+
return { side: key.slice(0, at), id: key.slice(at + 1) };
|
|
584
|
+
}
|
|
585
|
+
/** The event index that heads this table's group. */
|
|
586
|
+
function tableRootIdx(key, t) {
|
|
587
|
+
const { side, id } = splitKey(key);
|
|
588
|
+
return side === 'next' ? t.eventIdxByNextId.get(id) : t.eventIdxByBaseId.get(id);
|
|
589
|
+
}
|
|
590
|
+
/** The anchor fragment plus every continuation fragment that points at it. */
|
|
591
|
+
function fragmentsOf(anchorId, index, cont) {
|
|
592
|
+
if (anchorId == null)
|
|
593
|
+
return [];
|
|
594
|
+
const anchor = index.get(anchorId);
|
|
595
|
+
const out = anchor ? [anchor] : [];
|
|
596
|
+
for (const [id, a] of cont) {
|
|
597
|
+
if (a !== anchorId)
|
|
598
|
+
continue;
|
|
599
|
+
const n = index.get(id);
|
|
600
|
+
if (n)
|
|
601
|
+
out.push(n);
|
|
602
|
+
}
|
|
603
|
+
return out.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order);
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* The table's before/after shape is read from the *structure* — every fragment
|
|
607
|
+
* on each side — rather than from the group's member events. Scanning members
|
|
608
|
+
* only ever sees the fragments that changed, so on a shrink it would miss the
|
|
609
|
+
* baseline's continuation fragment entirely and report a 21-row table as a
|
|
610
|
+
* 9-row one. Row and cell counts still come from the members, so the numbers in
|
|
611
|
+
* the headline always agree with what is inside the group.
|
|
612
|
+
*/
|
|
613
|
+
function tableSummary(key, t, members, events) {
|
|
614
|
+
const { side, id } = splitKey(key);
|
|
615
|
+
const baseFrags = fragmentsOf(side === 'base' ? id : t.nextToBase.get(id), t.baseById, t.contBase);
|
|
616
|
+
const nextFrags = fragmentsOf(side === 'next' ? id : t.baseToNext.get(id), t.nextById, t.contNext);
|
|
617
|
+
let rows = 0;
|
|
618
|
+
let cells = 0;
|
|
619
|
+
for (const m of members) {
|
|
620
|
+
const e = events[m];
|
|
621
|
+
if (!('nodeId' in e))
|
|
622
|
+
continue;
|
|
623
|
+
const removed = e.type === 'element-removed';
|
|
624
|
+
const n = (removed ? t.baseById : t.nextById).get(e.nodeId);
|
|
625
|
+
if (!n)
|
|
626
|
+
continue;
|
|
627
|
+
const sign = removed ? -1 : 1;
|
|
628
|
+
if (n.role === 'row')
|
|
629
|
+
rows += sign;
|
|
630
|
+
else if (n.role === 'cell')
|
|
631
|
+
cells += sign;
|
|
632
|
+
}
|
|
633
|
+
const delta = [
|
|
634
|
+
rows !== 0 ? `${rows > 0 ? '+' : ''}${rows} row${Math.abs(rows) === 1 ? '' : 's'}` : null,
|
|
635
|
+
cells !== 0 ? `${cells > 0 ? '+' : ''}${cells} cell${Math.abs(cells) === 1 ? '' : 's'}` : null,
|
|
636
|
+
]
|
|
637
|
+
.filter(Boolean)
|
|
638
|
+
.join(', ');
|
|
639
|
+
if (baseFrags.length === 0) {
|
|
640
|
+
return { summary: `table added (${dims(nextFrags)})${delta ? `, ${delta}` : ''}`, label: 'the new table' };
|
|
641
|
+
}
|
|
642
|
+
if (nextFrags.length === 0) {
|
|
643
|
+
return { summary: `table removed (${dims(baseFrags)})${delta ? `, ${delta}` : ''}`, label: 'the removed table' };
|
|
644
|
+
}
|
|
645
|
+
const before = totalRows(baseFrags);
|
|
646
|
+
const after = totalRows(nextFrags);
|
|
647
|
+
const verb = after < before ? 'shrank' : after > before ? 'grew' : 'changed';
|
|
648
|
+
const pages = [...new Set(nextFrags.map((f) => f.pageIndex + 1))].sort((a, b) => a - b);
|
|
649
|
+
const span = pages.length > 1 ? `, now spans pages ${pages[0]}–${pages[pages.length - 1]}` : '';
|
|
650
|
+
return {
|
|
651
|
+
summary: `table ${verb}${delta ? ` ${delta}` : ''} (${dims(baseFrags)} → ${dims(nextFrags)})${span}`,
|
|
652
|
+
label: verb === 'shrank' ? 'the table shrinking' : "the table's growth",
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
function totalRows(frags) {
|
|
656
|
+
return frags.reduce((s, f) => s + (f.table?.rows ?? 0), 0);
|
|
657
|
+
}
|
|
658
|
+
function dims(frags) {
|
|
659
|
+
return `${totalRows(frags)}×${frags[0]?.table?.cols ?? '?'}`;
|
|
660
|
+
}
|
|
661
|
+
// ── Rule 2 helpers ──────────────────────────────────────────────────────────
|
|
662
|
+
/**
|
|
663
|
+
* The nearest group root that precedes the whole run in document order — this
|
|
664
|
+
* is what turns "23 things moved" into "23 things moved *because of this*".
|
|
665
|
+
* `page-count-changed` has no position, so it is the last-resort cause.
|
|
666
|
+
*/
|
|
667
|
+
function nearestPrecedingCause(groups, events, rankInNext, firstMemberRank, pageCountIdx) {
|
|
668
|
+
let best = null;
|
|
669
|
+
let bestRank = -Infinity;
|
|
670
|
+
for (const g of groups) {
|
|
671
|
+
// A cascade is an effect, never a cause; citing one would produce "N moved
|
|
672
|
+
// following M moved following the real thing". A value change swaps one
|
|
673
|
+
// string for another in place, so it cannot push content across a page
|
|
674
|
+
// boundary and is never the reason a page shifted either.
|
|
675
|
+
if (g.kind === 'page-shift-cascade' || g.kind === 'value-changed')
|
|
676
|
+
continue;
|
|
677
|
+
const root = events[g.rootIdx];
|
|
678
|
+
if (!('nodeId' in root))
|
|
679
|
+
continue;
|
|
680
|
+
const rank = rankInNext(root.nodeId);
|
|
681
|
+
if (rank == null || rank >= firstMemberRank)
|
|
682
|
+
continue;
|
|
683
|
+
if (rank > bestRank) {
|
|
684
|
+
bestRank = rank;
|
|
685
|
+
best = { summary: g.summary, label: g.label };
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
if (best)
|
|
689
|
+
return best;
|
|
690
|
+
if (pageCountIdx !== -1)
|
|
691
|
+
return { summary: events[pageCountIdx].message };
|
|
692
|
+
return null;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Split a same-delta set of moves into maximal runs that are contiguous in
|
|
696
|
+
* document order, tolerating two kinds of gap: a node that is the subject of
|
|
697
|
+
* some other event in this diff, and a repeated fixed element.
|
|
698
|
+
*
|
|
699
|
+
* The second is not a fixture-specific escape hatch. A running header or footer
|
|
700
|
+
* is page-anchored, so it correctly does *not* move when the content around it
|
|
701
|
+
* shifts, and it will therefore break a downstream run at every single page
|
|
702
|
+
* boundary in every document that has one.
|
|
703
|
+
*
|
|
704
|
+
* Anything else in the gap is content that stayed put while its neighbours
|
|
705
|
+
* moved — which is not a cascade, so the run ends there.
|
|
706
|
+
*/
|
|
707
|
+
function contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated, movedIds) {
|
|
708
|
+
const byRank = new Map();
|
|
709
|
+
for (const n of nextNodes) {
|
|
710
|
+
const r = nextRank.get(n.id);
|
|
711
|
+
if (r != null)
|
|
712
|
+
byRank.set(r, n);
|
|
713
|
+
}
|
|
714
|
+
const cache = new Map();
|
|
715
|
+
const subtree = (n) => {
|
|
716
|
+
let s = cache.get(n.id);
|
|
717
|
+
if (!s)
|
|
718
|
+
cache.set(n.id, (s = collectSubtree(n, nextNodes)));
|
|
719
|
+
return s;
|
|
720
|
+
};
|
|
721
|
+
const bridges = (from, to) => {
|
|
722
|
+
for (let r = from + 1; r < to; r++) {
|
|
723
|
+
const node = byRank.get(r);
|
|
724
|
+
if (!node)
|
|
725
|
+
return false;
|
|
726
|
+
if (eventIdxByNextId.has(node.id))
|
|
727
|
+
continue; // changed for its own reasons
|
|
728
|
+
const inside = subtree(node);
|
|
729
|
+
// Page-anchored, and so correctly did not move.
|
|
730
|
+
if (inside.some((d) => d.normText != null && repeated.has(d.normText)))
|
|
731
|
+
continue;
|
|
732
|
+
// An anonymous layout container whose own children are in this very run.
|
|
733
|
+
// Containers have no text to match on, so the matcher pairs them by
|
|
734
|
+
// position and they often end up without a move event even though
|
|
735
|
+
// everything they hold moved. That is a gap in the pairing, not content
|
|
736
|
+
// that stayed behind — the evidence comes from the run itself, so this
|
|
737
|
+
// can never bridge two unrelated regions together.
|
|
738
|
+
if (inside.some((d) => d.id !== node.id && movedIds.has(d.id)))
|
|
739
|
+
continue;
|
|
740
|
+
return false;
|
|
741
|
+
}
|
|
742
|
+
return true;
|
|
743
|
+
};
|
|
744
|
+
const runs = [];
|
|
745
|
+
let current = [ranked[0]];
|
|
746
|
+
for (let k = 1; k < ranked.length; k++) {
|
|
747
|
+
if (bridges(ranked[k - 1].rank, ranked[k].rank))
|
|
748
|
+
current.push(ranked[k]);
|
|
749
|
+
else {
|
|
750
|
+
runs.push(current);
|
|
751
|
+
current = [ranked[k]];
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
runs.push(current);
|
|
755
|
+
return runs;
|
|
756
|
+
}
|
|
757
|
+
function cascadeSummary(count, delta, idxs, events, cause) {
|
|
758
|
+
const hops = [
|
|
759
|
+
...new Set(idxs.map((i) => {
|
|
760
|
+
const e = events[i];
|
|
761
|
+
return e.type === 'element-moved-to-different-page' ? `${e.fromPage + 1}→${e.toPage + 1}` : '';
|
|
762
|
+
})),
|
|
763
|
+
]
|
|
764
|
+
.filter(Boolean)
|
|
765
|
+
.sort();
|
|
766
|
+
const dir = delta > 0 ? `+${delta}` : `${delta}`;
|
|
767
|
+
return `${count} elements shifted ${dir} page${Math.abs(delta) === 1 ? '' : 's'} (${hops.join(', ')}) following ${cause.label ?? cause.summary}`;
|
|
768
|
+
}
|
|
769
|
+
// ── Shared helpers ──────────────────────────────────────────────────────────
|
|
770
|
+
function byId(nodes) {
|
|
771
|
+
return new Map(nodes.map((n) => [n.id, n]));
|
|
772
|
+
}
|
|
773
|
+
function readingRank(nodes) {
|
|
774
|
+
const out = new Map();
|
|
775
|
+
[...nodes]
|
|
776
|
+
.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order)
|
|
777
|
+
.forEach((n, i) => out.set(n.id, i));
|
|
778
|
+
return out;
|
|
779
|
+
}
|
|
780
|
+
function isTexty(role) {
|
|
781
|
+
return role === 'text' || role === 'heading';
|
|
782
|
+
}
|
|
783
|
+
//# sourceMappingURL=group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/diff/group.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
CHANGED
|
@@ -53,6 +53,12 @@ export interface ElementAddedEvent extends BaseEvent {
|
|
|
53
53
|
}
|
|
54
54
|
export interface ElementRemovedEvent extends BaseEvent {
|
|
55
55
|
type: 'element-removed';
|
|
56
|
+
/**
|
|
57
|
+
* Id in the *baseline* snapshot — a removed node exists nowhere else. Every
|
|
58
|
+
* other event's `nodeId` refers to the new run; this one cannot, so callers
|
|
59
|
+
* resolving ids must pick the matching snapshot.
|
|
60
|
+
*/
|
|
61
|
+
nodeId: string;
|
|
56
62
|
role: NodeRole;
|
|
57
63
|
textPreview: string;
|
|
58
64
|
pageIndex: number;
|
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AA8GA,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACnE,oBAAoB,EAAE,OAAO;IAC7B,2BAA2B,EAAE,OAAO;IACpC,2BAA2B,EAAE,OAAO;IACpC,iCAAiC,EAAE,MAAM;IACzC,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;IACvB,iBAAiB,EAAE,MAAM;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fromPdf.d.ts","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAShE;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"fromPdf.d.ts","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAShE;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,kBAAkB,CAAC,CA6G7B"}
|
package/dist/extract/fromPdf.js
CHANGED
|
@@ -18,8 +18,22 @@ export async function fromPdf(bytes, opts) {
|
|
|
18
18
|
const page = await doc.getPage(i);
|
|
19
19
|
perPage.push(await extractTextRuns(page));
|
|
20
20
|
}
|
|
21
|
-
//
|
|
22
|
-
|
|
21
|
+
// Detect tables up front and collect the runs they consume, so the heading
|
|
22
|
+
// model can be built from PROSE only. Table cell text is often voluminous and,
|
|
23
|
+
// in HTML/CSS output, smaller than body prose; left in, it drags the
|
|
24
|
+
// char-count-weighted body-size baseline down and mis-flags paragraphs as
|
|
25
|
+
// headings. The doc-wide model keeps heading levels consistent across pages.
|
|
26
|
+
const pageTables = perPage.map((pg) => detectTables(pg.runs));
|
|
27
|
+
const consumed = new Set();
|
|
28
|
+
for (const tables of pageTables) {
|
|
29
|
+
for (const t of tables)
|
|
30
|
+
for (const row of t.rows)
|
|
31
|
+
for (const cell of row.cells)
|
|
32
|
+
for (const r of cell.runs)
|
|
33
|
+
consumed.add(r);
|
|
34
|
+
}
|
|
35
|
+
const proseRuns = perPage.flatMap((p) => p.runs).filter((r) => !consumed.has(r));
|
|
36
|
+
const headingModel = buildHeadingModel(proseRuns.length > 0 ? proseRuns : perPage.flatMap((p) => p.runs));
|
|
23
37
|
const rawPages = [];
|
|
24
38
|
const rawNodes = [];
|
|
25
39
|
let counter = 0;
|
|
@@ -32,8 +46,7 @@ export async function fromPdf(bytes, opts) {
|
|
|
32
46
|
contentBox: inferContentBox(pg.runs, pg.width, pg.height),
|
|
33
47
|
});
|
|
34
48
|
const overflowOf = buildOverflowModel(pg.runs, pg.width);
|
|
35
|
-
const tables =
|
|
36
|
-
const consumed = new Set();
|
|
49
|
+
const tables = pageTables[pageIndex] ?? [];
|
|
37
50
|
for (const table of tables) {
|
|
38
51
|
const tableTempId = nextId();
|
|
39
52
|
rawNodes.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fromPdf.js","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAiB,EACjB,IAAyD;IAEzD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,OAAO,GAA4D,EAAE,CAAC;IAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"fromPdf.js","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textRuns.d.ts","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"textRuns.d.ts","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmChE"}
|
|
@@ -21,7 +21,12 @@ export async function extractTextRuns(page) {
|
|
|
21
21
|
const items = content.items.filter((it) => typeof it?.str === 'string');
|
|
22
22
|
const raw = [];
|
|
23
23
|
for (const it of items) {
|
|
24
|
-
|
|
24
|
+
// Skip whitespace-only items. Some producers (react-pdf, PDFKit, Chrome)
|
|
25
|
+
// emit inter-column space glyphs; if kept, mergeRuns chains through them
|
|
26
|
+
// (word + spaces + word), collapsing a whole table row into one run and
|
|
27
|
+
// erasing the columns table detection needs. Real word spacing is still
|
|
28
|
+
// reconstructed from the inter-run gap below.
|
|
29
|
+
if (it.str.trim().length === 0)
|
|
25
30
|
continue;
|
|
26
31
|
const t = it.transform;
|
|
27
32
|
const x = t[4] ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textRuns.js","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAC7C,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;IAE3F,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"textRuns.js","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export { fromPdf } from './extract/fromPdf.js';
|
|
|
8
8
|
export { diffSnapshots } from './diff/diff.js';
|
|
9
9
|
export { matchNodes } from './diff/match.js';
|
|
10
10
|
export type { MatchResult, NodePair } from './diff/match.js';
|
|
11
|
+
export { groupEvents } from './diff/group.js';
|
|
12
|
+
export type { EventGroup, GroupKind } from './diff/group.js';
|
|
11
13
|
export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
|
|
12
14
|
export { loadSnapshotFromFile } from './snapshot/load.js';
|
|
13
15
|
export { serializeSnapshot, computeContentHash, stableStringify } from './snapshot/serialize.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,9 @@ export { fromPdf } from './extract/fromPdf.js';
|
|
|
6
6
|
// Diff engine
|
|
7
7
|
export { diffSnapshots } from './diff/diff.js';
|
|
8
8
|
export { matchNodes } from './diff/match.js';
|
|
9
|
+
// Causal grouping — a *view* over the event list for human-facing output.
|
|
10
|
+
// Never changes DiffResult, the JSON output, or the fail gate.
|
|
11
|
+
export { groupEvents } from './diff/group.js';
|
|
9
12
|
// Snapshot IO + helpers
|
|
10
13
|
export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
|
|
11
14
|
export { loadSnapshotFromFile } from './snapshot/load.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AA+BxC,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE/E,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AA+BxC,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE/E,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,0EAA0E;AAC1E,+DAA+D;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|