docground 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/src/compiler/zod-compiler.d.ts +31 -0
- package/dist/src/compiler/zod-compiler.d.ts.map +1 -0
- package/dist/src/compiler/zod-compiler.js +150 -0
- package/dist/src/compiler/zod-compiler.js.map +1 -0
- package/dist/src/core/extractor.d.ts +17 -0
- package/dist/src/core/extractor.d.ts.map +1 -0
- package/dist/src/core/extractor.js +268 -0
- package/dist/src/core/extractor.js.map +1 -0
- package/dist/src/core/types.d.ts +102 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/grounding/bbox.d.ts +40 -0
- package/dist/src/grounding/bbox.d.ts.map +1 -0
- package/dist/src/grounding/bbox.js +98 -0
- package/dist/src/grounding/bbox.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/normalizers/currency.d.ts +14 -0
- package/dist/src/normalizers/currency.d.ts.map +1 -0
- package/dist/src/normalizers/currency.js +96 -0
- package/dist/src/normalizers/currency.js.map +1 -0
- package/dist/src/normalizers/tabular.d.ts +16 -0
- package/dist/src/normalizers/tabular.d.ts.map +1 -0
- package/dist/src/normalizers/tabular.js +81 -0
- package/dist/src/normalizers/tabular.js.map +1 -0
- package/dist/src/providers/anthropic-provider.d.ts +13 -0
- package/dist/src/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/src/providers/anthropic-provider.js +62 -0
- package/dist/src/providers/anthropic-provider.js.map +1 -0
- package/dist/src/providers/factory.d.ts +11 -0
- package/dist/src/providers/factory.d.ts.map +1 -0
- package/dist/src/providers/factory.js +32 -0
- package/dist/src/providers/factory.js.map +1 -0
- package/dist/src/providers/gemini-provider.d.ts +13 -0
- package/dist/src/providers/gemini-provider.d.ts.map +1 -0
- package/dist/src/providers/gemini-provider.js +48 -0
- package/dist/src/providers/gemini-provider.js.map +1 -0
- package/dist/src/providers/openai-provider.d.ts +14 -0
- package/dist/src/providers/openai-provider.d.ts.map +1 -0
- package/dist/src/providers/openai-provider.js +48 -0
- package/dist/src/providers/openai-provider.js.map +1 -0
- package/dist/src/providers/types.d.ts +45 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +2 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/stitcher/table-stitcher.d.ts +19 -0
- package/dist/src/stitcher/table-stitcher.d.ts.map +1 -0
- package/dist/src/stitcher/table-stitcher.js +129 -0
- package/dist/src/stitcher/table-stitcher.js.map +1 -0
- package/dist/src/tiling/cutter.d.ts +14 -0
- package/dist/src/tiling/cutter.d.ts.map +1 -0
- package/dist/src/tiling/cutter.js +46 -0
- package/dist/src/tiling/cutter.js.map +1 -0
- package/dist/src/tiling/tiler.d.ts +41 -0
- package/dist/src/tiling/tiler.d.ts.map +1 -0
- package/dist/src/tiling/tiler.js +82 -0
- package/dist/src/tiling/tiler.js.map +1 -0
- package/dist/src/validators/invariants.d.ts +30 -0
- package/dist/src/validators/invariants.d.ts.map +1 -0
- package/dist/src/validators/invariants.js +164 -0
- package/dist/src/validators/invariants.js.map +1 -0
- package/dist/tests/compiler.test.d.ts +2 -0
- package/dist/tests/compiler.test.d.ts.map +1 -0
- package/dist/tests/compiler.test.js +110 -0
- package/dist/tests/compiler.test.js.map +1 -0
- package/dist/tests/extractor.test.d.ts +2 -0
- package/dist/tests/extractor.test.d.ts.map +1 -0
- package/dist/tests/extractor.test.js +195 -0
- package/dist/tests/extractor.test.js.map +1 -0
- package/dist/tests/fixtures.d.ts +9 -0
- package/dist/tests/fixtures.d.ts.map +1 -0
- package/dist/tests/fixtures.js +20 -0
- package/dist/tests/fixtures.js.map +1 -0
- package/dist/tests/grounding.test.d.ts +2 -0
- package/dist/tests/grounding.test.d.ts.map +1 -0
- package/dist/tests/grounding.test.js +82 -0
- package/dist/tests/grounding.test.js.map +1 -0
- package/dist/tests/multi-domain.test.d.ts +2 -0
- package/dist/tests/multi-domain.test.d.ts.map +1 -0
- package/dist/tests/multi-domain.test.js +135 -0
- package/dist/tests/multi-domain.test.js.map +1 -0
- package/dist/tests/normalizer.test.d.ts +2 -0
- package/dist/tests/normalizer.test.d.ts.map +1 -0
- package/dist/tests/normalizer.test.js +70 -0
- package/dist/tests/normalizer.test.js.map +1 -0
- package/dist/tests/providers.test.d.ts +2 -0
- package/dist/tests/providers.test.d.ts.map +1 -0
- package/dist/tests/providers.test.js +110 -0
- package/dist/tests/providers.test.js.map +1 -0
- package/dist/tests/stitcher.test.d.ts +2 -0
- package/dist/tests/stitcher.test.d.ts.map +1 -0
- package/dist/tests/stitcher.test.js +85 -0
- package/dist/tests/stitcher.test.js.map +1 -0
- package/dist/tests/tiling.test.d.ts +2 -0
- package/dist/tests/tiling.test.d.ts.map +1 -0
- package/dist/tests/tiling.test.js +85 -0
- package/dist/tests/tiling.test.js.map +1 -0
- package/dist/tests/validators.test.d.ts +2 -0
- package/dist/tests/validators.test.d.ts.map +1 -0
- package/dist/tests/validators.test.js +125 -0
- package/dist/tests/validators.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
function normalizeHeader(h) {
|
|
2
|
+
return h.map((s) => s.trim().toLowerCase()).filter(Boolean);
|
|
3
|
+
}
|
|
4
|
+
function headerSimilarity(a, b) {
|
|
5
|
+
const na = normalizeHeader(a);
|
|
6
|
+
const nb = normalizeHeader(b);
|
|
7
|
+
if (na.length === 0 && nb.length === 0)
|
|
8
|
+
return 1;
|
|
9
|
+
const union = new Set([...na, ...nb]);
|
|
10
|
+
const intersection = na.filter((s) => nb.includes(s));
|
|
11
|
+
return union.size === 0 ? 0 : intersection.length / union.size;
|
|
12
|
+
}
|
|
13
|
+
function tableColCount(table) {
|
|
14
|
+
if (table.header && table.header.length > 0)
|
|
15
|
+
return table.header.length;
|
|
16
|
+
return table.rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
17
|
+
}
|
|
18
|
+
function horizontalOverlap(a, b) {
|
|
19
|
+
const aXmin = a[1];
|
|
20
|
+
const aXmax = a[3];
|
|
21
|
+
const bXmin = b[1];
|
|
22
|
+
const bXmax = b[3];
|
|
23
|
+
const interMin = Math.max(aXmin, bXmin);
|
|
24
|
+
const interMax = Math.min(aXmax, bXmax);
|
|
25
|
+
if (interMax <= interMin)
|
|
26
|
+
return 0;
|
|
27
|
+
const unionMin = Math.min(aXmin, bXmin);
|
|
28
|
+
const unionMax = Math.max(aXmax, bXmax);
|
|
29
|
+
const union = unionMax - unionMin;
|
|
30
|
+
return union === 0 ? 0 : (interMax - interMin) / union;
|
|
31
|
+
}
|
|
32
|
+
function mergeBboxes(a, b) {
|
|
33
|
+
return [
|
|
34
|
+
Math.min(a[0], b[0]),
|
|
35
|
+
Math.min(a[1], b[1]),
|
|
36
|
+
Math.max(a[2], b[2]),
|
|
37
|
+
Math.max(a[3], b[3]),
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
function rowsEqual(a, b) {
|
|
41
|
+
if (a.length !== b.length)
|
|
42
|
+
return false;
|
|
43
|
+
return a.every((v, i) => v === b[i]);
|
|
44
|
+
}
|
|
45
|
+
function normalizeRow(row) {
|
|
46
|
+
return row.map((v) => String(v).trim().toLowerCase()).filter((s) => s !== "");
|
|
47
|
+
}
|
|
48
|
+
export class TableStitcher {
|
|
49
|
+
opts;
|
|
50
|
+
constructor(options = {}) {
|
|
51
|
+
this.opts = {
|
|
52
|
+
columnCountTolerance: options.columnCountTolerance ?? 0,
|
|
53
|
+
headerSimilarityThreshold: options.headerSimilarityThreshold ?? 0.6,
|
|
54
|
+
horizontalOverlapThreshold: options.horizontalOverlapThreshold ?? 0.6,
|
|
55
|
+
skipRepeatedHeaders: options.skipRepeatedHeaders ?? true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
canMerge(prev, next) {
|
|
59
|
+
const prevCols = tableColCount(prev);
|
|
60
|
+
const nextCols = tableColCount(next);
|
|
61
|
+
if (Math.abs(prevCols - nextCols) > this.opts.columnCountTolerance) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const hSim = prev.header && next.header
|
|
65
|
+
? headerSimilarity(prev.header, next.header)
|
|
66
|
+
: 1;
|
|
67
|
+
if (hSim < this.opts.headerSimilarityThreshold) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (horizontalOverlap(prev.bbox, next.bbox) < this.opts.horizontalOverlapThreshold) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
stitch(tables) {
|
|
76
|
+
if (tables.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const sorted = [...tables].sort((a, b) => a.pageIndex - b.pageIndex);
|
|
79
|
+
const groups = [];
|
|
80
|
+
let current = [sorted[0]];
|
|
81
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
82
|
+
const prev = current[current.length - 1];
|
|
83
|
+
const next = sorted[i];
|
|
84
|
+
if (this.canMerge(prev, next)) {
|
|
85
|
+
current.push(next);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
groups.push(current);
|
|
89
|
+
current = [next];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
groups.push(current);
|
|
93
|
+
return groups.map((group) => this.mergeGroup(group));
|
|
94
|
+
}
|
|
95
|
+
mergeGroup(group) {
|
|
96
|
+
const first = group[0];
|
|
97
|
+
const merged = {
|
|
98
|
+
pageIndex: first.pageIndex,
|
|
99
|
+
header: first.header ? [...first.header] : undefined,
|
|
100
|
+
rows: [],
|
|
101
|
+
bbox: [...first.bbox],
|
|
102
|
+
html: first.html,
|
|
103
|
+
spans: undefined,
|
|
104
|
+
};
|
|
105
|
+
for (const table of group) {
|
|
106
|
+
let rows = table.rows;
|
|
107
|
+
if (this.opts.skipRepeatedHeaders &&
|
|
108
|
+
merged.header &&
|
|
109
|
+
table.header &&
|
|
110
|
+
rows.length > 0) {
|
|
111
|
+
const firstRow = rows[0];
|
|
112
|
+
if (rowsEqual(normalizeRow(firstRow), normalizeHeader(merged.header))) {
|
|
113
|
+
// First data row of this table is the repeated header; skip it.
|
|
114
|
+
rows = rows.slice(1);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Merge spans if present.
|
|
118
|
+
if (table.spans) {
|
|
119
|
+
merged.spans = merged.spans ?? [];
|
|
120
|
+
merged.spans.push(...table.spans);
|
|
121
|
+
}
|
|
122
|
+
merged.rows.push(...rows);
|
|
123
|
+
merged.bbox = mergeBboxes(merged.bbox, table.bbox);
|
|
124
|
+
merged.html = merged.html && table.html ? `${merged.html}\n${table.html}` : merged.html ?? table.html;
|
|
125
|
+
}
|
|
126
|
+
return merged;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=table-stitcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-stitcher.js","sourceRoot":"","sources":["../../../src/stitcher/table-stitcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PageImage } from "../providers/types.js";
|
|
2
|
+
import type { Tile } from "./tiler.js";
|
|
3
|
+
export declare function getImageMetadata(image: Pick<PageImage, "base64" | "mimeType">): Promise<{
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
format: string;
|
|
7
|
+
}>;
|
|
8
|
+
/**
|
|
9
|
+
* Crop a `Tile` out of a full-page `PageImage`.
|
|
10
|
+
*
|
|
11
|
+
* The output keeps the same MIME type when possible, falling back to PNG.
|
|
12
|
+
*/
|
|
13
|
+
export declare function cropTile(image: PageImage, tile: Tile): Promise<PageImage>;
|
|
14
|
+
//# sourceMappingURL=cutter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cutter.d.ts","sourceRoot":"","sources":["../../../src/tiling/cutter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC,GAC5C,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5D;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CA0B/E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import sharp from "sharp";
|
|
2
|
+
function base64ToBuffer(base64) {
|
|
3
|
+
return Buffer.from(base64, "base64");
|
|
4
|
+
}
|
|
5
|
+
function bufferToBase64(buf) {
|
|
6
|
+
return buf.toString("base64");
|
|
7
|
+
}
|
|
8
|
+
export async function getImageMetadata(image) {
|
|
9
|
+
const meta = await sharp(base64ToBuffer(image.base64)).metadata();
|
|
10
|
+
if (!meta.width || !meta.height) {
|
|
11
|
+
throw new Error("Could not read image metadata");
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
width: meta.width,
|
|
15
|
+
height: meta.height,
|
|
16
|
+
format: meta.format ?? image.mimeType.replace("image/", ""),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Crop a `Tile` out of a full-page `PageImage`.
|
|
21
|
+
*
|
|
22
|
+
* The output keeps the same MIME type when possible, falling back to PNG.
|
|
23
|
+
*/
|
|
24
|
+
export async function cropTile(image, tile) {
|
|
25
|
+
const pageW = image.width;
|
|
26
|
+
const pageH = image.height;
|
|
27
|
+
const left = Math.round(tile.bbox[1] * pageW);
|
|
28
|
+
const top = Math.round(tile.bbox[0] * pageH);
|
|
29
|
+
const width = Math.min(pageW - left, Math.round((tile.bbox[3] - tile.bbox[1]) * pageW));
|
|
30
|
+
const height = Math.min(pageH - top, Math.round((tile.bbox[2] - tile.bbox[0]) * pageH));
|
|
31
|
+
if (width <= 0 || height <= 0) {
|
|
32
|
+
throw new Error(`Invalid tile dimensions: ${width}x${height}`);
|
|
33
|
+
}
|
|
34
|
+
const format = image.mimeType === "image/jpeg" ? "jpeg" : "png";
|
|
35
|
+
const buf = await sharp(base64ToBuffer(image.base64))
|
|
36
|
+
.extract({ left, top, width, height })
|
|
37
|
+
.toFormat(format)
|
|
38
|
+
.toBuffer();
|
|
39
|
+
return {
|
|
40
|
+
mimeType: format === "jpeg" ? "image/jpeg" : "image/png",
|
|
41
|
+
base64: bufferToBase64(buf),
|
|
42
|
+
width,
|
|
43
|
+
height,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=cutter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cutter.js","sourceRoot":"","sources":["../../../src/tiling/cutter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAA6C;IAE7C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAgB,EAAE,IAAU;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAExF,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAClD,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACrC,QAAQ,CAAC,MAAwB,CAAC;SAClC,QAAQ,EAAE,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;QACxD,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC;QAC3B,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { TileOptions } from "../core/types.js";
|
|
2
|
+
import type { NormalizedBBox } from "../grounding/bbox.js";
|
|
3
|
+
export interface Tile {
|
|
4
|
+
pageIndex: number;
|
|
5
|
+
/** Bounding box in normalized page coordinates [ymin, xmin, ymax, xmax]. */
|
|
6
|
+
bbox: NormalizedBBox;
|
|
7
|
+
/** Always [0, 0, 1, 1] representing the local tile space. */
|
|
8
|
+
localBox: NormalizedBBox;
|
|
9
|
+
row: number;
|
|
10
|
+
col: number;
|
|
11
|
+
rows: number;
|
|
12
|
+
cols: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TilingPlan {
|
|
15
|
+
pageIndex: number;
|
|
16
|
+
pageWidth: number;
|
|
17
|
+
pageHeight: number;
|
|
18
|
+
tiles: Tile[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Plan a tile grid for a single page.
|
|
22
|
+
*
|
|
23
|
+
* If the page fits within a single tile (respecting maxTileWidth/Height)
|
|
24
|
+
* the returned plan contains exactly one tile covering the whole page.
|
|
25
|
+
*/
|
|
26
|
+
export declare function planTiling(pageIndex: number, pageSize: {
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
}, options?: TileOptions): TilingPlan;
|
|
30
|
+
/**
|
|
31
|
+
* Convert boxes from a tile's local [0,1] space back to page-normalized space.
|
|
32
|
+
*/
|
|
33
|
+
export declare function remapTileBoxes(localBoxes: NormalizedBBox[], tile: Tile): NormalizedBBox[];
|
|
34
|
+
/**
|
|
35
|
+
* Estimate whether a page needs tiling based on its pixel dimensions.
|
|
36
|
+
*/
|
|
37
|
+
export declare function needsTiling(pageSize: {
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}, options?: TileOptions): boolean;
|
|
41
|
+
//# sourceMappingURL=tiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiler.d.ts","sourceRoot":"","sources":["../../../src/tiling/tiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,IAAI,EAAE,cAAc,CAAC;IACrB,6DAA6D;IAC7D,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAoBD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,WAAW,GACpB,UAAU,CA+CZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,IAAI,GACT,cAAc,EAAE,CAWlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAGT"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const DEFAULT_TILE_WIDTH = 1536;
|
|
2
|
+
const DEFAULT_TILE_HEIGHT = 1536;
|
|
3
|
+
const DEFAULT_OVERLAP = 0.15;
|
|
4
|
+
function withDefaults(options) {
|
|
5
|
+
return {
|
|
6
|
+
maxTileWidth: options?.maxTileWidth ?? DEFAULT_TILE_WIDTH,
|
|
7
|
+
maxTileHeight: options?.maxTileHeight ?? DEFAULT_TILE_HEIGHT,
|
|
8
|
+
overlap: options?.overlap ?? DEFAULT_OVERLAP,
|
|
9
|
+
minPixels: options?.minPixels ?? 1,
|
|
10
|
+
maxPixels: options?.maxPixels ?? 2_000_000,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function clamp(n, min, max) {
|
|
14
|
+
return Math.max(min, Math.min(max, n));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Plan a tile grid for a single page.
|
|
18
|
+
*
|
|
19
|
+
* If the page fits within a single tile (respecting maxTileWidth/Height)
|
|
20
|
+
* the returned plan contains exactly one tile covering the whole page.
|
|
21
|
+
*/
|
|
22
|
+
export function planTiling(pageIndex, pageSize, options) {
|
|
23
|
+
const opts = withDefaults(options);
|
|
24
|
+
const tileW = Math.min(pageSize.width, opts.maxTileWidth);
|
|
25
|
+
const tileH = Math.min(pageSize.height, opts.maxTileHeight);
|
|
26
|
+
const stepW = Math.max(1, Math.floor(tileW * (1 - opts.overlap)));
|
|
27
|
+
const stepH = Math.max(1, Math.floor(tileH * (1 - opts.overlap)));
|
|
28
|
+
const cols = pageSize.width > tileW ? Math.ceil((pageSize.width - tileW) / stepW) + 1 : 1;
|
|
29
|
+
const rows = pageSize.height > tileH ? Math.ceil((pageSize.height - tileH) / stepH) + 1 : 1;
|
|
30
|
+
const tiles = [];
|
|
31
|
+
for (let row = 0; row < rows; row++) {
|
|
32
|
+
for (let col = 0; col < cols; col++) {
|
|
33
|
+
const left = clamp(col * stepW, 0, pageSize.width - tileW);
|
|
34
|
+
const top = clamp(row * stepH, 0, pageSize.height - tileH);
|
|
35
|
+
const right = Math.min(pageSize.width, left + tileW);
|
|
36
|
+
const bottom = Math.min(pageSize.height, top + tileH);
|
|
37
|
+
const bbox = [
|
|
38
|
+
top / pageSize.height,
|
|
39
|
+
left / pageSize.width,
|
|
40
|
+
bottom / pageSize.height,
|
|
41
|
+
right / pageSize.width,
|
|
42
|
+
];
|
|
43
|
+
tiles.push({
|
|
44
|
+
pageIndex,
|
|
45
|
+
bbox,
|
|
46
|
+
localBox: [0, 0, 1, 1],
|
|
47
|
+
row,
|
|
48
|
+
col,
|
|
49
|
+
rows,
|
|
50
|
+
cols,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
pageIndex,
|
|
56
|
+
pageWidth: pageSize.width,
|
|
57
|
+
pageHeight: pageSize.height,
|
|
58
|
+
tiles,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Convert boxes from a tile's local [0,1] space back to page-normalized space.
|
|
63
|
+
*/
|
|
64
|
+
export function remapTileBoxes(localBoxes, tile) {
|
|
65
|
+
const [tYmin, tXmin, tYmax, tXmax] = tile.bbox;
|
|
66
|
+
const h = tYmax - tYmin;
|
|
67
|
+
const w = tXmax - tXmin;
|
|
68
|
+
return localBoxes.map((b) => [
|
|
69
|
+
tYmin + b[0] * h,
|
|
70
|
+
tXmin + b[1] * w,
|
|
71
|
+
tYmin + b[2] * h,
|
|
72
|
+
tXmin + b[3] * w,
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Estimate whether a page needs tiling based on its pixel dimensions.
|
|
77
|
+
*/
|
|
78
|
+
export function needsTiling(pageSize, options) {
|
|
79
|
+
const opts = withDefaults(options);
|
|
80
|
+
return pageSize.width > opts.maxTileWidth || pageSize.height > opts.maxTileHeight;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=tiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiler.js","sourceRoot":"","sources":["../../../src/tiling/tiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface InvariantCheck {
|
|
2
|
+
id: string;
|
|
3
|
+
expression: string;
|
|
4
|
+
tolerance?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface InvariantCheckResult {
|
|
7
|
+
id: string;
|
|
8
|
+
passed: boolean;
|
|
9
|
+
actual?: number;
|
|
10
|
+
expected?: number;
|
|
11
|
+
diff?: number;
|
|
12
|
+
message?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface InvariantReport {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
checks: InvariantCheckResult[];
|
|
17
|
+
discrepancies: Array<{
|
|
18
|
+
id: string;
|
|
19
|
+
actual: number;
|
|
20
|
+
expected: number;
|
|
21
|
+
diff: number;
|
|
22
|
+
}>;
|
|
23
|
+
confidenceScore: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class InvariantEngine {
|
|
26
|
+
private checks;
|
|
27
|
+
addCheck(check: InvariantCheck): this;
|
|
28
|
+
check(data: Record<string, unknown>): InvariantReport;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../../src/validators/invariants.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,eAAe,EAAE,MAAM,CAAC;CACzB;AA8FD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;IAEtC,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKrC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe;CA2EtD"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
const DEFAULT_TOLERANCE = 1e-9;
|
|
2
|
+
function getPathValue(obj, path) {
|
|
3
|
+
if (typeof obj !== "object" || obj === null)
|
|
4
|
+
return undefined;
|
|
5
|
+
return obj[path];
|
|
6
|
+
}
|
|
7
|
+
function resolveAggregates(expr, ctx) {
|
|
8
|
+
// sum(items.price)
|
|
9
|
+
let result = expr.replace(/sum\(([^)]+)\)/g, (_, arg) => {
|
|
10
|
+
const [arrName, propName] = arg.split(".").map((s) => s.trim());
|
|
11
|
+
const arr = ctx[arrName];
|
|
12
|
+
if (!Array.isArray(arr))
|
|
13
|
+
return "0";
|
|
14
|
+
const total = arr.reduce((acc, item) => {
|
|
15
|
+
const v = propName ? getPathValue(item, propName) : item;
|
|
16
|
+
return acc + Number(v ?? 0);
|
|
17
|
+
}, 0);
|
|
18
|
+
return String(total);
|
|
19
|
+
});
|
|
20
|
+
// avg(items.price)
|
|
21
|
+
result = result.replace(/avg\(([^)]+)\)/g, (_, arg) => {
|
|
22
|
+
const [arrName, propName] = arg.split(".").map((s) => s.trim());
|
|
23
|
+
const arr = ctx[arrName];
|
|
24
|
+
if (!Array.isArray(arr) || arr.length === 0)
|
|
25
|
+
return "0";
|
|
26
|
+
const total = arr.reduce((acc, item) => {
|
|
27
|
+
const v = propName ? getPathValue(item, propName) : item;
|
|
28
|
+
return acc + Number(v ?? 0);
|
|
29
|
+
}, 0);
|
|
30
|
+
return String(total / arr.length);
|
|
31
|
+
});
|
|
32
|
+
// count(items)
|
|
33
|
+
result = result.replace(/count\(([^)]+)\)/g, (_, arg) => {
|
|
34
|
+
const arr = ctx[arg.trim()];
|
|
35
|
+
return String(Array.isArray(arr) ? arr.length : 0);
|
|
36
|
+
});
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function bindVariables(expr, ctx) {
|
|
40
|
+
const keys = Object.keys(ctx).sort((a, b) => b.length - a.length);
|
|
41
|
+
let result = expr;
|
|
42
|
+
for (const key of keys) {
|
|
43
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key))
|
|
44
|
+
continue;
|
|
45
|
+
result = result.replace(new RegExp(`\\b${key}\\b`, "g"), `__ctx[${JSON.stringify(key)}]`);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
function evaluate(expr, ctx) {
|
|
50
|
+
const source = `return (${expr});`;
|
|
51
|
+
const fn = new Function("__ctx", source);
|
|
52
|
+
return fn(ctx);
|
|
53
|
+
}
|
|
54
|
+
function splitComparison(expr) {
|
|
55
|
+
const patterns = [
|
|
56
|
+
/===/,
|
|
57
|
+
/==/,
|
|
58
|
+
/>=/,
|
|
59
|
+
/<=/,
|
|
60
|
+
/>/,
|
|
61
|
+
/</,
|
|
62
|
+
];
|
|
63
|
+
for (const pattern of patterns) {
|
|
64
|
+
const match = expr.match(new RegExp(`^(.*?)(${pattern.source})(.*)$`));
|
|
65
|
+
if (match) {
|
|
66
|
+
return { left: match[1].trim(), op: match[2].trim(), right: match[3].trim() };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function within(actual, expected, op, tolerance) {
|
|
72
|
+
switch (op) {
|
|
73
|
+
case "===":
|
|
74
|
+
case "==":
|
|
75
|
+
return Math.abs(actual - expected) <= tolerance;
|
|
76
|
+
case ">=":
|
|
77
|
+
return actual >= expected - tolerance;
|
|
78
|
+
case "<=":
|
|
79
|
+
return actual <= expected + tolerance;
|
|
80
|
+
case ">":
|
|
81
|
+
return actual > expected + tolerance;
|
|
82
|
+
case "<":
|
|
83
|
+
return actual < expected - tolerance;
|
|
84
|
+
default:
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export class InvariantEngine {
|
|
89
|
+
checks = [];
|
|
90
|
+
addCheck(check) {
|
|
91
|
+
this.checks.push(check);
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
check(data) {
|
|
95
|
+
const results = [];
|
|
96
|
+
const discrepancies = [];
|
|
97
|
+
for (const check of this.checks) {
|
|
98
|
+
const tolerance = check.tolerance ?? DEFAULT_TOLERANCE;
|
|
99
|
+
const withAggregates = resolveAggregates(check.expression, data);
|
|
100
|
+
const bound = bindVariables(withAggregates, data);
|
|
101
|
+
const comparison = splitComparison(bound);
|
|
102
|
+
let passed = false;
|
|
103
|
+
let actual;
|
|
104
|
+
let expected;
|
|
105
|
+
let diff;
|
|
106
|
+
let message;
|
|
107
|
+
if (comparison) {
|
|
108
|
+
try {
|
|
109
|
+
actual = Number(evaluate(comparison.left, data));
|
|
110
|
+
expected = Number(evaluate(comparison.right, data));
|
|
111
|
+
diff = actual - expected;
|
|
112
|
+
passed = within(actual, expected, comparison.op, tolerance);
|
|
113
|
+
message = passed
|
|
114
|
+
? undefined
|
|
115
|
+
: `Expected ${comparison.left} ${comparison.op} ${comparison.right}; got ${actual} vs ${expected}`;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
passed = false;
|
|
119
|
+
message = `Evaluation error: ${err instanceof Error ? err.message : String(err)}`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
try {
|
|
124
|
+
const raw = evaluate(bound, data);
|
|
125
|
+
passed = Boolean(raw);
|
|
126
|
+
actual = Number(raw);
|
|
127
|
+
expected = 1;
|
|
128
|
+
diff = actual - expected;
|
|
129
|
+
message = passed ? undefined : `Expression evaluated to ${raw}`;
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
passed = false;
|
|
133
|
+
message = `Evaluation error: ${err instanceof Error ? err.message : String(err)}`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
results.push({
|
|
137
|
+
id: check.id,
|
|
138
|
+
passed,
|
|
139
|
+
actual,
|
|
140
|
+
expected,
|
|
141
|
+
diff,
|
|
142
|
+
message,
|
|
143
|
+
});
|
|
144
|
+
if (!passed && actual !== undefined && expected !== undefined && diff !== undefined) {
|
|
145
|
+
discrepancies.push({
|
|
146
|
+
id: check.id,
|
|
147
|
+
actual,
|
|
148
|
+
expected,
|
|
149
|
+
diff,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const ok = results.length === 0 || results.every((r) => r.passed);
|
|
154
|
+
const passedCount = results.filter((r) => r.passed).length;
|
|
155
|
+
const totalCount = results.length || 1;
|
|
156
|
+
const penalty = discrepancies.reduce((sum, d) => {
|
|
157
|
+
const expectedAbs = Math.abs(d.expected) || 1;
|
|
158
|
+
return sum + Math.min(Math.abs(d.diff) / expectedAbs, 1);
|
|
159
|
+
}, 0) / totalCount;
|
|
160
|
+
const confidenceScore = Math.max(0, Math.min(1, passedCount / totalCount - penalty));
|
|
161
|
+
return { ok, checks: results, discrepancies, confidenceScore };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/validators/invariants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.test.d.ts","sourceRoot":"","sources":["../../tests/compiler.test.ts"],"names":[],"mappings":""}
|