dsh-data-quality 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.
Files changed (91) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +201 -0
  3. package/README.es.md +181 -0
  4. package/README.hi.md +181 -0
  5. package/README.md +181 -0
  6. package/README.pt.md +181 -0
  7. package/README.zh.md +181 -0
  8. package/THIRD_PARTY_NOTICES.md +20 -0
  9. package/cordis.patch.yml +46 -0
  10. package/lib/index.js +2458 -0
  11. package/lib/types/clean.d.ts +82 -0
  12. package/lib/types/clean.d.ts.map +1 -0
  13. package/lib/types/clean.js +351 -0
  14. package/lib/types/clean.js.map +1 -0
  15. package/lib/types/config.d.ts +47 -0
  16. package/lib/types/config.d.ts.map +1 -0
  17. package/lib/types/config.js +66 -0
  18. package/lib/types/config.js.map +1 -0
  19. package/lib/types/dataset.d.ts +133 -0
  20. package/lib/types/dataset.d.ts.map +1 -0
  21. package/lib/types/dataset.js +404 -0
  22. package/lib/types/dataset.js.map +1 -0
  23. package/lib/types/events.d.ts +73 -0
  24. package/lib/types/events.d.ts.map +1 -0
  25. package/lib/types/events.js +41 -0
  26. package/lib/types/events.js.map +1 -0
  27. package/lib/types/index.d.ts +45 -0
  28. package/lib/types/index.d.ts.map +1 -0
  29. package/lib/types/index.js +78 -0
  30. package/lib/types/index.js.map +1 -0
  31. package/lib/types/present.d.ts +24 -0
  32. package/lib/types/present.d.ts.map +1 -0
  33. package/lib/types/present.js +34 -0
  34. package/lib/types/present.js.map +1 -0
  35. package/lib/types/profile.d.ts +79 -0
  36. package/lib/types/profile.d.ts.map +1 -0
  37. package/lib/types/profile.js +196 -0
  38. package/lib/types/profile.js.map +1 -0
  39. package/lib/types/provider-local.d.ts +56 -0
  40. package/lib/types/provider-local.d.ts.map +1 -0
  41. package/lib/types/provider-local.js +163 -0
  42. package/lib/types/provider-local.js.map +1 -0
  43. package/lib/types/service.d.ts +160 -0
  44. package/lib/types/service.d.ts.map +1 -0
  45. package/lib/types/service.js +25 -0
  46. package/lib/types/service.js.map +1 -0
  47. package/lib/types/store.d.ts +61 -0
  48. package/lib/types/store.d.ts.map +1 -0
  49. package/lib/types/store.js +42 -0
  50. package/lib/types/store.js.map +1 -0
  51. package/lib/types/tools/clean.d.ts +14 -0
  52. package/lib/types/tools/clean.d.ts.map +1 -0
  53. package/lib/types/tools/clean.js +146 -0
  54. package/lib/types/tools/clean.js.map +1 -0
  55. package/lib/types/tools/profile.d.ts +13 -0
  56. package/lib/types/tools/profile.d.ts.map +1 -0
  57. package/lib/types/tools/profile.js +91 -0
  58. package/lib/types/tools/profile.js.map +1 -0
  59. package/lib/types/tools/shared.d.ts +19 -0
  60. package/lib/types/tools/shared.d.ts.map +1 -0
  61. package/lib/types/tools/shared.js +44 -0
  62. package/lib/types/tools/shared.js.map +1 -0
  63. package/lib/types/tools/verify.d.ts +14 -0
  64. package/lib/types/tools/verify.d.ts.map +1 -0
  65. package/lib/types/tools/verify.js +160 -0
  66. package/lib/types/tools/verify.js.map +1 -0
  67. package/lib/types/verify.d.ts +124 -0
  68. package/lib/types/verify.d.ts.map +1 -0
  69. package/lib/types/verify.js +391 -0
  70. package/lib/types/verify.js.map +1 -0
  71. package/lib/types/version.d.ts +8 -0
  72. package/lib/types/version.d.ts.map +1 -0
  73. package/lib/types/version.js +8 -0
  74. package/lib/types/version.js.map +1 -0
  75. package/package.json +137 -0
  76. package/src/clean.ts +382 -0
  77. package/src/config.ts +104 -0
  78. package/src/dataset.ts +445 -0
  79. package/src/events.ts +90 -0
  80. package/src/index.ts +115 -0
  81. package/src/present.ts +38 -0
  82. package/src/profile.ts +250 -0
  83. package/src/provider-local.ts +194 -0
  84. package/src/service.ts +172 -0
  85. package/src/store.ts +74 -0
  86. package/src/tools/clean.ts +150 -0
  87. package/src/tools/profile.ts +94 -0
  88. package/src/tools/shared.ts +47 -0
  89. package/src/tools/verify.ts +163 -0
  90. package/src/verify.ts +496 -0
  91. package/src/version.ts +8 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Declarative verification rules over a parsed {@link Table} (not-null,
3
+ * unique, range, regex, enum, cross-column, freshness) plus the frozen
4
+ * citation-checking semantics for `ctx.dataQuality.verifyCitations`. Pure and
5
+ * deterministic: the freshness clock is injected, numeric comparison never
6
+ * uses raw `===`, and evidence rows are capped by config.
7
+ * @module dsh-data-quality/verify
8
+ */
9
+ import { type Cell, type DocumentRoot, type Table } from './dataset.js';
10
+ import type { CitationCheckRequest, CitationCheckResult } from './service.js';
11
+ /** One declarative verification rule (discriminated on `rule`). */
12
+ export type VerifyRule = {
13
+ readonly rule: 'not-null';
14
+ readonly column: string;
15
+ } | {
16
+ readonly rule: 'unique';
17
+ readonly columns: readonly string[];
18
+ } | {
19
+ readonly rule: 'range';
20
+ readonly column: string;
21
+ readonly min?: number;
22
+ readonly max?: number;
23
+ } | {
24
+ readonly rule: 'regex';
25
+ readonly column: string;
26
+ readonly pattern: string;
27
+ readonly flags?: string;
28
+ } | {
29
+ readonly rule: 'enum';
30
+ readonly column: string;
31
+ readonly values: readonly string[];
32
+ } | {
33
+ readonly rule: 'cross-column';
34
+ readonly left: string;
35
+ readonly op: '<' | '<=' | '==' | '!=' | '>=' | '>';
36
+ readonly rightColumn?: string;
37
+ readonly value?: number | string;
38
+ } | {
39
+ readonly rule: 'freshness';
40
+ readonly column: string;
41
+ readonly maxAgeDays: number;
42
+ readonly asOf?: string;
43
+ };
44
+ /** Raised for invalid rules; `message` names the rule index and reason. */
45
+ export declare class VerifyRuleError extends Error {
46
+ readonly ruleIndex: number;
47
+ /**
48
+ * @param ruleIndex - index of the offending rule in the request array.
49
+ * @param message - actionable human-readable detail.
50
+ */
51
+ constructor(ruleIndex: number, message: string);
52
+ }
53
+ /** One failing row's evidence (capped per rule by `evidenceRowLimit`). */
54
+ export interface VerifyEvidenceRow {
55
+ /** 0-based data row index. */
56
+ readonly rowIndex: number;
57
+ /** Only the columns the rule inspected. */
58
+ readonly values: Record<string, Cell>;
59
+ }
60
+ /** One rule's outcome. */
61
+ export interface VerifyRuleResult {
62
+ readonly ruleIndex: number;
63
+ readonly rule: VerifyRule['rule'];
64
+ readonly passed: boolean;
65
+ /** Rows the predicate rejected. */
66
+ readonly failedCount: number;
67
+ /** Rows the predicate ran over. */
68
+ readonly checkedCount: number;
69
+ /** First `evidenceRowLimit` failing rows. */
70
+ readonly evidence: VerifyEvidenceRow[];
71
+ }
72
+ /** The full verify report (also the persisted and tool-returned value). */
73
+ export interface VerifyReport {
74
+ readonly dataset: string;
75
+ readonly passed: boolean;
76
+ readonly rowCount: number;
77
+ readonly rules: VerifyRuleResult[];
78
+ /** Storage-domain key of the persisted report, when persistence is on (set by the provider). */
79
+ readonly reportKey?: string;
80
+ /** Injected generation timestamp (epoch ms). */
81
+ readonly generatedAt: number;
82
+ }
83
+ /**
84
+ * Apply verification rules over a parsed table. A missing cell fails every
85
+ * rule that reads it. The overall `passed` is the conjunction of rule passes;
86
+ * a failing dataset is a normal result, never a thrown error.
87
+ * @param table - the parsed dataset.
88
+ * @param rules - non-empty rule list.
89
+ * @param options - evidence cap, injected clock for `freshness`, abort signal.
90
+ * @returns the verify report (without the dataset label; the caller adds it).
91
+ */
92
+ export declare function verifyTable(table: Table, rules: readonly VerifyRule[], options: {
93
+ evidenceRowLimit: number;
94
+ now: () => number;
95
+ signal?: AbortSignal | undefined;
96
+ }): Omit<VerifyReport, 'dataset'>;
97
+ /** Human-readable verify summary for the tool's Native render. */
98
+ export declare function renderVerifyText(report: VerifyReport): string;
99
+ /** One parsed locator segment: an object key plus optional array indices. */
100
+ interface LocatorSegment {
101
+ readonly key: string | undefined;
102
+ readonly indices: readonly number[];
103
+ }
104
+ /**
105
+ * Parse a JSON-path-ish locator (`rows[3].nav`, `summary.annualReturn`,
106
+ * `[0].value`) into walk segments. Throws on unparsable input.
107
+ * @param locator - the citation's path string.
108
+ * @returns ordered walk segments.
109
+ */
110
+ export declare function parseLocator(locator: string): LocatorSegment[];
111
+ /**
112
+ * The frozen citation-checking semantics: locate each citation's `path` in the
113
+ * dataset document, then compare. Numbers compare with relative `tolerance`
114
+ * (falling back to `defaultTolerance`); strings compare exactly. A missing
115
+ * location is `not-found`; an incomparable actual/cited type pair is
116
+ * `unverifiable`.
117
+ * @param root - the loaded dataset document.
118
+ * @param citations - citations to check.
119
+ * @param defaultTolerance - configured fallback relative tolerance.
120
+ * @returns one result per citation, ids echoed.
121
+ */
122
+ export declare function checkCitations(root: DocumentRoot, citations: CitationCheckRequest['citations'], defaultTolerance: number): CitationCheckResult;
123
+ export {};
124
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Declarative verification rules over a parsed {@link Table} (not-null,
3
+ * unique, range, regex, enum, cross-column, freshness) plus the frozen
4
+ * citation-checking semantics for `ctx.dataQuality.verifyCitations`. Pure and
5
+ * deterministic: the freshness clock is injected, numeric comparison never
6
+ * uses raw `===`, and evidence rows are capped by config.
7
+ * @module dsh-data-quality/verify
8
+ */
9
+ import { isMissing, parseDate, parseNumeric, throwIfAborted } from "./dataset.js";
10
+ /** Raised for invalid rules; `message` names the rule index and reason. */
11
+ export class VerifyRuleError extends Error {
12
+ ruleIndex;
13
+ /**
14
+ * @param ruleIndex - index of the offending rule in the request array.
15
+ * @param message - actionable human-readable detail.
16
+ */
17
+ constructor(ruleIndex, message) {
18
+ super(message);
19
+ this.ruleIndex = ruleIndex;
20
+ this.name = 'VerifyRuleError';
21
+ }
22
+ }
23
+ /** Assert `column` exists. */
24
+ function requireColumn(columns, column, ruleIndex) {
25
+ if (!columns.includes(column)) {
26
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: unknown column ${JSON.stringify(column)} (columns: ${columns.join(', ')})`);
27
+ }
28
+ }
29
+ /** The trimmed string form used for regex/enum/cross-column string comparison. */
30
+ function textOf(cell) {
31
+ if (typeof cell === 'string')
32
+ return cell.trim();
33
+ if (cell === null || cell === undefined)
34
+ return '';
35
+ if (typeof cell === 'object')
36
+ return JSON.stringify(cell);
37
+ return String(cell);
38
+ }
39
+ /** Run one per-row predicate and collect capped evidence. */
40
+ function evaluate(table, ruleIndex, ruleName, columns, predicate, evidenceRowLimit, signal) {
41
+ let failedCount = 0;
42
+ const evidence = [];
43
+ for (const [rowIndex, row] of table.rows.entries()) {
44
+ if (rowIndex % 1024 === 0)
45
+ throwIfAborted(signal);
46
+ if (predicate(row))
47
+ continue;
48
+ failedCount += 1;
49
+ if (evidence.length < evidenceRowLimit) {
50
+ const values = {};
51
+ for (const column of columns)
52
+ values[column] = row[column] ?? null;
53
+ evidence.push({ rowIndex, values });
54
+ }
55
+ }
56
+ return {
57
+ ruleIndex,
58
+ rule: ruleName,
59
+ passed: failedCount === 0,
60
+ failedCount,
61
+ checkedCount: table.rows.length,
62
+ evidence,
63
+ };
64
+ }
65
+ const CROSS_OPS = ['<', '<=', '==', '!=', '>=', '>'];
66
+ /**
67
+ * Apply verification rules over a parsed table. A missing cell fails every
68
+ * rule that reads it. The overall `passed` is the conjunction of rule passes;
69
+ * a failing dataset is a normal result, never a thrown error.
70
+ * @param table - the parsed dataset.
71
+ * @param rules - non-empty rule list.
72
+ * @param options - evidence cap, injected clock for `freshness`, abort signal.
73
+ * @returns the verify report (without the dataset label; the caller adds it).
74
+ */
75
+ export function verifyTable(table, rules, options) {
76
+ if (rules.length === 0) {
77
+ throw new VerifyRuleError(0, 'rules must be a non-empty array');
78
+ }
79
+ const results = [];
80
+ for (const [ruleIndex, rule] of rules.entries()) {
81
+ throwIfAborted(options.signal);
82
+ let result;
83
+ switch (rule.rule) {
84
+ case 'not-null': {
85
+ requireColumn(table.columns, rule.column, ruleIndex);
86
+ result = evaluate(table, ruleIndex, rule.rule, [rule.column], (row) => !isMissing(row[rule.column]), options.evidenceRowLimit, options.signal);
87
+ break;
88
+ }
89
+ case 'unique': {
90
+ if (rule.columns.length === 0) {
91
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: unique requires at least one column`);
92
+ }
93
+ for (const column of rule.columns)
94
+ requireColumn(table.columns, column, ruleIndex);
95
+ const counts = new Map();
96
+ for (const row of table.rows) {
97
+ const key = JSON.stringify(rule.columns.map((column) => row[column] ?? null));
98
+ counts.set(key, (counts.get(key) ?? 0) + 1);
99
+ }
100
+ result = evaluate(table, ruleIndex, rule.rule, rule.columns, (row) => (counts.get(JSON.stringify(rule.columns.map((column) => row[column] ?? null))) ?? 0) === 1, options.evidenceRowLimit, options.signal);
101
+ break;
102
+ }
103
+ case 'range': {
104
+ requireColumn(table.columns, rule.column, ruleIndex);
105
+ if (rule.min === undefined && rule.max === undefined) {
106
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: range requires at least one of min/max`);
107
+ }
108
+ result = evaluate(table, ruleIndex, rule.rule, [rule.column], (row) => {
109
+ const value = parseNumeric(row[rule.column]);
110
+ if (value === undefined)
111
+ return false;
112
+ if (rule.min !== undefined && value < rule.min)
113
+ return false;
114
+ if (rule.max !== undefined && value > rule.max)
115
+ return false;
116
+ return true;
117
+ }, options.evidenceRowLimit, options.signal);
118
+ break;
119
+ }
120
+ case 'regex': {
121
+ requireColumn(table.columns, rule.column, ruleIndex);
122
+ let pattern;
123
+ try {
124
+ pattern = new RegExp(rule.pattern, rule.flags ?? '');
125
+ }
126
+ catch (error) {
127
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: invalid regex ${JSON.stringify(rule.pattern)}: ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ result = evaluate(table, ruleIndex, rule.rule, [rule.column], (row) => {
130
+ const cell = row[rule.column];
131
+ if (isMissing(cell))
132
+ return false;
133
+ pattern.lastIndex = 0;
134
+ return pattern.test(textOf(cell));
135
+ }, options.evidenceRowLimit, options.signal);
136
+ break;
137
+ }
138
+ case 'enum': {
139
+ requireColumn(table.columns, rule.column, ruleIndex);
140
+ if (rule.values.length === 0) {
141
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: enum requires a non-empty values array`);
142
+ }
143
+ const allowed = new Set(rule.values);
144
+ result = evaluate(table, ruleIndex, rule.rule, [rule.column], (row) => {
145
+ const cell = row[rule.column];
146
+ if (isMissing(cell))
147
+ return false;
148
+ return allowed.has(textOf(cell));
149
+ }, options.evidenceRowLimit, options.signal);
150
+ break;
151
+ }
152
+ case 'cross-column': {
153
+ requireColumn(table.columns, rule.left, ruleIndex);
154
+ if (!CROSS_OPS.includes(rule.op)) {
155
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: unsupported op ${JSON.stringify(rule.op)}`);
156
+ }
157
+ const hasColumn = rule.rightColumn !== undefined;
158
+ const hasValue = rule.value !== undefined;
159
+ if (hasColumn === hasValue) {
160
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: cross-column needs exactly one of rightColumn/value`);
161
+ }
162
+ if (hasColumn)
163
+ requireColumn(table.columns, rule.rightColumn, ruleIndex);
164
+ const columns = hasColumn ? [rule.left, rule.rightColumn] : [rule.left];
165
+ result = evaluate(table, ruleIndex, rule.rule, columns, (row) => {
166
+ const left = row[rule.left];
167
+ const right = hasColumn ? row[rule.rightColumn] : rule.value;
168
+ if (isMissing(left) || isMissing(right))
169
+ return false;
170
+ const leftNum = parseNumeric(left);
171
+ const rightNum = parseNumeric(right);
172
+ if (leftNum !== undefined && rightNum !== undefined) {
173
+ switch (rule.op) {
174
+ case '<': return leftNum < rightNum;
175
+ case '<=': return leftNum <= rightNum;
176
+ case '>': return leftNum > rightNum;
177
+ case '>=': return leftNum >= rightNum;
178
+ case '==': return Math.abs(leftNum - rightNum) <= 1e-12 * Math.max(Math.abs(leftNum), Math.abs(rightNum), 1);
179
+ case '!=': return Math.abs(leftNum - rightNum) > 1e-12 * Math.max(Math.abs(leftNum), Math.abs(rightNum), 1);
180
+ }
181
+ }
182
+ // Date fallback: both sides date-parseable compares epochs (the startDate < endDate case).
183
+ const leftDate = parseDate(left);
184
+ const rightDate = parseDate(right);
185
+ if (leftDate !== undefined && rightDate !== undefined) {
186
+ switch (rule.op) {
187
+ case '<': return leftDate < rightDate;
188
+ case '<=': return leftDate <= rightDate;
189
+ case '>': return leftDate > rightDate;
190
+ case '>=': return leftDate >= rightDate;
191
+ case '==': return leftDate === rightDate;
192
+ case '!=': return leftDate !== rightDate;
193
+ }
194
+ }
195
+ // String fallback: only equality operators are defined.
196
+ const leftText = textOf(left);
197
+ const rightText = textOf(right);
198
+ if (rule.op === '==')
199
+ return leftText === rightText;
200
+ if (rule.op === '!=')
201
+ return leftText !== rightText;
202
+ return false;
203
+ }, options.evidenceRowLimit, options.signal);
204
+ break;
205
+ }
206
+ case 'freshness': {
207
+ requireColumn(table.columns, rule.column, ruleIndex);
208
+ if (!Number.isFinite(rule.maxAgeDays) || rule.maxAgeDays <= 0) {
209
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: freshness maxAgeDays must be a positive number, got ${String(rule.maxAgeDays)}`);
210
+ }
211
+ let asOf;
212
+ if (rule.asOf !== undefined) {
213
+ const parsed = parseDate(rule.asOf);
214
+ if (parsed === undefined) {
215
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: freshness asOf is not a recognized date: ${JSON.stringify(rule.asOf)}`);
216
+ }
217
+ asOf = parsed;
218
+ }
219
+ else {
220
+ asOf = options.now();
221
+ }
222
+ const maxAgeMs = rule.maxAgeDays * 86_400_000;
223
+ result = evaluate(table, ruleIndex, rule.rule, [rule.column], (row) => {
224
+ const epoch = parseDate(row[rule.column]);
225
+ if (epoch === undefined)
226
+ return false;
227
+ return asOf - epoch <= maxAgeMs;
228
+ }, options.evidenceRowLimit, options.signal);
229
+ break;
230
+ }
231
+ default:
232
+ throw new VerifyRuleError(ruleIndex, `rule ${ruleIndex}: unknown rule type ${JSON.stringify(rule.rule)}`);
233
+ }
234
+ results.push(result);
235
+ }
236
+ return {
237
+ passed: results.every((result) => result.passed),
238
+ rowCount: table.rows.length,
239
+ rules: results,
240
+ generatedAt: options.now(),
241
+ };
242
+ }
243
+ /** Human-readable verify summary for the tool's Native render. */
244
+ export function renderVerifyText(report) {
245
+ const lines = [];
246
+ lines.push(`Verification of ${report.dataset}: ${report.passed ? 'PASSED' : 'FAILED'} (${report.rowCount} rows, ${report.rules.length} rules)`);
247
+ for (const rule of report.rules) {
248
+ lines.push(`- [${rule.passed ? 'pass' : 'FAIL'}] rule ${rule.ruleIndex} (${rule.rule}): ${rule.failedCount}/${rule.checkedCount} row(s) failed`);
249
+ for (const row of rule.evidence) {
250
+ const cells = Object.entries(row.values).map(([column, value]) => `${column}=${JSON.stringify(value)}`).join(', ');
251
+ lines.push(` row ${row.rowIndex}: ${cells}`);
252
+ }
253
+ if (rule.failedCount > rule.evidence.length) {
254
+ lines.push(` … and ${rule.failedCount - rule.evidence.length} more failing row(s)`);
255
+ }
256
+ }
257
+ return lines.join('\n');
258
+ }
259
+ /**
260
+ * Parse a JSON-path-ish locator (`rows[3].nav`, `summary.annualReturn`,
261
+ * `[0].value`) into walk segments. Throws on unparsable input.
262
+ * @param locator - the citation's path string.
263
+ * @returns ordered walk segments.
264
+ */
265
+ export function parseLocator(locator) {
266
+ if (locator.trim() === '')
267
+ throw new Error('citation path must not be empty');
268
+ const segments = [];
269
+ for (const part of locator.split('.')) {
270
+ const match = /^([A-Za-z0-9_$-]*)((?:\[\d+\])*)$/u.exec(part);
271
+ if (match === null || (match[1] === '' && match[2] === '')) {
272
+ throw new Error(`unparsable citation path segment ${JSON.stringify(part)} in ${JSON.stringify(locator)}`);
273
+ }
274
+ const indices = [...(match[2] ?? '').matchAll(/\[(\d+)\]/gu)].map((index) => Number(index[1]));
275
+ segments.push({ key: match[1] === '' ? undefined : match[1], indices });
276
+ }
277
+ return segments;
278
+ }
279
+ /** Sentinel for a failed locator walk (distinguishable from an actual `undefined` value). */
280
+ const NOT_FOUND = Symbol('not-found');
281
+ /** Walk the document root along the parsed locator; returns {@link NOT_FOUND} when any step misses. */
282
+ function walkLocator(root, segments) {
283
+ let current = root.kind === 'table' ? { columns: root.columns, rows: root.rows } : root.value;
284
+ for (const segment of segments) {
285
+ if (segment.key !== undefined) {
286
+ if (typeof current !== 'object' || current === null || Array.isArray(current))
287
+ return NOT_FOUND;
288
+ if (!Object.prototype.hasOwnProperty.call(current, segment.key))
289
+ return NOT_FOUND;
290
+ current = current[segment.key];
291
+ }
292
+ for (const index of segment.indices) {
293
+ if (!Array.isArray(current) || index >= current.length)
294
+ return NOT_FOUND;
295
+ current = current[index];
296
+ }
297
+ }
298
+ return current;
299
+ }
300
+ /** Relative-tolerance numeric comparison (never raw `===` on floats). */
301
+ function numericClose(actual, cited, tolerance) {
302
+ return Math.abs(actual - cited) <= tolerance * Math.max(Math.abs(actual), Math.abs(cited), Number.MIN_VALUE);
303
+ }
304
+ /** Display form of a located value for evidence notes (`undefined` when it cannot be rendered). */
305
+ function displayActual(located) {
306
+ if (typeof located === 'string')
307
+ return located;
308
+ if (typeof located === 'number' || typeof located === 'boolean')
309
+ return String(located);
310
+ if (located === null)
311
+ return 'null';
312
+ const rendered = JSON.stringify(located);
313
+ return typeof rendered === 'string' ? rendered : undefined;
314
+ }
315
+ /**
316
+ * The frozen citation-checking semantics: locate each citation's `path` in the
317
+ * dataset document, then compare. Numbers compare with relative `tolerance`
318
+ * (falling back to `defaultTolerance`); strings compare exactly. A missing
319
+ * location is `not-found`; an incomparable actual/cited type pair is
320
+ * `unverifiable`.
321
+ * @param root - the loaded dataset document.
322
+ * @param citations - citations to check.
323
+ * @param defaultTolerance - configured fallback relative tolerance.
324
+ * @returns one result per citation, ids echoed.
325
+ */
326
+ export function checkCitations(root, citations, defaultTolerance) {
327
+ const results = [];
328
+ for (const citation of citations) {
329
+ let located;
330
+ try {
331
+ located = walkLocator(root, parseLocator(citation.path));
332
+ }
333
+ catch (error) {
334
+ results.push({
335
+ id: citation.id,
336
+ status: 'not-found',
337
+ note: `path ${JSON.stringify(citation.path)} is not a valid locator: ${error instanceof Error ? error.message : String(error)}`,
338
+ });
339
+ continue;
340
+ }
341
+ if (located === NOT_FOUND) {
342
+ results.push({ id: citation.id, status: 'not-found', note: `nothing found at ${JSON.stringify(citation.path)}` });
343
+ continue;
344
+ }
345
+ if (typeof citation.value === 'number') {
346
+ const actualNumber = typeof located === 'number' ? located : parseNumeric(located);
347
+ if (actualNumber === undefined) {
348
+ const display = displayActual(located);
349
+ results.push({
350
+ id: citation.id,
351
+ status: 'unverifiable',
352
+ ...(display !== undefined ? { actual: display } : {}),
353
+ note: `value at ${JSON.stringify(citation.path)} is not numeric and cannot be compared to ${citation.value}`,
354
+ });
355
+ continue;
356
+ }
357
+ const tolerance = citation.tolerance ?? defaultTolerance;
358
+ if (numericClose(actualNumber, citation.value, tolerance)) {
359
+ results.push({ id: citation.id, status: 'verified', actual: actualNumber, note: `within relative tolerance ${tolerance}` });
360
+ }
361
+ else {
362
+ results.push({
363
+ id: citation.id,
364
+ status: 'mismatch',
365
+ actual: actualNumber,
366
+ note: `cited ${citation.value} differs from actual ${actualNumber} beyond relative tolerance ${tolerance}`,
367
+ });
368
+ }
369
+ continue;
370
+ }
371
+ // Cited a string: exact comparison against a string actual only.
372
+ if (typeof located === 'string') {
373
+ if (located === citation.value) {
374
+ results.push({ id: citation.id, status: 'verified', actual: located });
375
+ }
376
+ else {
377
+ results.push({ id: citation.id, status: 'mismatch', actual: located, note: `cited ${JSON.stringify(citation.value)} != actual ${JSON.stringify(located)}` });
378
+ }
379
+ continue;
380
+ }
381
+ const display = displayActual(located);
382
+ results.push({
383
+ id: citation.id,
384
+ status: 'unverifiable',
385
+ ...(display !== undefined ? { actual: display } : {}),
386
+ note: `value at ${JSON.stringify(citation.path)} is ${typeof located}, not comparable to cited string`,
387
+ });
388
+ }
389
+ return { results };
390
+ }
391
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Plugin version, kept in one place so `scripts/release.mjs` can stamp it and
3
+ * reports can name their generator.
4
+ * @module dsh-data-quality/version
5
+ */
6
+ /** The package version reported in persisted reports. */
7
+ export declare const VERSION = "0.1.0";
8
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,eAAO,MAAM,OAAO,UAAU,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Plugin version, kept in one place so `scripts/release.mjs` can stamp it and
3
+ * reports can name their generator.
4
+ * @module dsh-data-quality/version
5
+ */
6
+ /** The package version reported in persisted reports. */
7
+ export const VERSION = '0.1.0';
8
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}