@pdf-testkit/core 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conformance/index.d.ts +62 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +194 -0
- package/dist/conformance/index.js.map +1 -0
- 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 +2 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance results produced by a DIFFERENT tool in the customer's CI
|
|
3
|
+
* (veraPDF, or anything through the documented JSON shape). This module reads
|
|
4
|
+
* the report the customer points at and records what the validator said,
|
|
5
|
+
* attributed to it by name and version. It never validates, never scores, and
|
|
6
|
+
* never rejects a profile it does not recognise.
|
|
7
|
+
*
|
|
8
|
+
* Policy, stated here so it is not a backlog item: one third-party format
|
|
9
|
+
* family is parsed — veraPDF's MRR report, XML and JSON — because veraPDF is the
|
|
10
|
+
* reference validator for PDF/A and PDF/UA and its schema has been stable for
|
|
11
|
+
* years. Everything else, including validators we use ourselves (Mustang for
|
|
12
|
+
* e-invoicing), goes through `forme-review-conformance/1`, a documented JSON
|
|
13
|
+
* file the customer's CI writes. No second parser.
|
|
14
|
+
*/
|
|
15
|
+
export type ConformanceVerdict = 'pass' | 'fail' | 'error';
|
|
16
|
+
export interface ConformanceFailure {
|
|
17
|
+
clause: string;
|
|
18
|
+
test: number | null;
|
|
19
|
+
count: number;
|
|
20
|
+
description: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ConformanceResult {
|
|
23
|
+
profile: string;
|
|
24
|
+
verdict: ConformanceVerdict;
|
|
25
|
+
tool: {
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
};
|
|
29
|
+
ran_at: string | null;
|
|
30
|
+
source: {
|
|
31
|
+
format: string;
|
|
32
|
+
file: string | null;
|
|
33
|
+
};
|
|
34
|
+
failure_count: number;
|
|
35
|
+
failures: ConformanceFailure[];
|
|
36
|
+
}
|
|
37
|
+
export interface ConformanceItem {
|
|
38
|
+
/** The document path as the report names it (absolute or relative; matched later). */
|
|
39
|
+
path: string;
|
|
40
|
+
result: ConformanceResult;
|
|
41
|
+
}
|
|
42
|
+
export interface ParsedConformanceReport {
|
|
43
|
+
format: 'verapdf-mrr-xml' | 'verapdf-json' | 'forme-review-conformance/1';
|
|
44
|
+
items: ConformanceItem[];
|
|
45
|
+
}
|
|
46
|
+
export declare const CONFORMANCE_FAILURES_MAX = 200;
|
|
47
|
+
export declare const CONFORMANCE_DESCRIPTION_MAX = 300;
|
|
48
|
+
export declare const FORME_CONFORMANCE_FORMAT = "forme-review-conformance/1";
|
|
49
|
+
export declare class ConformanceReportError extends Error {
|
|
50
|
+
constructor(message: string);
|
|
51
|
+
}
|
|
52
|
+
/** Detect the format by content and parse. Throws ConformanceReportError on anything unreadable. */
|
|
53
|
+
export declare function parseConformanceReport(text: string, opts?: {
|
|
54
|
+
file?: string | null;
|
|
55
|
+
}): ParsedConformanceReport;
|
|
56
|
+
/** "PDF/UA-1 validation profile" → "PDF/UA-1"; anything unknown keeps its name minus the suffix. */
|
|
57
|
+
export declare function profileShortName(reported: string): string;
|
|
58
|
+
export declare function matchConformanceToDocuments(items: ConformanceItem[], documentPaths: string[]): {
|
|
59
|
+
byDocument: Record<string, ConformanceResult[]>;
|
|
60
|
+
unmatched: string[];
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,GAAG,cAAc,GAAG,4BAA4B,CAAC;IAC1E,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,wBAAwB,+BAA+B,CAAC;AAErE,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,oGAAoG;AACpG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAAG,uBAAuB,CAiBjH;AAqBD,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AA2GD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBvK"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance results produced by a DIFFERENT tool in the customer's CI
|
|
3
|
+
* (veraPDF, or anything through the documented JSON shape). This module reads
|
|
4
|
+
* the report the customer points at and records what the validator said,
|
|
5
|
+
* attributed to it by name and version. It never validates, never scores, and
|
|
6
|
+
* never rejects a profile it does not recognise.
|
|
7
|
+
*
|
|
8
|
+
* Policy, stated here so it is not a backlog item: one third-party format
|
|
9
|
+
* family is parsed — veraPDF's MRR report, XML and JSON — because veraPDF is the
|
|
10
|
+
* reference validator for PDF/A and PDF/UA and its schema has been stable for
|
|
11
|
+
* years. Everything else, including validators we use ourselves (Mustang for
|
|
12
|
+
* e-invoicing), goes through `forme-review-conformance/1`, a documented JSON
|
|
13
|
+
* file the customer's CI writes. No second parser.
|
|
14
|
+
*/
|
|
15
|
+
export const CONFORMANCE_FAILURES_MAX = 200;
|
|
16
|
+
export const CONFORMANCE_DESCRIPTION_MAX = 300;
|
|
17
|
+
export const FORME_CONFORMANCE_FORMAT = 'forme-review-conformance/1';
|
|
18
|
+
export class ConformanceReportError extends Error {
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'ConformanceReportError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Detect the format by content and parse. Throws ConformanceReportError on anything unreadable. */
|
|
25
|
+
export function parseConformanceReport(text, opts = {}) {
|
|
26
|
+
const file = opts.file ?? null;
|
|
27
|
+
const trimmed = text.trimStart();
|
|
28
|
+
if (trimmed.startsWith('{')) {
|
|
29
|
+
let json;
|
|
30
|
+
try {
|
|
31
|
+
json = JSON.parse(trimmed);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
throw new ConformanceReportError(`not valid JSON: ${err.message}`);
|
|
35
|
+
}
|
|
36
|
+
const obj = json;
|
|
37
|
+
if (obj.format === FORME_CONFORMANCE_FORMAT)
|
|
38
|
+
return parseFormeJson(obj, file);
|
|
39
|
+
if (obj.report && typeof obj.report === 'object')
|
|
40
|
+
return parseVeraJson(obj.report, file);
|
|
41
|
+
throw new ConformanceReportError('not a veraPDF report or a Forme Review conformance file (JSON has neither "report" nor format "forme-review-conformance/1")');
|
|
42
|
+
}
|
|
43
|
+
if (trimmed.startsWith('<') && /<report\b/.test(trimmed) && /<job\b/.test(trimmed))
|
|
44
|
+
return parseVeraXml(trimmed, file);
|
|
45
|
+
throw new ConformanceReportError('not a veraPDF report or a Forme Review conformance file');
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Profiles: short names for the ones we know, verbatim for the rest.
|
|
49
|
+
const PROFILE_NAMES = [
|
|
50
|
+
[/^PDF\/UA-1\b/i, 'PDF/UA-1'],
|
|
51
|
+
[/^PDF\/UA-2\b/i, 'PDF/UA-2'],
|
|
52
|
+
[/^PDF\/A-1A\b/i, 'PDF/A-1a'],
|
|
53
|
+
[/^PDF\/A-1B\b/i, 'PDF/A-1b'],
|
|
54
|
+
[/^PDF\/A-2A\b/i, 'PDF/A-2a'],
|
|
55
|
+
[/^PDF\/A-2B\b/i, 'PDF/A-2b'],
|
|
56
|
+
[/^PDF\/A-2U\b/i, 'PDF/A-2u'],
|
|
57
|
+
[/^PDF\/A-3A\b/i, 'PDF/A-3a'],
|
|
58
|
+
[/^PDF\/A-3B\b/i, 'PDF/A-3b'],
|
|
59
|
+
[/^PDF\/A-3U\b/i, 'PDF/A-3u'],
|
|
60
|
+
[/^PDF\/A-4E\b/i, 'PDF/A-4e'],
|
|
61
|
+
[/^PDF\/A-4F\b/i, 'PDF/A-4f'],
|
|
62
|
+
[/^PDF\/A-4\b/i, 'PDF/A-4'],
|
|
63
|
+
];
|
|
64
|
+
/** "PDF/UA-1 validation profile" → "PDF/UA-1"; anything unknown keeps its name minus the suffix. */
|
|
65
|
+
export function profileShortName(reported) {
|
|
66
|
+
const bare = reported.replace(/\s+validation profile\s*$/i, '').trim();
|
|
67
|
+
for (const [re, name] of PROFILE_NAMES)
|
|
68
|
+
if (re.test(bare))
|
|
69
|
+
return name;
|
|
70
|
+
return bare;
|
|
71
|
+
}
|
|
72
|
+
function cap(failures) {
|
|
73
|
+
return {
|
|
74
|
+
failure_count: failures.length,
|
|
75
|
+
failures: failures.slice(0, CONFORMANCE_FAILURES_MAX).map((f) => ({ ...f, description: f.description.length > CONFORMANCE_DESCRIPTION_MAX ? f.description.slice(0, CONFORMANCE_DESCRIPTION_MAX) : f.description })),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const decodeXml = (s) => s.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(/&#(\d+);/g, (_, n) => String.fromCharCode(Number(n))).replace(/&/g, '&');
|
|
79
|
+
const attrs = (tag) => Object.fromEntries([...tag.matchAll(/([\w:-]+)="([^"]*)"/g)].map((m) => [m[1], decodeXml(m[2])]));
|
|
80
|
+
const toIso = (epochMs) => (epochMs && /^\d+$/.test(epochMs) ? new Date(Number(epochMs)).toISOString() : null);
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// veraPDF MRR XML: <report><buildInformation>…<jobs><job><item><name>…</name></item>
|
|
83
|
+
// <validationReport profileName isCompliant …><details><rule clause testNumber status failedChecks><description>…
|
|
84
|
+
function parseVeraXml(xml, file) {
|
|
85
|
+
const version = xml.match(/<releaseDetails\b[^>]*\bid="core"[^>]*\bversion="([^"]+)"/)?.[1] ?? xml.match(/<releaseDetails\b[^>]*\bversion="([^"]+)"/)?.[1] ?? 'unknown';
|
|
86
|
+
const items = [];
|
|
87
|
+
for (const job of xml.matchAll(/<job\b[^>]*>([\s\S]*?)<\/job>/g)) {
|
|
88
|
+
const body = job[1];
|
|
89
|
+
const path = decodeXml(body.match(/<item\b[^>]*>[\s\S]*?<name>([^<]*)<\/name>/)?.[1] ?? '');
|
|
90
|
+
if (!path)
|
|
91
|
+
continue;
|
|
92
|
+
const ranAt = toIso(body.match(/<duration\b[^>]*\bfinish="(\d+)"/)?.[1]);
|
|
93
|
+
const vr = body.match(/<validationReport\b([^>]*)>/);
|
|
94
|
+
if (!vr) {
|
|
95
|
+
// No validation report at all: the validator could not assess the file.
|
|
96
|
+
const message = decodeXml(body.match(/<exceptionMessage>([^<]*)<\/exceptionMessage>/)?.[1] ?? 'no validation report');
|
|
97
|
+
items.push({ path, result: { profile: 'unknown', verdict: 'error', tool: { name: 'veraPDF', version }, ran_at: ranAt, source: { format: 'verapdf-mrr-xml', file }, failure_count: 0, failures: [] } });
|
|
98
|
+
void message; // veraPDF's exception text is not a conformance failure; the verdict 'error' carries the fact
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const a = attrs(vr[1]);
|
|
102
|
+
const profile = profileShortName(a.profileName ?? 'unknown');
|
|
103
|
+
const verdict = a.jobEndStatus && a.jobEndStatus !== 'normal' ? 'error' : a.isCompliant === 'true' ? 'pass' : 'fail';
|
|
104
|
+
const failures = [];
|
|
105
|
+
for (const rule of body.matchAll(/<rule\b([^>]*)>([\s\S]*?)<\/rule>/g)) {
|
|
106
|
+
const ra = attrs(rule[1]);
|
|
107
|
+
if (ra.status !== 'failed')
|
|
108
|
+
continue;
|
|
109
|
+
failures.push({ clause: ra.clause ?? '?', test: ra.testNumber ? Number(ra.testNumber) : null, count: Number(ra.failedChecks ?? 1), description: decodeXml(rule[2].match(/<description>([\s\S]*?)<\/description>/)?.[1] ?? '').trim() });
|
|
110
|
+
}
|
|
111
|
+
items.push({ path, result: { profile, verdict, tool: { name: 'veraPDF', version }, ran_at: ranAt, source: { format: 'verapdf-mrr-xml', file }, ...cap(verdict === 'error' ? [] : failures) } });
|
|
112
|
+
}
|
|
113
|
+
if (items.length === 0)
|
|
114
|
+
throw new ConformanceReportError('veraPDF report contains no jobs');
|
|
115
|
+
return { format: 'verapdf-mrr-xml', items };
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// veraPDF JSON (--format json): report.jobs[].{itemDetails.name, validationResult{profileName, compliant, jobEndStatus, details.ruleSummaries[]}, taskException?}
|
|
119
|
+
function parseVeraJson(report, file) {
|
|
120
|
+
const build = report.buildInformation;
|
|
121
|
+
const version = build?.releaseDetails?.find((r) => r.id === 'core')?.version ?? build?.releaseDetails?.[0]?.version ?? 'unknown';
|
|
122
|
+
const jobs = report.jobs ?? [];
|
|
123
|
+
const items = [];
|
|
124
|
+
for (const job of jobs) {
|
|
125
|
+
const path = String(job.itemDetails?.name ?? '');
|
|
126
|
+
if (!path)
|
|
127
|
+
continue;
|
|
128
|
+
const dur = job.duration;
|
|
129
|
+
const ranAt = typeof dur?.finish === 'number' ? new Date(dur.finish).toISOString() : null;
|
|
130
|
+
const vrRaw = job.validationResult;
|
|
131
|
+
const vr = (Array.isArray(vrRaw) ? vrRaw[0] : vrRaw);
|
|
132
|
+
if (!vr) {
|
|
133
|
+
items.push({ path, result: { profile: 'unknown', verdict: 'error', tool: { name: 'veraPDF', version }, ran_at: ranAt, source: { format: 'verapdf-json', file }, failure_count: 0, failures: [] } });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const profile = profileShortName(String(vr.profileName ?? 'unknown'));
|
|
137
|
+
const verdict = vr.jobEndStatus && vr.jobEndStatus !== 'normal' ? 'error' : vr.compliant === true ? 'pass' : 'fail';
|
|
138
|
+
const summaries = (vr.details?.ruleSummaries ?? []).filter((r) => String(r.status ?? r.ruleStatus ?? '').toLowerCase() === 'failed');
|
|
139
|
+
const failures = summaries.map((r) => ({ clause: String(r.clause ?? '?'), test: typeof r.testNumber === 'number' ? r.testNumber : r.testNumber ? Number(r.testNumber) : null, count: Number(r.failedChecks ?? 1), description: String(r.description ?? '').trim() }));
|
|
140
|
+
items.push({ path, result: { profile, verdict, tool: { name: 'veraPDF', version }, ran_at: ranAt, source: { format: 'verapdf-json', file }, ...cap(verdict === 'error' ? [] : failures) } });
|
|
141
|
+
}
|
|
142
|
+
if (items.length === 0)
|
|
143
|
+
throw new ConformanceReportError('veraPDF report contains no jobs');
|
|
144
|
+
return { format: 'verapdf-json', items };
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// The documented shape: { format: 'forme-review-conformance/1', documents: { [path]: ConformanceResult[] } }
|
|
148
|
+
function parseFormeJson(obj, file) {
|
|
149
|
+
const docs = obj.documents;
|
|
150
|
+
if (!docs || typeof docs !== 'object')
|
|
151
|
+
throw new ConformanceReportError('forme-review-conformance/1 needs a "documents" object keyed by document path');
|
|
152
|
+
const items = [];
|
|
153
|
+
for (const [path, list] of Object.entries(docs)) {
|
|
154
|
+
if (!Array.isArray(list))
|
|
155
|
+
throw new ConformanceReportError(`documents["${path}"] must be an array of results`);
|
|
156
|
+
for (const raw of list) {
|
|
157
|
+
const verdict = raw.verdict;
|
|
158
|
+
if (verdict !== 'pass' && verdict !== 'fail' && verdict !== 'error')
|
|
159
|
+
throw new ConformanceReportError(`documents["${path}"]: verdict must be pass | fail | error`);
|
|
160
|
+
const tool = raw.tool;
|
|
161
|
+
if (!tool || typeof tool.name !== 'string' || typeof tool.version !== 'string')
|
|
162
|
+
throw new ConformanceReportError(`documents["${path}"]: tool { name, version } is required`);
|
|
163
|
+
if (typeof raw.profile !== 'string' || !raw.profile)
|
|
164
|
+
throw new ConformanceReportError(`documents["${path}"]: profile is required`);
|
|
165
|
+
const failures = (Array.isArray(raw.failures) ? raw.failures : []).map((f) => ({ clause: String(f.clause ?? '?'), test: typeof f.test === 'number' ? f.test : null, count: typeof f.count === 'number' ? f.count : 1, description: String(f.description ?? '') }));
|
|
166
|
+
const src = raw.source;
|
|
167
|
+
const capped = cap(failures);
|
|
168
|
+
items.push({ path, result: { profile: raw.profile, verdict, tool: { name: tool.name, version: tool.version }, ran_at: typeof raw.ran_at === 'string' ? raw.ran_at : null, source: { format: typeof src?.format === 'string' ? src.format : 'forme-review-conformance/1', file }, failure_count: typeof raw.failure_count === 'number' ? Math.max(raw.failure_count, capped.failure_count) : capped.failure_count, failures: capped.failures } });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { format: FORME_CONFORMANCE_FORMAT, items };
|
|
172
|
+
}
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
// Matching report items to the documents being uploaded: exact path, then basename.
|
|
175
|
+
const posix = (p) => p.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
176
|
+
const basename = (p) => posix(p).slice(posix(p).lastIndexOf('/') + 1);
|
|
177
|
+
export function matchConformanceToDocuments(items, documentPaths) {
|
|
178
|
+
const byDocument = {};
|
|
179
|
+
const unmatched = [];
|
|
180
|
+
const docs = documentPaths.map((d) => ({ path: d, norm: posix(d), base: basename(d) }));
|
|
181
|
+
for (const item of items) {
|
|
182
|
+
const norm = posix(item.path);
|
|
183
|
+
const exact = docs.find((d) => d.norm === norm || norm.endsWith('/' + d.norm));
|
|
184
|
+
const byBase = exact ?? docs.filter((d) => d.base === basename(item.path));
|
|
185
|
+
const target = exact ?? (Array.isArray(byBase) && byBase.length === 1 ? byBase[0] : undefined);
|
|
186
|
+
if (!target) {
|
|
187
|
+
unmatched.push(item.path);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
(byDocument[target.path] ??= []).push(item.result);
|
|
191
|
+
}
|
|
192
|
+
return { byDocument, unmatched };
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,4 +18,6 @@ export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
|
|
|
18
18
|
export { loadSnapshotFromFile } from './snapshot/load.js';
|
|
19
19
|
export { serializeSnapshot, computeContentHash, stableStringify } from './snapshot/serialize.js';
|
|
20
20
|
export { normalizeText, textPreview, textSimilarity } from './text/normalize.js';
|
|
21
|
+
export { parseConformanceReport, matchConformanceToDocuments, profileShortName, ConformanceReportError, CONFORMANCE_FAILURES_MAX, CONFORMANCE_DESCRIPTION_MAX, FORME_CONFORMANCE_FORMAT } from './conformance/index.js';
|
|
22
|
+
export type { ConformanceResult, ConformanceFailure, ConformanceVerdict, ConformanceItem, ParsedConformanceReport } from './conformance/index.js';
|
|
21
23
|
//# sourceMappingURL=index.d.ts.map
|
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,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,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,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzF,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;AAC7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,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,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,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,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzF,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;AAC7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,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;AAIjF,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACxN,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,4 +17,7 @@ export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
|
|
|
17
17
|
export { loadSnapshotFromFile } from './snapshot/load.js';
|
|
18
18
|
export { serializeSnapshot, computeContentHash, stableStringify } from './snapshot/serialize.js';
|
|
19
19
|
export { normalizeText, textPreview, textSimilarity } from './text/normalize.js';
|
|
20
|
+
// Conformance results from the customer's validator (veraPDF, or the documented
|
|
21
|
+
// JSON shape). Recorded and attributed; never validated here.
|
|
22
|
+
export { parseConformanceReport, matchConformanceToDocuments, profileShortName, ConformanceReportError, CONFORMANCE_FAILURES_MAX, CONFORMANCE_DESCRIPTION_MAX, FORME_CONFORMANCE_FORMAT } from './conformance/index.js';
|
|
20
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAoCxC,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,6DAA6D;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,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;AAE9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG1D,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;AAoCxC,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,6DAA6D;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,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;AAE9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG1D,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;AAEjF,gFAAgF;AAChF,8DAA8D;AAC9D,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdf-testkit/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Semantic structural model, extractors, and diff engine for pdf-testkit",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@formepdf/core": "0.20.
|
|
35
|
+
"@formepdf/core": "0.20.1",
|
|
36
36
|
"@napi-rs/canvas": "^0.1.100",
|
|
37
37
|
"pdfjs-dist": "^4.10.38"
|
|
38
38
|
},
|