@ifc-lite/semantic 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 +373 -0
- package/README.md +22 -0
- package/dist/bsdd.d.ts +40 -0
- package/dist/bsdd.d.ts.map +1 -0
- package/dist/bsdd.js +53 -0
- package/dist/bsdd.js.map +1 -0
- package/dist/dictionary.d.ts +26 -0
- package/dist/dictionary.d.ts.map +1 -0
- package/dist/dictionary.js +36 -0
- package/dist/dictionary.js.map +1 -0
- package/dist/graph-import.d.ts +11 -0
- package/dist/graph-import.d.ts.map +1 -0
- package/dist/graph-import.js +79 -0
- package/dist/graph-import.js.map +1 -0
- package/dist/graph.d.ts +4 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +29 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/profile-artifacts.d.ts +104 -0
- package/dist/profile-artifacts.d.ts.map +1 -0
- package/dist/profile-artifacts.js +123 -0
- package/dist/profile-artifacts.js.map +1 -0
- package/dist/profile-index.d.ts +15 -0
- package/dist/profile-index.d.ts.map +1 -0
- package/dist/profile-index.js +11 -0
- package/dist/profile-index.js.map +1 -0
- package/dist/profile-types.d.ts +21 -0
- package/dist/profile-types.d.ts.map +1 -0
- package/dist/profile-types.js +5 -0
- package/dist/profile-types.js.map +1 -0
- package/dist/profiles.d.ts +38 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +174 -0
- package/dist/profiles.js.map +1 -0
- package/dist/projection.d.ts +8 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +70 -0
- package/dist/projection.js.map +1 -0
- package/dist/provider.d.ts +35 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +98 -0
- package/dist/provider.js.map +1 -0
- package/dist/query.d.ts +7 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +57 -0
- package/dist/query.js.map +1 -0
- package/dist/resolver.d.ts +56 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +89 -0
- package/dist/resolver.js.map +1 -0
- package/dist/results.d.ts +14 -0
- package/dist/results.d.ts.map +1 -0
- package/dist/results.js +73 -0
- package/dist/results.js.map +1 -0
- package/dist/server-listener.d.ts +5 -0
- package/dist/server-listener.d.ts.map +1 -0
- package/dist/server-listener.js +46 -0
- package/dist/server-listener.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +141 -0
- package/dist/server.js.map +1 -0
- package/dist/shacl-parameters.d.ts +6 -0
- package/dist/shacl-parameters.d.ts.map +1 -0
- package/dist/shacl-parameters.js +65 -0
- package/dist/shacl-parameters.js.map +1 -0
- package/dist/shacl-targets.d.ts +12 -0
- package/dist/shacl-targets.d.ts.map +1 -0
- package/dist/shacl-targets.js +114 -0
- package/dist/shacl-targets.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/validation-report.d.ts +35 -0
- package/dist/validation-report.d.ts.map +1 -0
- package/dist/validation-report.js +20 -0
- package/dist/validation-report.js.map +1 -0
- package/dist/validation.d.ts +26 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +201 -0
- package/dist/validation.js.map +1 -0
- package/dist/workspace.d.ts +32 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +140 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { LIMITS } from './types.js';
|
|
5
|
+
const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
6
|
+
const RDFS = 'http://www.w3.org/2000/01/rdf-schema#';
|
|
7
|
+
const SH = 'http://www.w3.org/ns/shacl#';
|
|
8
|
+
/** Topological work estimation bounds the recursive evaluator without altering
|
|
9
|
+
* valid repeated references. Acyclic DAG fan-out can exceed a cycle/depth guard. */
|
|
10
|
+
function assertBoundedDag(children, parents, kind) {
|
|
11
|
+
const remaining = new Map([...children].map(([node, values]) => [node, values.size]));
|
|
12
|
+
const work = new Map([...children.keys()].map(node => [node, 1]));
|
|
13
|
+
const depth = new Map([...children.keys()].map(node => [node, 1]));
|
|
14
|
+
const queue = [...children.keys()].filter(node => remaining.get(node) === 0);
|
|
15
|
+
let processed = 0;
|
|
16
|
+
let total = 0;
|
|
17
|
+
for (let index = 0; index < queue.length; index++) {
|
|
18
|
+
const node = queue[index];
|
|
19
|
+
processed++;
|
|
20
|
+
total += work.get(node);
|
|
21
|
+
if (total > LIMITS.quads * 2)
|
|
22
|
+
throw new Error(`${kind} traversal exceeds the supported work budget`);
|
|
23
|
+
for (const parent of parents.get(node) ?? []) {
|
|
24
|
+
const parentWork = work.get(parent) + work.get(node);
|
|
25
|
+
const parentDepth = Math.max(depth.get(parent), depth.get(node) + 1);
|
|
26
|
+
if (parentWork > LIMITS.quads)
|
|
27
|
+
throw new Error(`${kind} DAG exceeds the supported work budget`);
|
|
28
|
+
if (parentDepth > 64)
|
|
29
|
+
throw new Error(`${kind} traversal exceeds the supported 64-level depth`);
|
|
30
|
+
work.set(parent, parentWork);
|
|
31
|
+
depth.set(parent, parentDepth);
|
|
32
|
+
const count = remaining.get(parent) - 1;
|
|
33
|
+
remaining.set(parent, count);
|
|
34
|
+
if (!count)
|
|
35
|
+
queue.push(parent);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (processed !== children.size)
|
|
39
|
+
throw new Error(`Cyclic ${kind} references are unsupported`);
|
|
40
|
+
}
|
|
41
|
+
/** SHACL property references may compose nonrecursive shapes. Imported cycles
|
|
42
|
+
* must fail before the validator's repeated-pair cache can silently accept them. */
|
|
43
|
+
export function assertBoundedPropertyShapes(shapes) {
|
|
44
|
+
const children = new Map();
|
|
45
|
+
const parents = new Map();
|
|
46
|
+
for (const quad of shapes.getQuads(null, SH + 'property', null, null)) {
|
|
47
|
+
if (!['NamedNode', 'BlankNode'].includes(quad.object.termType))
|
|
48
|
+
throw new Error('SHACL property shapes require resource references');
|
|
49
|
+
const parent = `${quad.subject.termType}:${quad.subject.value}`;
|
|
50
|
+
const child = `${quad.object.termType}:${quad.object.value}`;
|
|
51
|
+
const descendants = children.get(parent) ?? new Set();
|
|
52
|
+
descendants.add(child);
|
|
53
|
+
children.set(parent, descendants);
|
|
54
|
+
if (!children.has(child))
|
|
55
|
+
children.set(child, new Set());
|
|
56
|
+
const ancestors = parents.get(child) ?? new Set();
|
|
57
|
+
ancestors.add(parent);
|
|
58
|
+
parents.set(child, ancestors);
|
|
59
|
+
}
|
|
60
|
+
assertBoundedDag(children, parents, 'SHACL property-shape');
|
|
61
|
+
}
|
|
62
|
+
/** The installed validator recursively traverses subclasses. Reject unsafe RDF
|
|
63
|
+
* before handing it off: cycles, deep acyclic paths and repeated DAG fan-out
|
|
64
|
+
* require separate checks. The raw imported graph remains unchanged. */
|
|
65
|
+
export function assertBoundedSubclasses(store) {
|
|
66
|
+
const children = new Map();
|
|
67
|
+
const parents = new Map();
|
|
68
|
+
for (const quad of store.getQuads(null, RDFS + 'subClassOf', null, null)) {
|
|
69
|
+
if (!['NamedNode', 'BlankNode'].includes(quad.object.termType))
|
|
70
|
+
throw new Error('RDFS subclass relationships require resource nodes');
|
|
71
|
+
const child = `${quad.subject.termType}:${quad.subject.value}`;
|
|
72
|
+
const parent = `${quad.object.termType}:${quad.object.value}`;
|
|
73
|
+
const descendants = children.get(parent) ?? new Set();
|
|
74
|
+
descendants.add(child);
|
|
75
|
+
children.set(parent, descendants);
|
|
76
|
+
if (!children.has(child))
|
|
77
|
+
children.set(child, new Set());
|
|
78
|
+
const ancestors = parents.get(child) ?? new Set();
|
|
79
|
+
ancestors.add(parent);
|
|
80
|
+
parents.set(child, ancestors);
|
|
81
|
+
}
|
|
82
|
+
assertBoundedDag(children, parents, 'RDFS subclass');
|
|
83
|
+
}
|
|
84
|
+
/** SHACL instances include explicitly typed subclasses in the supplied graph.
|
|
85
|
+
* This is local SHACL class membership, without remote ontologies or OWL inference. */
|
|
86
|
+
export function countShapeTargets(data, shapes) {
|
|
87
|
+
if (shapes.countQuads(null, RDF + 'type', RDFS + 'Class', null))
|
|
88
|
+
throw new Error('Implicit class shapes are unsupported; declare explicit SHACL targets');
|
|
89
|
+
if (shapes.countQuads(null, RDFS + 'subClassOf', null, null))
|
|
90
|
+
throw new Error('Subclass definitions in shapes are unsupported; supply local class relationships in the data graph');
|
|
91
|
+
let targets = shapes.countQuads(null, SH + 'targetNode', null, null);
|
|
92
|
+
// Membership is a pure function of a class and this data graph. A global set
|
|
93
|
+
// avoids re-walking shared subclass DAGs across repeated target declarations.
|
|
94
|
+
const visited = new Set();
|
|
95
|
+
for (const target of shapes.getQuads(null, SH + 'targetClass', null, null)) {
|
|
96
|
+
const pending = [target.object];
|
|
97
|
+
while (pending.length) {
|
|
98
|
+
const current = pending.pop();
|
|
99
|
+
const key = `${current.termType}:${current.value}`;
|
|
100
|
+
if (visited.has(key))
|
|
101
|
+
continue;
|
|
102
|
+
visited.add(key);
|
|
103
|
+
targets += data.countQuads(null, RDF + 'type', current, null);
|
|
104
|
+
for (const subclass of data.getQuads(null, RDFS + 'subClassOf', current, null))
|
|
105
|
+
pending.push(subclass.subject);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
for (const target of shapes.getQuads(null, SH + 'targetSubjectsOf', null, null))
|
|
109
|
+
targets += data.countQuads(null, target.object, null, null);
|
|
110
|
+
for (const target of shapes.getQuads(null, SH + 'targetObjectsOf', null, null))
|
|
111
|
+
targets += data.countQuads(null, target.object, null, null);
|
|
112
|
+
return targets;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=shacl-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shacl-targets.js","sourceRoot":"","sources":["../src/shacl-targets.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare const GUID_PATTERN = "^[0-3][0-9A-Za-z_$]{21}$";
|
|
2
|
+
/** W3C SPARQL JSON RDF terms; an absent binding remains absent. */
|
|
3
|
+
export interface RdfBinding {
|
|
4
|
+
type: 'uri' | 'literal' | 'bnode';
|
|
5
|
+
value: string;
|
|
6
|
+
datatype?: string;
|
|
7
|
+
'xml:lang'?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SparqlResults {
|
|
10
|
+
columns: string[];
|
|
11
|
+
rows: Record<string, RdfBinding>[];
|
|
12
|
+
}
|
|
13
|
+
/** Multi-valued predicates are preserved independently of any domain profile. */
|
|
14
|
+
export interface SemanticRecord {
|
|
15
|
+
id: string;
|
|
16
|
+
types: string[];
|
|
17
|
+
properties: Record<string, RdfBinding[]>;
|
|
18
|
+
}
|
|
19
|
+
export interface SemanticDataset {
|
|
20
|
+
id: string;
|
|
21
|
+
source: string;
|
|
22
|
+
completeness: 'complete' | 'partial';
|
|
23
|
+
resources?: SemanticRecord[];
|
|
24
|
+
rows?: SparqlResults;
|
|
25
|
+
graph?: string;
|
|
26
|
+
graphFormat?: 'text/turtle' | 'application/n-quads';
|
|
27
|
+
profileId?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const LIMITS: Readonly<{
|
|
30
|
+
bytes: number;
|
|
31
|
+
rows: 5000;
|
|
32
|
+
quads: 50000;
|
|
33
|
+
findings: 1000;
|
|
34
|
+
literalCharacters: 65536;
|
|
35
|
+
query: 256000;
|
|
36
|
+
timeoutMs: 15000;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
39
|
+
export declare function assertIri(value: string): void;
|
|
40
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,aAAa;IAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAA;CAAE;AACxF,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;CAAE;AACzG,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;IACjE,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,aAAa,GAAG,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CACzF;AACD,eAAO,MAAM,MAAM;;;;;;;;EAAiJ,CAAC;AACrK,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG7C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export const GUID_PATTERN = '^[0-3][0-9A-Za-z_$]{21}$';
|
|
5
|
+
export const LIMITS = Object.freeze({ bytes: 5 * 1024 * 1024, rows: 5000, quads: 50000, findings: 1000, literalCharacters: 65536, query: 256000, timeoutMs: 15000 });
|
|
6
|
+
export function isObject(value) {
|
|
7
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
export function assertIri(value) {
|
|
10
|
+
if (!value || /[\s<>"{}|^`\\]/u.test(value))
|
|
11
|
+
throw new Error('Expected an absolute IRI');
|
|
12
|
+
try {
|
|
13
|
+
new URL(value);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error('Expected an absolute IRI');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAgBvD,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACrK,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzF,IAAI,CAAC;QAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ProfileDefinition } from './profiles.js';
|
|
2
|
+
import type { ValidationFinding } from './profile-types.js';
|
|
3
|
+
export interface ValidationReport {
|
|
4
|
+
schemaVersion: 1;
|
|
5
|
+
profile: {
|
|
6
|
+
id: string;
|
|
7
|
+
version: string;
|
|
8
|
+
};
|
|
9
|
+
scope: 'profile' | 'graph';
|
|
10
|
+
completeness: 'complete' | 'partial';
|
|
11
|
+
source?: string;
|
|
12
|
+
engines: ValidationFinding['engine'][];
|
|
13
|
+
limits: {
|
|
14
|
+
bytes: number;
|
|
15
|
+
quads: number;
|
|
16
|
+
findings: number;
|
|
17
|
+
};
|
|
18
|
+
conforms: boolean;
|
|
19
|
+
truncated: boolean;
|
|
20
|
+
counts: Record<'Violation' | 'Warning' | 'Info', number>;
|
|
21
|
+
findings: (ValidationFinding & {
|
|
22
|
+
severity: NonNullable<ValidationFinding['severity']>;
|
|
23
|
+
})[];
|
|
24
|
+
}
|
|
25
|
+
/** Stable report envelope across workers, browser and headless clients. */
|
|
26
|
+
export declare function createValidationReport(input: {
|
|
27
|
+
profile?: ProfileDefinition;
|
|
28
|
+
scope: ValidationReport['scope'];
|
|
29
|
+
completeness: ValidationReport['completeness'];
|
|
30
|
+
source?: string;
|
|
31
|
+
findings: readonly ValidationFinding[];
|
|
32
|
+
engines?: ValidationFinding['engine'][];
|
|
33
|
+
limits?: Partial<ValidationReport['limits']>;
|
|
34
|
+
}): ValidationReport;
|
|
35
|
+
//# sourceMappingURL=validation-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-report.d.ts","sourceRoot":"","sources":["../src/validation-report.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,QAAQ,EAAE,CAAC,iBAAiB,GAAG;QAAE,QAAQ,EAAE,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,CAAC,EAAE,CAAC;CAC5F;AACD,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAAC,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC9G,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjG,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC9C,GAAG,gBAAgB,CAUnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { DEFAULT_PROFILE } from './profiles.js';
|
|
5
|
+
import { LIMITS } from './types.js';
|
|
6
|
+
/** Stable report envelope across workers, browser and headless clients. */
|
|
7
|
+
export function createValidationReport(input) {
|
|
8
|
+
const profile = input.profile ?? DEFAULT_PROFILE;
|
|
9
|
+
const limits = { bytes: input.limits?.bytes ?? LIMITS.bytes, quads: input.limits?.quads ?? LIMITS.quads, findings: input.limits?.findings ?? LIMITS.findings };
|
|
10
|
+
if (Object.values(limits).some(value => !Number.isInteger(value) || value < 1) || limits.bytes > LIMITS.bytes || limits.quads > LIMITS.quads || limits.findings > LIMITS.findings)
|
|
11
|
+
throw new Error('Invalid validation report limits');
|
|
12
|
+
const counts = { Violation: 0, Warning: 0, Info: 0 };
|
|
13
|
+
for (const finding of input.findings)
|
|
14
|
+
counts[finding.severity ?? 'Violation']++;
|
|
15
|
+
return { schemaVersion: 1, profile: { id: profile.id, version: profile.version }, scope: input.scope, completeness: input.completeness,
|
|
16
|
+
...(input.source ? { source: input.source } : {}), engines: input.engines ?? [...new Set(input.findings.map(finding => finding.engine))], limits,
|
|
17
|
+
conforms: counts.Violation === 0 && input.findings.length < limits.findings, truncated: input.findings.length >= limits.findings,
|
|
18
|
+
counts, findings: input.findings.slice(0, limits.findings).map(finding => ({ ...finding, severity: finding.severity ?? 'Violation' })) };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=validation-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-report.js","sourceRoot":"","sources":["../src/validation-report.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,eAAe,EAA0B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAgBpC,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,KAItC;IACC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC;IACjD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/J,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACvO,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;QAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,EAAE,CAAC;IAChF,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY;QACpI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM;QAChJ,QAAQ,EAAE,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ;QAChI,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7I,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { NodeObject } from 'jsonld';
|
|
2
|
+
import jsonld from 'jsonld';
|
|
3
|
+
import { type ProfileDefinition } from './profiles.js';
|
|
4
|
+
import type { SemanticDocument, SemanticResource, ValidationFinding } from './profile-types.js';
|
|
5
|
+
export { isUri } from './profiles.js';
|
|
6
|
+
export declare function parseProfileDocument(value: unknown, profile?: ProfileDefinition): SemanticDocument;
|
|
7
|
+
export declare const parseDocument: typeof parseProfileDocument;
|
|
8
|
+
export declare function parseImport(value: unknown, profile?: ProfileDefinition): SemanticDocument;
|
|
9
|
+
export declare function validateJson(document: SemanticDocument, profile?: ProfileDefinition): ValidationFinding[];
|
|
10
|
+
export declare function validateLinks(document: SemanticDocument, profile?: ProfileDefinition): ValidationFinding[];
|
|
11
|
+
export declare function validateProfileDocument(document: SemanticDocument, profile?: ProfileDefinition): ValidationFinding[];
|
|
12
|
+
export declare function asJsonLd(document: SemanticDocument, profile?: ProfileDefinition): {
|
|
13
|
+
'@context': jsonld.ContextDefinition;
|
|
14
|
+
'@graph': NodeObject[];
|
|
15
|
+
};
|
|
16
|
+
export declare function toRdf(document: SemanticDocument, profile?: ProfileDefinition): Promise<string>;
|
|
17
|
+
export interface GraphValidationOptions {
|
|
18
|
+
profile?: ProfileDefinition;
|
|
19
|
+
shapes?: string;
|
|
20
|
+
maxBytes?: number;
|
|
21
|
+
maxQuads?: number;
|
|
22
|
+
maxErrors?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function validateGraph(rdf: string, options?: GraphValidationOptions | ProfileDefinition): Promise<ValidationFinding[]>;
|
|
25
|
+
export declare function documentOf(resources: SemanticResource[], source: string, profile?: ProfileDefinition): SemanticDocument;
|
|
26
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKhG,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,oBAAkB,GAAG,gBAAgB,CAahG;AACD,eAAO,MAAM,aAAa,6BAAuB,CAAC;AAClD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,oBAAkB,GAAG,gBAAgB,CAEvF;AACD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,oBAAkB,GAAG,iBAAiB,EAAE,CAmBvG;AACD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,oBAAkB,GAAG,iBAAiB,EAAE,CAiBxG;AACD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,oBAAkB,GAAG,iBAAiB,EAAE,CAGlH;AACD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,oBAAkB;;;EAG7E;AACD,wBAAsB,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,oBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlG;AACD,MAAM,WAAW,sBAAsB;IAAG,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAalJ,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAAsB,GAAG,iBAAsB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA+DvI;AACD,wBAAgB,UAAU,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,oBAAkB,GAAG,gBAAgB,CAErH"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { Ajv } from 'ajv';
|
|
5
|
+
import jsonld from 'jsonld';
|
|
6
|
+
import { Parser, Store } from 'n3';
|
|
7
|
+
import SHACLValidator from 'rdf-validate-shacl';
|
|
8
|
+
import ShapesGraph from 'rdf-validate-shacl/src/shapes-graph.js';
|
|
9
|
+
import { DEFAULT_PROFILE, assertProfile, isUri } from './profiles.js';
|
|
10
|
+
import { exchangeSchema, resourceSchema, profileContext, shapesTurtle } from './profile-artifacts.js';
|
|
11
|
+
import { LIMITS } from './types.js';
|
|
12
|
+
import { assertShapeParameters } from './shacl-parameters.js';
|
|
13
|
+
import { assertBoundedSubclasses, assertBoundedPropertyShapes, countShapeTargets } from './shacl-targets.js';
|
|
14
|
+
export { isUri } from './profiles.js';
|
|
15
|
+
function compiler() { const ajv = new Ajv({ allErrors: true }); ajv.addFormat('uri', isUri); return ajv; }
|
|
16
|
+
export function parseProfileDocument(value, profile = DEFAULT_PROFILE) {
|
|
17
|
+
const ajv = compiler();
|
|
18
|
+
const validate = ajv.compile(exchangeSchema(profile, true));
|
|
19
|
+
if (!validate(value))
|
|
20
|
+
throw new Error(ajv.errorsText(validate.errors));
|
|
21
|
+
const ids = new Set();
|
|
22
|
+
for (const record of value.resources) {
|
|
23
|
+
if (ids.has(record.id))
|
|
24
|
+
throw new Error(`Duplicate resource identifier: ${record.id}`);
|
|
25
|
+
ids.add(record.id);
|
|
26
|
+
for (const [key, field] of Object.entries(profile.fields))
|
|
27
|
+
if (field.kind === 'language' && record[key]) {
|
|
28
|
+
const languages = Object.keys(record[key]).map(language => language.toLowerCase());
|
|
29
|
+
if (new Set(languages).size !== languages.length)
|
|
30
|
+
throw new Error(`Duplicate language tag on ${record.id}.${key}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
export const parseDocument = parseProfileDocument;
|
|
36
|
+
export function parseImport(value, profile = DEFAULT_PROFILE) {
|
|
37
|
+
return parseProfileDocument(value && typeof value === 'object' && 'document' in value ? value.document : value, profile);
|
|
38
|
+
}
|
|
39
|
+
export function validateJson(document, profile = DEFAULT_PROFILE) {
|
|
40
|
+
assertProfile(profile);
|
|
41
|
+
const ajv = compiler();
|
|
42
|
+
const validators = new Map();
|
|
43
|
+
const findings = [];
|
|
44
|
+
for (const resource of document.resources) {
|
|
45
|
+
if (!Object.hasOwn(profile.types, resource.type))
|
|
46
|
+
findings.push({ engine: 'JSON Schema', resourceId: resource.id, path: 'type', message: `Unknown type: ${resource.type}` });
|
|
47
|
+
else {
|
|
48
|
+
let validate = validators.get(resource.type);
|
|
49
|
+
if (!validate) {
|
|
50
|
+
validate = ajv.compile(resourceSchema(resource.type, profile));
|
|
51
|
+
validators.set(resource.type, validate);
|
|
52
|
+
}
|
|
53
|
+
validate(resource);
|
|
54
|
+
for (const error of validate.errors ?? []) {
|
|
55
|
+
findings.push({ engine: 'JSON Schema', resourceId: resource.id,
|
|
56
|
+
path: error.instancePath || String(error.params.missingProperty ?? ''), message: error.message ?? error.keyword });
|
|
57
|
+
if (findings.length === LIMITS.findings)
|
|
58
|
+
return findings;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (findings.length === LIMITS.findings)
|
|
62
|
+
return findings;
|
|
63
|
+
}
|
|
64
|
+
return findings;
|
|
65
|
+
}
|
|
66
|
+
export function validateLinks(document, profile = DEFAULT_PROFILE) {
|
|
67
|
+
assertProfile(profile);
|
|
68
|
+
const byId = new Map(document.resources.map(record => [record.id, record]));
|
|
69
|
+
const findings = [];
|
|
70
|
+
for (const record of document.resources)
|
|
71
|
+
for (const key of Object.keys(profile.types[record.type]?.fields ?? {})) {
|
|
72
|
+
const field = profile.fields[key];
|
|
73
|
+
if (field.kind !== 'iri' || field.external || !record[key])
|
|
74
|
+
continue;
|
|
75
|
+
const values = Array.isArray(record[key]) ? record[key] : [record[key]];
|
|
76
|
+
for (const target of values) {
|
|
77
|
+
const found = typeof target === 'string' ? byId.get(target) : undefined;
|
|
78
|
+
const message = found && field.targetType && found.type !== field.targetType ? `Expected ${field.targetType}, found ${found.type}: ${String(target)}`
|
|
79
|
+
: !found && document.completeness === 'complete' ? `Referenced resource is absent from this complete submission: ${String(target)}` : undefined;
|
|
80
|
+
if (message)
|
|
81
|
+
findings.push({ engine: 'links', resourceId: record.id, path: key, message });
|
|
82
|
+
if (findings.length === LIMITS.findings)
|
|
83
|
+
return findings;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return findings;
|
|
87
|
+
}
|
|
88
|
+
export function validateProfileDocument(document, profile = DEFAULT_PROFILE) {
|
|
89
|
+
parseProfileDocument(document, profile);
|
|
90
|
+
return [...validateJson(document, profile), ...validateLinks(document, profile)];
|
|
91
|
+
}
|
|
92
|
+
export function asJsonLd(document, profile = DEFAULT_PROFILE) {
|
|
93
|
+
parseProfileDocument(document, profile);
|
|
94
|
+
return { '@context': profileContext(profile), '@graph': document.resources.map(record => ({ ...record })) };
|
|
95
|
+
}
|
|
96
|
+
export async function toRdf(document, profile = DEFAULT_PROFILE) {
|
|
97
|
+
const value = await jsonld.toRDF(asJsonLd(document, profile), { format: 'application/n-quads',
|
|
98
|
+
documentLoader: async () => { throw new Error('Remote JSON-LD contexts are disabled; use the generated inline context'); } });
|
|
99
|
+
if (typeof value !== 'string')
|
|
100
|
+
throw new Error('Expected N-Quads from JSON-LD conversion');
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
const SH = 'http://www.w3.org/ns/shacl#';
|
|
104
|
+
const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
105
|
+
/** Intentionally bounded SHACL Core subset; reject executable, recursive and complex paths. */
|
|
106
|
+
const supported = new Set(['IRI', 'Literal', 'BlankNode', 'BlankNodeOrIRI', 'BlankNodeOrLiteral', 'IRIOrLiteral', 'Violation', 'Warning', 'Info', 'NodeShape', 'PropertyShape', 'targetClass', 'targetNode', 'targetSubjectsOf', 'targetObjectsOf', 'property', 'path', 'closed', 'ignoredProperties',
|
|
107
|
+
'minCount', 'maxCount', 'maxLength', 'datatype', 'nodeKind', 'class', 'pattern', 'flags', 'in', 'minInclusive', 'maxInclusive', 'uniqueLang', 'languageIn', 'severity', 'message', 'name', 'description', 'deactivated']);
|
|
108
|
+
function parseBounded(text, maxBytes, maxQuads) {
|
|
109
|
+
if (new TextEncoder().encode(text).byteLength > maxBytes)
|
|
110
|
+
throw new Error(`RDF exceeds the ${maxBytes} byte limit`);
|
|
111
|
+
const parsed = new Parser().parse(text);
|
|
112
|
+
if (parsed.length > maxQuads)
|
|
113
|
+
throw new Error(`RDF exceeds the ${maxQuads} quad limit`);
|
|
114
|
+
const store = new Store(parsed);
|
|
115
|
+
return store;
|
|
116
|
+
}
|
|
117
|
+
export async function validateGraph(rdf, options = {}) {
|
|
118
|
+
const opts = 'types' in options ? { profile: options } : options;
|
|
119
|
+
const profile = opts.profile ?? DEFAULT_PROFILE;
|
|
120
|
+
assertProfile(profile);
|
|
121
|
+
const bytes = opts.maxBytes ?? LIMITS.bytes;
|
|
122
|
+
const quads = opts.maxQuads ?? LIMITS.quads;
|
|
123
|
+
const maxErrors = opts.maxErrors ?? LIMITS.findings;
|
|
124
|
+
if (!Number.isInteger(bytes) || bytes < 1 || bytes > LIMITS.bytes || !Number.isInteger(quads) || quads < 1 || quads > LIMITS.quads
|
|
125
|
+
|| !Number.isInteger(maxErrors) || maxErrors < 1 || maxErrors > LIMITS.findings)
|
|
126
|
+
throw new Error('Validation limits must be positive integers within the supported bounds');
|
|
127
|
+
const data = parseBounded(rdf, bytes, quads);
|
|
128
|
+
const shapes = parseBounded(opts.shapes ?? await shapesTurtle(profile), bytes, quads);
|
|
129
|
+
for (const quad of shapes) {
|
|
130
|
+
if (quad.predicate.value.startsWith(SH) && !supported.has(quad.predicate.value.slice(SH.length)))
|
|
131
|
+
throw new Error(`Unsupported SHACL constraint: ${quad.predicate.value}`);
|
|
132
|
+
// RDF type declarations can introduce unsupported SHACL execution models.
|
|
133
|
+
// Other objects (enum values, paths, messages and class IRIs) are data terms.
|
|
134
|
+
if (quad.predicate.value === RDF + 'type' && quad.object.termType === 'NamedNode' && quad.object.value.startsWith(SH)
|
|
135
|
+
&& !supported.has(quad.object.value.slice(SH.length)))
|
|
136
|
+
throw new Error(`Unsupported SHACL shape declaration: ${quad.object.value}`);
|
|
137
|
+
if (quad.predicate.value === SH + 'path' && quad.object.termType !== 'NamedNode')
|
|
138
|
+
throw new Error('Only direct IRI property paths are supported');
|
|
139
|
+
}
|
|
140
|
+
assertShapeParameters(shapes);
|
|
141
|
+
// Malformed/cyclic RDF lists otherwise let validators traverse file-controlled loops.
|
|
142
|
+
const verifiedLists = new Set();
|
|
143
|
+
const listRoots = [...shapes.getQuads(null, RDF + 'first', null, null).map(quad => quad.subject),
|
|
144
|
+
...['in', 'ignoredProperties', 'languageIn'].flatMap(predicate => shapes.getQuads(null, SH + predicate, null, null).map(quad => quad.object))];
|
|
145
|
+
for (const root of listRoots) {
|
|
146
|
+
if (root.termType !== 'NamedNode' && root.termType !== 'BlankNode')
|
|
147
|
+
throw new Error('SHACL list constraints require RDF resource lists');
|
|
148
|
+
const visited = new Set();
|
|
149
|
+
let cursor = root;
|
|
150
|
+
while (cursor.value !== RDF + 'nil') {
|
|
151
|
+
const key = `${cursor.termType}:${cursor.value}`;
|
|
152
|
+
if (verifiedLists.has(key))
|
|
153
|
+
break;
|
|
154
|
+
if (visited.has(key) || visited.size > LIMITS.findings)
|
|
155
|
+
throw new Error('Cyclic or oversized SHACL RDF list');
|
|
156
|
+
visited.add(key);
|
|
157
|
+
const first = shapes.getQuads(cursor, RDF + 'first', null, null);
|
|
158
|
+
const rest = shapes.getQuads(cursor, RDF + 'rest', null, null);
|
|
159
|
+
if (first.length !== 1 || rest.length !== 1)
|
|
160
|
+
throw new Error('Malformed SHACL RDF list');
|
|
161
|
+
const next = rest[0].object;
|
|
162
|
+
if (next.termType !== 'NamedNode' && next.termType !== 'BlankNode')
|
|
163
|
+
throw new Error('Invalid SHACL RDF list tail');
|
|
164
|
+
cursor = next;
|
|
165
|
+
}
|
|
166
|
+
for (const node of visited)
|
|
167
|
+
verifiedLists.add(node);
|
|
168
|
+
}
|
|
169
|
+
assertBoundedSubclasses(data);
|
|
170
|
+
assertBoundedPropertyShapes(shapes);
|
|
171
|
+
const targets = countShapeTargets(data, shapes);
|
|
172
|
+
if (!targets)
|
|
173
|
+
throw new Error('No targets found for SHACL; validation would have no focus nodes');
|
|
174
|
+
const validator = new SHACLValidator(shapes, { maxErrors });
|
|
175
|
+
// rdf-validate-shacl 0.6.5 counts UTF-16 units. SHACL and JSON Schema
|
|
176
|
+
// count Unicode codepoints; correct only this trusted built-in component.
|
|
177
|
+
validator.validators.set(validator.ns.sh.MaxLengthConstraintComponent, {
|
|
178
|
+
validate(context, _focusNode, valueNode, constraint) {
|
|
179
|
+
if (valueNode.termType === 'BlankNode')
|
|
180
|
+
return false;
|
|
181
|
+
const limit = Number(constraint.getParameterValue(context.ns.sh.maxLength).value);
|
|
182
|
+
let count = 0;
|
|
183
|
+
for (const _character of valueNode.value)
|
|
184
|
+
if (++count > limit)
|
|
185
|
+
return false;
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
validationMessage: 'Value has more than {$maxLength} characters',
|
|
189
|
+
});
|
|
190
|
+
// Components bind their registry callbacks at construction, so rebuild the
|
|
191
|
+
// typed library graph after installing the correction, before any validation.
|
|
192
|
+
validator.shapesGraph = new ShapesGraph(validator);
|
|
193
|
+
const report = await validator.validate(data);
|
|
194
|
+
return report.results.map(result => ({ engine: 'SHACL', resourceId: result.focusNode.value, path: result.path?.value ?? '',
|
|
195
|
+
severity: result.severity.value === SH + 'Warning' ? 'Warning' : result.severity.value === SH + 'Info' ? 'Info' : 'Violation',
|
|
196
|
+
message: result.message.map(term => term.value).join('; ') || result.sourceConstraintComponent.value }));
|
|
197
|
+
}
|
|
198
|
+
export function documentOf(resources, source, profile = DEFAULT_PROFILE) {
|
|
199
|
+
return parseProfileDocument({ profile: profile.id, source, completeness: 'partial', resources }, profile);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type SemanticDataset } from './types.js';
|
|
2
|
+
import { type ResourceIdentityLink } from './resolver.js';
|
|
3
|
+
export interface WorkspaceQuery {
|
|
4
|
+
id: string;
|
|
5
|
+
endpoint: string;
|
|
6
|
+
kind: 'json' | 'select' | 'construct';
|
|
7
|
+
query?: string;
|
|
8
|
+
mapping?: Record<string, string>;
|
|
9
|
+
profileId?: string;
|
|
10
|
+
resolverStrategy?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RevisionLink {
|
|
13
|
+
revision: string;
|
|
14
|
+
modelLabel: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SemanticWorkspace {
|
|
17
|
+
version: 1;
|
|
18
|
+
datasets: SemanticDataset[];
|
|
19
|
+
queries: WorkspaceQuery[];
|
|
20
|
+
revisions: RevisionLink[];
|
|
21
|
+
resourceLinks?: ResourceIdentityLink[];
|
|
22
|
+
}
|
|
23
|
+
export interface ImportedWorkspace {
|
|
24
|
+
workspace: SemanticWorkspace;
|
|
25
|
+
grants: readonly string[];
|
|
26
|
+
associations: ReadonlyMap<string, string>;
|
|
27
|
+
}
|
|
28
|
+
export declare function sanitizeSource(value: unknown): string;
|
|
29
|
+
/** Whitelist the portable contract: credentials, grants and loaded model ids never cross sessions. */
|
|
30
|
+
export declare function exportWorkspace(workspace: SemanticWorkspace): string;
|
|
31
|
+
export declare function importWorkspace(serialized: string): ImportedWorkspace;
|
|
32
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAA0C,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAElG,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACjF;AACD,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AACtE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACvI;AACD,MAAM,WAAW,iBAAiB;IAAG,SAAS,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAUzI,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWrD;AAoED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAIpE;AACD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAGrE"}
|