@pdf-testkit/core 0.1.0 → 0.1.2
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 +629 -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 +9 -6
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":"AACA,OAAO,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,QAA4B,EAC5B,IAAwB,EACxB,OAAoB,EAAE;IAEtB,6EAA6E;IAC7E,qDAAqD;IACrD,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACvG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,IAAI,8BAA8B,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAW,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,IAAuB,EAAY,EAAE,CACvD,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,UAAU,CAAC,oBAAoB,CAAC;YAC1C,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,EAAE,EAAE,IAAI,CAAC,SAAS;YAClB,OAAO,EAAE,sBAAsB,QAAQ,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,EAAE;SACxE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEnE,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;YACrD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YACtE,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC;oBACnC,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;oBACxB,MAAM,EAAE,KAAK,CAAC,SAAS;oBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,KAAK,CAAC,IAAI;oBAClB,OAAO,EAAE,SAAS;wBAChB,CAAC,CAAC,yBAAyB,IAAI,CAAC,SAAS,GAAG,CAAC,YAAY,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE;wBAC9E,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE;iBACxG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,iCAAiC;gBACvC,QAAQ,EAAE,UAAU,CAAC,iCAAiC,CAAC;gBACvD,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,EAAE;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBACpC,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,MAAM,EAAE,KAAK,CAAC,SAAS;gBACvB,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,GAAG,CAAC,YAAY,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE;aACnG,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YACpG,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,2BAA2B;gBACjC,QAAQ,EAAE,UAAU,CAAC,2BAA2B,CAAC;gBACjD,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,EAAE;gBAChB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBACpC,SAAS,EAAE,IAAI,CAAC,YAAY;gBAC5B,OAAO,EAAE,KAAK,CAAC,YAAY;gBAC3B,OAAO,EAAE,YAAY,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;aACnI,CAAC,CAAC;QACL,CAAC;QAED,sEAAsE;QACtE,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC;YACrC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;SACjE,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC;YACvC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;IACrE,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC5B,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,QAAQ,CAAC,WAAW;QAClC,OAAO,EAAE,IAAI,CAAC,WAAW;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,IAAoB,EACpB,QAAkB,EAClB,UAAkB;IAElB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAS,CAAC;IACzB,OAAO;QACL,IAAI,EAAE,2BAA2B;QACjC,QAAQ;QACR,UAAU;QACV,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,WAAW,OAAO,CAAC,CAAC,IAAI,GAAG;KACjG,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAoB;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAoB;IACpC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AAC3C,CAAC"}
|
|
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-grew' | '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,YAAY,GACZ,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;AA0BD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,GAAE,WAAgB,GACrB,UAAU,EAAE,CAqKd"}
|
|
@@ -0,0 +1,629 @@
|
|
|
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 nextRank = readingRank(nextNodes);
|
|
57
|
+
// Re-run the matcher rather than threading its result out of `diffSnapshots`:
|
|
58
|
+
// it is deterministic over the same inputs, and grouping needs the *pairing*
|
|
59
|
+
// (which base node became which next node) that the flat event list drops.
|
|
60
|
+
const { pairs } = matchNodes(baseNodes, nextNodes);
|
|
61
|
+
const baseToNext = new Map();
|
|
62
|
+
for (const p of pairs)
|
|
63
|
+
baseToNext.set(p.base.id, p.next.id);
|
|
64
|
+
// Event indices that carry a resolvable node, split by which snapshot the id
|
|
65
|
+
// belongs to. `element-removed` is the only one pointing at the baseline.
|
|
66
|
+
// One node can produce several events (an added cell that also overflows), so
|
|
67
|
+
// a structural event always wins the slot over a decorative one.
|
|
68
|
+
const eventIdxByNextId = new Map();
|
|
69
|
+
const eventIdxByBaseId = new Map();
|
|
70
|
+
events.forEach((e, i) => {
|
|
71
|
+
if (!('nodeId' in e))
|
|
72
|
+
return;
|
|
73
|
+
const into = e.type === 'element-removed' ? eventIdxByBaseId : eventIdxByNextId;
|
|
74
|
+
const held = into.get(e.nodeId);
|
|
75
|
+
if (held != null && !STRUCTURAL.has(e.type))
|
|
76
|
+
return;
|
|
77
|
+
if (held != null && STRUCTURAL.has(events[held].type))
|
|
78
|
+
return;
|
|
79
|
+
into.set(e.nodeId, i);
|
|
80
|
+
});
|
|
81
|
+
const pageCountIdx = events.findIndex((e) => e.type === 'page-count-changed');
|
|
82
|
+
const repeated = repeatedNormTexts(nextNodes);
|
|
83
|
+
/** -1 = unclaimed. Otherwise the index of the group this event belongs to. */
|
|
84
|
+
const claim = new Array(events.length).fill(-1);
|
|
85
|
+
const groups = [];
|
|
86
|
+
const open = (kind, rootIdx, summary) => {
|
|
87
|
+
const id = groups.length;
|
|
88
|
+
groups.push({ kind, rootIdx, members: [rootIdx], summary });
|
|
89
|
+
claim[rootIdx] = id;
|
|
90
|
+
return id;
|
|
91
|
+
};
|
|
92
|
+
const attach = (groupId, idx) => {
|
|
93
|
+
if (claim[idx] !== -1)
|
|
94
|
+
return;
|
|
95
|
+
claim[idx] = groupId;
|
|
96
|
+
groups[groupId].members.push(idx);
|
|
97
|
+
};
|
|
98
|
+
// ── Rule 4 — paired value change ───────────────────────────────────────────
|
|
99
|
+
// Runs FIRST, and deliberately pairs rather than collapses. A removed+added
|
|
100
|
+
// text at the same slot is a real content change (here: three totals moving
|
|
101
|
+
// by ~3x). Letting a later rule fold it into a "downstream cascade" summary
|
|
102
|
+
// would hide the one fact in the whole diff a reviewer must not miss.
|
|
103
|
+
for (const [removedIdx, addedIdx] of pairValueChanges(events, baseById, nextById, baseToNext)) {
|
|
104
|
+
const removed = events[removedIdx];
|
|
105
|
+
const added = events[addedIdx];
|
|
106
|
+
const before = 'textPreview' in removed ? removed.textPreview : '';
|
|
107
|
+
const after = 'textPreview' in added ? added.textPreview : '';
|
|
108
|
+
const role = 'role' in added ? added.role : 'element';
|
|
109
|
+
const id = open('value-changed', addedIdx, `${role} "${before}" → "${after}"`);
|
|
110
|
+
attach(id, removedIdx);
|
|
111
|
+
}
|
|
112
|
+
// ── Rule 3 — new-page furniture ────────────────────────────────────────────
|
|
113
|
+
// A page that did not exist in the baseline brings a fresh copy of every
|
|
114
|
+
// repeated fixed element with it. Those adds are a restatement of
|
|
115
|
+
// `page-count-changed`, not independent findings.
|
|
116
|
+
if (pageCountIdx !== -1) {
|
|
117
|
+
const furniture = [];
|
|
118
|
+
for (const root of addedSubtreeRoots(events, claim, nextById, eventIdxByNextId)) {
|
|
119
|
+
if (root.node.pageIndex < baseline.pageCount)
|
|
120
|
+
continue;
|
|
121
|
+
const subtree = collectSubtree(root.node, nextNodes);
|
|
122
|
+
if (!subtree.some((n) => n.normText != null && repeated.has(n.normText)))
|
|
123
|
+
continue;
|
|
124
|
+
for (const n of subtree) {
|
|
125
|
+
const idx = eventIdxByNextId.get(n.id);
|
|
126
|
+
if (idx != null && claim[idx] === -1)
|
|
127
|
+
furniture.push(idx);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (furniture.length > 0) {
|
|
131
|
+
const id = open('new-page-furniture', pageCountIdx, furnitureSummary(events[pageCountIdx], furniture.length));
|
|
132
|
+
for (const idx of furniture)
|
|
133
|
+
attach(id, idx);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ── Rule 1 — table subtree growth ──────────────────────────────────────────
|
|
137
|
+
// Restricted to row/cell/table roles on purpose. "Anything added under a node
|
|
138
|
+
// that changed" would swallow a new paragraph inside a container that merely
|
|
139
|
+
// moved; a row or a cell, by contrast, has no meaning apart from its table.
|
|
140
|
+
// A table that starts spanning pages gains a continuation fragment, which the
|
|
141
|
+
// extractor reports as a whole new table. Resolve those to the fragment that
|
|
142
|
+
// actually paired, so one logical table produces one group rather than two.
|
|
143
|
+
const continuationOf = continuationFragments(events, nextById, eventIdxByNextId, nextRank, pageCountIdx !== -1);
|
|
144
|
+
const tableGroups = new Map(); // primary next table id -> group id
|
|
145
|
+
for (let i = 0; i < events.length; i++) {
|
|
146
|
+
if (claim[i] !== -1)
|
|
147
|
+
continue;
|
|
148
|
+
const e = events[i];
|
|
149
|
+
if (e.type !== 'element-added' && e.type !== 'element-removed')
|
|
150
|
+
continue;
|
|
151
|
+
const owner = owningTable(e, baseById, nextById, baseToNext, eventIdxByNextId, continuationOf);
|
|
152
|
+
if (owner == null)
|
|
153
|
+
continue;
|
|
154
|
+
let gid = tableGroups.get(owner);
|
|
155
|
+
if (gid == null) {
|
|
156
|
+
const rootIdx = eventIdxByNextId.get(owner);
|
|
157
|
+
if (rootIdx == null || claim[rootIdx] !== -1)
|
|
158
|
+
continue;
|
|
159
|
+
gid = open('table-grew', rootIdx, '');
|
|
160
|
+
tableGroups.set(owner, gid);
|
|
161
|
+
}
|
|
162
|
+
attach(gid, i);
|
|
163
|
+
}
|
|
164
|
+
for (const [tableId, gid] of tableGroups) {
|
|
165
|
+
groups[gid].summary = tableSummary(tableId, baseById, nextById, baseToNext, groups[gid].members, events);
|
|
166
|
+
}
|
|
167
|
+
// ── Rule 2 — uniform page-shift cascade ────────────────────────────────────
|
|
168
|
+
// Partitioned by page *delta*, not destination: on the invoice fixture 8
|
|
169
|
+
// elements go page 1→2 and 6 go page 2→3, so "everything moved to page 3"
|
|
170
|
+
// would be flatly wrong. Partitioning by delta also separates two independent
|
|
171
|
+
// insertions automatically, since they produce +1 and +2 regions.
|
|
172
|
+
const movesByDelta = new Map();
|
|
173
|
+
events.forEach((e, i) => {
|
|
174
|
+
if (claim[i] !== -1 || e.type !== 'element-moved-to-different-page')
|
|
175
|
+
return;
|
|
176
|
+
const d = e.toPage - e.fromPage;
|
|
177
|
+
const bucket = movesByDelta.get(d);
|
|
178
|
+
if (bucket)
|
|
179
|
+
bucket.push(i);
|
|
180
|
+
else
|
|
181
|
+
movesByDelta.set(d, [i]);
|
|
182
|
+
});
|
|
183
|
+
for (const [delta, idxs] of movesByDelta) {
|
|
184
|
+
if (idxs.length < MIN_CASCADE_MEMBERS)
|
|
185
|
+
continue;
|
|
186
|
+
const ranked = idxs
|
|
187
|
+
.map((i) => ({ i, rank: nextRank.get(events[i].nodeId) ?? -1 }))
|
|
188
|
+
.filter((m) => m.rank >= 0)
|
|
189
|
+
.sort((a, b) => a.rank - b.rank);
|
|
190
|
+
if (ranked.length < MIN_CASCADE_MEMBERS)
|
|
191
|
+
continue;
|
|
192
|
+
// A shared delta does not imply a shared cause: two separate insertions in
|
|
193
|
+
// different parts of a document both push everything after them one page
|
|
194
|
+
// down. Split the bucket into contiguous document runs and judge each on
|
|
195
|
+
// its own, so a genuine two-region regression reports as two findings
|
|
196
|
+
// rather than one false "everything shifted" line.
|
|
197
|
+
for (const run of contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated)) {
|
|
198
|
+
if (run.length < MIN_CASCADE_MEMBERS)
|
|
199
|
+
continue;
|
|
200
|
+
const cause = nearestPrecedingCause(groups, events, nextRank, run[0].rank, pageCountIdx);
|
|
201
|
+
if (cause == null)
|
|
202
|
+
continue; // No root -> no group. "These moved, cause unknown" helps nobody.
|
|
203
|
+
const id = open('page-shift-cascade', run[0].i, cascadeSummary(run.length, delta, run.map((m) => m.i), events, cause));
|
|
204
|
+
for (const m of run)
|
|
205
|
+
attach(id, m.i);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ── Everything else stays exactly as the diff reported it ──────────────────
|
|
209
|
+
for (let i = 0; i < events.length; i++) {
|
|
210
|
+
if (claim[i] === -1)
|
|
211
|
+
open('single', i, events[i].message);
|
|
212
|
+
}
|
|
213
|
+
return finalize(groups, events);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Enforce the hard severity invariant, then order for reading.
|
|
217
|
+
*
|
|
218
|
+
* A group never contains an event more severe than its root. An overflow error
|
|
219
|
+
* riding along on an added table cell, or a heading break sitting inside a
|
|
220
|
+
* shifted run, is ejected to its own top-level row rather than being quietly
|
|
221
|
+
* demoted into a warn-level summary. Severity has to mean the same thing
|
|
222
|
+
* everywhere or the gate stops meaning anything.
|
|
223
|
+
*/
|
|
224
|
+
function finalize(raw, events) {
|
|
225
|
+
// `at` is the root's index in the original event list; it orders groups within
|
|
226
|
+
// a severity band so output follows the order the diff engine reported.
|
|
227
|
+
const built = [];
|
|
228
|
+
for (const g of raw) {
|
|
229
|
+
const root = events[g.rootIdx];
|
|
230
|
+
const kept = [];
|
|
231
|
+
for (const idx of g.members) {
|
|
232
|
+
if (idx !== g.rootIdx && RANK[events[idx].severity] > RANK[root.severity]) {
|
|
233
|
+
const ejected = events[idx];
|
|
234
|
+
built.push({
|
|
235
|
+
at: idx,
|
|
236
|
+
group: { kind: 'single', root: ejected, severity: ejected.severity, summary: ejected.message, events: [ejected] },
|
|
237
|
+
});
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
kept.push(idx);
|
|
241
|
+
}
|
|
242
|
+
kept.sort((a, b) => (a === g.rootIdx ? -1 : b === g.rootIdx ? 1 : a - b));
|
|
243
|
+
// A group that lost everything but its root is just that event again.
|
|
244
|
+
const kind = kept.length === 1 ? 'single' : g.kind;
|
|
245
|
+
built.push({
|
|
246
|
+
at: g.rootIdx,
|
|
247
|
+
group: {
|
|
248
|
+
kind,
|
|
249
|
+
root,
|
|
250
|
+
severity: root.severity,
|
|
251
|
+
summary: kind === 'single' ? root.message : g.summary,
|
|
252
|
+
events: kept.map((i) => events[i]),
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
built.sort((a, b) => RANK[b.group.severity] - RANK[a.group.severity] || a.at - b.at);
|
|
257
|
+
return built.map((b) => b.group);
|
|
258
|
+
}
|
|
259
|
+
// ── Rule 4 helpers ──────────────────────────────────────────────────────────
|
|
260
|
+
/**
|
|
261
|
+
* A removed node and an added node are the *same slot* when they share a role,
|
|
262
|
+
* their parents correspond, and they sit at the same ordinal among their
|
|
263
|
+
* parent's same-role children.
|
|
264
|
+
*
|
|
265
|
+
* "Correspond" deliberately does not mean the matcher paired the two parents.
|
|
266
|
+
* Layout containers are anonymous — a FormePDF `View` has no text — so they all
|
|
267
|
+
* share the matcher's exact key and pair by global reading-order rank, which
|
|
268
|
+
* shifts wholesale the moment one container is inserted. Anchoring on a matched
|
|
269
|
+
* *child* instead (the "Subtotal" label next to the amount) is stable, because
|
|
270
|
+
* that child has content to match on.
|
|
271
|
+
*/
|
|
272
|
+
function pairValueChanges(events, baseById, nextById, baseToNext) {
|
|
273
|
+
const removed = [];
|
|
274
|
+
const added = [];
|
|
275
|
+
events.forEach((e, i) => {
|
|
276
|
+
if (e.type === 'element-removed') {
|
|
277
|
+
const n = baseById.get(e.nodeId);
|
|
278
|
+
if (n && isTexty(n.role))
|
|
279
|
+
removed.push({ idx: i, node: n });
|
|
280
|
+
}
|
|
281
|
+
else if (e.type === 'element-added') {
|
|
282
|
+
const n = nextById.get(e.nodeId);
|
|
283
|
+
if (n && isTexty(n.role))
|
|
284
|
+
added.push({ idx: i, node: n });
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
if (removed.length === 0 || added.length === 0)
|
|
288
|
+
return [];
|
|
289
|
+
const baseSiblings = siblingOrdinals([...baseById.values()]);
|
|
290
|
+
const nextSiblings = siblingOrdinals([...nextById.values()]);
|
|
291
|
+
const parentAnchor = anchorParents(baseById, nextById, baseToNext);
|
|
292
|
+
const taken = new Set();
|
|
293
|
+
const out = [];
|
|
294
|
+
for (const r of removed) {
|
|
295
|
+
if (r.node.parentId == null)
|
|
296
|
+
continue;
|
|
297
|
+
const mappedParent = parentAnchor.get(r.node.parentId);
|
|
298
|
+
if (mappedParent == null)
|
|
299
|
+
continue;
|
|
300
|
+
const match = added.find((a) => !taken.has(a.idx) &&
|
|
301
|
+
a.node.role === r.node.role &&
|
|
302
|
+
a.node.parentId === mappedParent &&
|
|
303
|
+
nextSiblings.get(a.node.id) === baseSiblings.get(r.node.id));
|
|
304
|
+
if (match) {
|
|
305
|
+
taken.add(match.idx);
|
|
306
|
+
out.push([r.idx, match.idx]);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return out;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* base parent id -> next parent id, inferred from where that parent's *matched
|
|
313
|
+
* children* ended up. Requires an outright winner: a tie means the children
|
|
314
|
+
* disagree about where their parent went, and a guess there is worse than
|
|
315
|
+
* declining to pair.
|
|
316
|
+
*/
|
|
317
|
+
function anchorParents(baseById, nextById, baseToNext) {
|
|
318
|
+
const votes = new Map();
|
|
319
|
+
for (const [baseId, nextId] of baseToNext) {
|
|
320
|
+
const b = baseById.get(baseId);
|
|
321
|
+
const n = nextById.get(nextId);
|
|
322
|
+
if (!b?.parentId || !n?.parentId)
|
|
323
|
+
continue;
|
|
324
|
+
let bucket = votes.get(b.parentId);
|
|
325
|
+
if (!bucket)
|
|
326
|
+
votes.set(b.parentId, (bucket = new Map()));
|
|
327
|
+
bucket.set(n.parentId, (bucket.get(n.parentId) ?? 0) + 1);
|
|
328
|
+
}
|
|
329
|
+
const out = new Map();
|
|
330
|
+
for (const [baseParent, bucket] of votes) {
|
|
331
|
+
const ranked = [...bucket].sort((a, b) => b[1] - a[1]);
|
|
332
|
+
if (ranked.length === 1 || ranked[0][1] > ranked[1][1])
|
|
333
|
+
out.set(baseParent, ranked[0][0]);
|
|
334
|
+
}
|
|
335
|
+
return out;
|
|
336
|
+
}
|
|
337
|
+
function siblingOrdinals(nodes) {
|
|
338
|
+
const byParent = new Map();
|
|
339
|
+
for (const n of nodes) {
|
|
340
|
+
const key = `${n.parentId ?? ''}|${n.role}`;
|
|
341
|
+
const bucket = byParent.get(key);
|
|
342
|
+
if (bucket)
|
|
343
|
+
bucket.push(n);
|
|
344
|
+
else
|
|
345
|
+
byParent.set(key, [n]);
|
|
346
|
+
}
|
|
347
|
+
const out = new Map();
|
|
348
|
+
for (const bucket of byParent.values()) {
|
|
349
|
+
bucket.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order);
|
|
350
|
+
bucket.forEach((n, i) => out.set(n.id, i));
|
|
351
|
+
}
|
|
352
|
+
return out;
|
|
353
|
+
}
|
|
354
|
+
// ── Rule 3 helpers ──────────────────────────────────────────────────────────
|
|
355
|
+
/** normTexts appearing on two or more pages — the running header/footer signature. */
|
|
356
|
+
function repeatedNormTexts(nodes) {
|
|
357
|
+
const pages = new Map();
|
|
358
|
+
for (const n of nodes) {
|
|
359
|
+
if (n.normText == null)
|
|
360
|
+
continue;
|
|
361
|
+
const seen = pages.get(n.normText);
|
|
362
|
+
if (seen)
|
|
363
|
+
seen.add(n.pageIndex);
|
|
364
|
+
else
|
|
365
|
+
pages.set(n.normText, new Set([n.pageIndex]));
|
|
366
|
+
}
|
|
367
|
+
const out = new Set();
|
|
368
|
+
for (const [text, seen] of pages)
|
|
369
|
+
if (seen.size >= 2)
|
|
370
|
+
out.add(text);
|
|
371
|
+
return out;
|
|
372
|
+
}
|
|
373
|
+
/** Added nodes whose parent is not itself added — the tops of added subtrees. */
|
|
374
|
+
function addedSubtreeRoots(events, claim, nextById, eventIdxByNextId) {
|
|
375
|
+
const isAdded = (id) => {
|
|
376
|
+
const idx = eventIdxByNextId.get(id);
|
|
377
|
+
return idx != null && events[idx].type === 'element-added';
|
|
378
|
+
};
|
|
379
|
+
const out = [];
|
|
380
|
+
events.forEach((e, i) => {
|
|
381
|
+
if (claim[i] !== -1 || e.type !== 'element-added')
|
|
382
|
+
return;
|
|
383
|
+
const node = nextById.get(e.nodeId);
|
|
384
|
+
if (!node)
|
|
385
|
+
return;
|
|
386
|
+
if (node.parentId != null && isAdded(node.parentId))
|
|
387
|
+
return;
|
|
388
|
+
out.push({ idx: i, node });
|
|
389
|
+
});
|
|
390
|
+
return out;
|
|
391
|
+
}
|
|
392
|
+
function collectSubtree(root, nodes) {
|
|
393
|
+
const children = new Map();
|
|
394
|
+
for (const n of nodes) {
|
|
395
|
+
if (n.parentId == null)
|
|
396
|
+
continue;
|
|
397
|
+
const bucket = children.get(n.parentId);
|
|
398
|
+
if (bucket)
|
|
399
|
+
bucket.push(n);
|
|
400
|
+
else
|
|
401
|
+
children.set(n.parentId, [n]);
|
|
402
|
+
}
|
|
403
|
+
const out = [];
|
|
404
|
+
const stack = [root];
|
|
405
|
+
while (stack.length > 0) {
|
|
406
|
+
const n = stack.pop();
|
|
407
|
+
out.push(n);
|
|
408
|
+
for (const c of children.get(n.id) ?? [])
|
|
409
|
+
stack.push(c);
|
|
410
|
+
}
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
function furnitureSummary(pageCount, extra) {
|
|
414
|
+
const to = pageCount.type === 'page-count-changed' ? pageCount.to : 0;
|
|
415
|
+
return `${pageCount.message} (+${extra} repeated header/footer element${extra === 1 ? '' : 's'} on the new page${to > 0 ? '' : 's'})`;
|
|
416
|
+
}
|
|
417
|
+
// ── Rule 1 helpers ──────────────────────────────────────────────────────────
|
|
418
|
+
/**
|
|
419
|
+
* Map each *added* table node to the table fragment that already paired. Only
|
|
420
|
+
* applies when the page count grew: absent that, a new table really is a new
|
|
421
|
+
* table and deserves its own top-level event.
|
|
422
|
+
*/
|
|
423
|
+
function continuationFragments(events, nextById, eventIdxByNextId, nextRank, pageCountGrew) {
|
|
424
|
+
const out = new Map();
|
|
425
|
+
if (!pageCountGrew)
|
|
426
|
+
return out;
|
|
427
|
+
const eventTypeOf = (id) => {
|
|
428
|
+
const i = eventIdxByNextId.get(id);
|
|
429
|
+
return i == null ? undefined : events[i].type;
|
|
430
|
+
};
|
|
431
|
+
// The primary is the earliest table carrying a non-additive event, i.e. one
|
|
432
|
+
// the matcher recognised as the same table as in the baseline.
|
|
433
|
+
let primary = null;
|
|
434
|
+
for (const [id, n] of nextById) {
|
|
435
|
+
if (n.role !== 'table')
|
|
436
|
+
continue;
|
|
437
|
+
const type = eventTypeOf(id);
|
|
438
|
+
if (type == null || type === 'element-added')
|
|
439
|
+
continue;
|
|
440
|
+
if (primary == null || (nextRank.get(id) ?? 0) < (nextRank.get(primary) ?? 0))
|
|
441
|
+
primary = id;
|
|
442
|
+
}
|
|
443
|
+
if (primary == null)
|
|
444
|
+
return out;
|
|
445
|
+
for (const [id, n] of nextById) {
|
|
446
|
+
if (n.role === 'table' && id !== primary && eventTypeOf(id) === 'element-added')
|
|
447
|
+
out.set(id, primary);
|
|
448
|
+
}
|
|
449
|
+
return out;
|
|
450
|
+
}
|
|
451
|
+
/** The primary next-snapshot table id that owns this add/remove, or null. */
|
|
452
|
+
function owningTable(e, baseById, nextById, baseToNext, eventIdxByNextId, continuationOf) {
|
|
453
|
+
const fromBase = e.type === 'element-removed';
|
|
454
|
+
const idx = fromBase ? baseById : nextById;
|
|
455
|
+
const node = 'nodeId' in e ? idx.get(e.nodeId) : undefined;
|
|
456
|
+
if (!node)
|
|
457
|
+
return null;
|
|
458
|
+
if (node.role === 'table')
|
|
459
|
+
return fromBase ? null : (continuationOf.get(node.id) ?? null);
|
|
460
|
+
if (!TABLE_PARTS.has(node.role))
|
|
461
|
+
return null;
|
|
462
|
+
let cur = node;
|
|
463
|
+
while (cur?.parentId != null) {
|
|
464
|
+
const parent = idx.get(cur.parentId);
|
|
465
|
+
if (!parent)
|
|
466
|
+
return null;
|
|
467
|
+
if (parent.role === 'table') {
|
|
468
|
+
const nextId = fromBase ? baseToNext.get(parent.id) : parent.id;
|
|
469
|
+
if (nextId == null)
|
|
470
|
+
return null;
|
|
471
|
+
// Rows and cells under a continuation fragment belong to the same table.
|
|
472
|
+
const primary = continuationOf.get(nextId) ?? nextId;
|
|
473
|
+
return eventIdxByNextId.has(primary) ? primary : null;
|
|
474
|
+
}
|
|
475
|
+
cur = parent;
|
|
476
|
+
}
|
|
477
|
+
return null;
|
|
478
|
+
}
|
|
479
|
+
function tableSummary(tableId, baseById, nextById, baseToNext, members, events) {
|
|
480
|
+
let baseTable;
|
|
481
|
+
for (const [baseId, nextId] of baseToNext) {
|
|
482
|
+
if (nextId === tableId)
|
|
483
|
+
baseTable = baseById.get(baseId);
|
|
484
|
+
}
|
|
485
|
+
// Every table fragment in the group, including the paired one.
|
|
486
|
+
const fragments = [nextById.get(tableId)].filter(Boolean);
|
|
487
|
+
let rows = 0;
|
|
488
|
+
let cells = 0;
|
|
489
|
+
for (const m of members) {
|
|
490
|
+
const e = events[m];
|
|
491
|
+
if (!('nodeId' in e))
|
|
492
|
+
continue;
|
|
493
|
+
const removed = e.type === 'element-removed';
|
|
494
|
+
const n = (removed ? baseById : nextById).get(e.nodeId);
|
|
495
|
+
if (!n)
|
|
496
|
+
continue;
|
|
497
|
+
const sign = removed ? -1 : 1;
|
|
498
|
+
if (n.role === 'row')
|
|
499
|
+
rows += sign;
|
|
500
|
+
else if (n.role === 'cell')
|
|
501
|
+
cells += sign;
|
|
502
|
+
// Only added tables: the group's own root is the primary fragment, already
|
|
503
|
+
// seeded above, and counting it twice doubles the reported row total.
|
|
504
|
+
else if (n.role === 'table' && e.type === 'element-added')
|
|
505
|
+
fragments.push(n);
|
|
506
|
+
}
|
|
507
|
+
const pages = [...new Set(fragments.map((f) => f.pageIndex + 1))].sort((a, b) => a - b);
|
|
508
|
+
const shape = baseTable?.table
|
|
509
|
+
? `${baseTable.table.rows}×${baseTable.table.cols} → ${fragments.reduce((s, f) => s + (f.table?.rows ?? 0), 0)}×${fragments[0]?.table?.cols ?? '?'}`
|
|
510
|
+
: 'table';
|
|
511
|
+
const delta = [
|
|
512
|
+
rows !== 0 ? `${rows > 0 ? '+' : ''}${rows} row${Math.abs(rows) === 1 ? '' : 's'}` : null,
|
|
513
|
+
cells !== 0 ? `${cells > 0 ? '+' : ''}${cells} cell${Math.abs(cells) === 1 ? '' : 's'}` : null,
|
|
514
|
+
]
|
|
515
|
+
.filter(Boolean)
|
|
516
|
+
.join(', ');
|
|
517
|
+
const span = pages.length > 1 ? `, now spans pages ${pages[0]}–${pages[pages.length - 1]}` : '';
|
|
518
|
+
return `table ${rows < 0 ? 'shrank' : 'grew'} ${delta} (${shape})${span}`;
|
|
519
|
+
}
|
|
520
|
+
// ── Rule 2 helpers ──────────────────────────────────────────────────────────
|
|
521
|
+
/**
|
|
522
|
+
* The nearest group root that precedes the whole run in document order — this
|
|
523
|
+
* is what turns "23 things moved" into "23 things moved *because of this*".
|
|
524
|
+
* `page-count-changed` has no position, so it is the last-resort cause.
|
|
525
|
+
*/
|
|
526
|
+
function nearestPrecedingCause(groups, events, nextRank, firstMemberRank, pageCountIdx) {
|
|
527
|
+
let best = null;
|
|
528
|
+
let bestRank = -1;
|
|
529
|
+
for (const g of groups) {
|
|
530
|
+
// A cascade is an effect, never a cause; citing one would produce
|
|
531
|
+
// "N moved following M moved following the real thing".
|
|
532
|
+
if (g.kind === 'page-shift-cascade')
|
|
533
|
+
continue;
|
|
534
|
+
const root = events[g.rootIdx];
|
|
535
|
+
if (!('nodeId' in root))
|
|
536
|
+
continue;
|
|
537
|
+
const rank = nextRank.get(root.nodeId);
|
|
538
|
+
if (rank == null || rank >= firstMemberRank)
|
|
539
|
+
continue;
|
|
540
|
+
if (rank > bestRank) {
|
|
541
|
+
bestRank = rank;
|
|
542
|
+
best = { kind: g.kind, summary: g.summary };
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
if (best)
|
|
546
|
+
return best;
|
|
547
|
+
if (pageCountIdx !== -1)
|
|
548
|
+
return { kind: 'single', summary: events[pageCountIdx].message };
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Split a same-delta set of moves into maximal runs that are contiguous in
|
|
553
|
+
* document order, tolerating two kinds of gap: a node that is the subject of
|
|
554
|
+
* some other event in this diff, and a repeated fixed element.
|
|
555
|
+
*
|
|
556
|
+
* The second is not a fixture-specific escape hatch. A running header or footer
|
|
557
|
+
* is page-anchored, so it correctly does *not* move when the content around it
|
|
558
|
+
* shifts, and it will therefore break a downstream run at every single page
|
|
559
|
+
* boundary in every document that has one.
|
|
560
|
+
*
|
|
561
|
+
* Anything else in the gap is content that stayed put while its neighbours
|
|
562
|
+
* moved — which is not a cascade, so the run ends there.
|
|
563
|
+
*/
|
|
564
|
+
function contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated) {
|
|
565
|
+
const byRank = new Map();
|
|
566
|
+
for (const n of nextNodes) {
|
|
567
|
+
const r = nextRank.get(n.id);
|
|
568
|
+
if (r != null)
|
|
569
|
+
byRank.set(r, n);
|
|
570
|
+
}
|
|
571
|
+
const isFurniture = (n) => collectSubtree(n, nextNodes).some((d) => d.normText != null && repeated.has(d.normText));
|
|
572
|
+
const bridges = (from, to) => {
|
|
573
|
+
for (let r = from + 1; r < to; r++) {
|
|
574
|
+
const node = byRank.get(r);
|
|
575
|
+
if (!node)
|
|
576
|
+
return false;
|
|
577
|
+
if (eventIdxByNextId.has(node.id))
|
|
578
|
+
continue; // changed for its own reasons
|
|
579
|
+
if (isFurniture(node))
|
|
580
|
+
continue; // page-anchored, correctly did not move
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
return true;
|
|
584
|
+
};
|
|
585
|
+
const runs = [];
|
|
586
|
+
let current = [ranked[0]];
|
|
587
|
+
for (let k = 1; k < ranked.length; k++) {
|
|
588
|
+
if (bridges(ranked[k - 1].rank, ranked[k].rank))
|
|
589
|
+
current.push(ranked[k]);
|
|
590
|
+
else {
|
|
591
|
+
runs.push(current);
|
|
592
|
+
current = [ranked[k]];
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
runs.push(current);
|
|
596
|
+
return runs;
|
|
597
|
+
}
|
|
598
|
+
function cascadeSummary(count, delta, idxs, events, cause) {
|
|
599
|
+
const hops = [
|
|
600
|
+
...new Set(idxs.map((i) => {
|
|
601
|
+
const e = events[i];
|
|
602
|
+
return e.type === 'element-moved-to-different-page' ? `${e.fromPage + 1}→${e.toPage + 1}` : '';
|
|
603
|
+
})),
|
|
604
|
+
]
|
|
605
|
+
.filter(Boolean)
|
|
606
|
+
.sort();
|
|
607
|
+
const dir = delta > 0 ? `+${delta}` : `${delta}`;
|
|
608
|
+
const label = cause.kind === 'table-grew'
|
|
609
|
+
? "the table's growth"
|
|
610
|
+
: cause.kind === 'new-page-furniture'
|
|
611
|
+
? 'the page-count change'
|
|
612
|
+
: cause.summary;
|
|
613
|
+
return `${count} elements shifted ${dir} page${Math.abs(delta) === 1 ? '' : 's'} (${hops.join(', ')}) following ${label}`;
|
|
614
|
+
}
|
|
615
|
+
// ── Shared helpers ──────────────────────────────────────────────────────────
|
|
616
|
+
function byId(nodes) {
|
|
617
|
+
return new Map(nodes.map((n) => [n.id, n]));
|
|
618
|
+
}
|
|
619
|
+
function readingRank(nodes) {
|
|
620
|
+
const out = new Map();
|
|
621
|
+
[...nodes]
|
|
622
|
+
.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order)
|
|
623
|
+
.forEach((n, i) => out.set(n.id, i));
|
|
624
|
+
return out;
|
|
625
|
+
}
|
|
626
|
+
function isTexty(role) {
|
|
627
|
+
return role === 'text' || role === 'heading';
|
|
628
|
+
}
|
|
629
|
+
//# 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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdf-testkit/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Semantic structural model, extractors, and diff engine for pdf-testkit",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,13 +20,9 @@
|
|
|
20
20
|
"test": "vitest run"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@formepdf/core": "*",
|
|
24
23
|
"pdfjs-dist": "^4.10 || ^5"
|
|
25
24
|
},
|
|
26
25
|
"peerDependenciesMeta": {
|
|
27
|
-
"@formepdf/core": {
|
|
28
|
-
"optional": true
|
|
29
|
-
},
|
|
30
26
|
"pdfjs-dist": {
|
|
31
27
|
"optional": true
|
|
32
28
|
}
|
|
@@ -37,5 +33,12 @@
|
|
|
37
33
|
},
|
|
38
34
|
"publishConfig": {
|
|
39
35
|
"access": "public"
|
|
40
|
-
}
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/danmolitor/pdf-testkit.git",
|
|
40
|
+
"directory": "packages/core"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/danmolitor/pdf-testkit#readme",
|
|
43
|
+
"bugs": "https://github.com/danmolitor/pdf-testkit/issues"
|
|
41
44
|
}
|