@_linked/core 2.15.1 → 2.16.0-next.20260816080201

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.
@@ -0,0 +1,586 @@
1
+ /*
2
+ * This Source Code Form is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+ */
6
+ /**
7
+ * SHACL-aligned validation of plain data objects against a node shape.
8
+ *
9
+ * One entry point — {@link validate} — used by the create and update pipelines
10
+ * (via `MutationQueryFactory.describe()`) and directly by callers that want to
11
+ * know how well an object fits a shape without building a mutation.
12
+ *
13
+ * **Shape of the output.** This library has no triple/Turtle layer and this
14
+ * module does not add one: a {@link ValidationReport} is plain JavaScript. It is
15
+ * however 1-1 with the SHACL vocabulary — one key per SHACL property, named
16
+ * after it, holding a value the mutation pipeline accepts (a literal, or a
17
+ * `{id}` node reference for IRI-valued properties). So a report can be
18
+ * materialized by an ordinary create query as soon as shape classes for
19
+ * `sh:ValidationReport` / `sh:ValidationResult` exist, with no transform step:
20
+ *
21
+ * ```ts
22
+ * const report = validate(Slide, data);
23
+ * await ValidationReport.create(report); // once those shape classes exist
24
+ * ```
25
+ *
26
+ * Two deliberate departures, both documented on the types: `results` is plural
27
+ * where SHACL's repeated property is `sh:result`, and `propertyPath` is a
28
+ * non-SHACL locator. Both map cleanly — a shape class chooses its own labels for
29
+ * SHACL paths, and an extension property is legal on a SHACL report.
30
+ *
31
+ * **Coverage.** Cardinality (`sh:minCount` / `sh:maxCount`), node kind (literal
32
+ * vs relation), undeclared properties (as `sh:closed`), `sh:datatype`, the four
33
+ * `sh:min/maxInclusive/Exclusive` bounds, `sh:min/maxLength`, `sh:pattern` and
34
+ * `sh:in`. Each is one entry in {@link CARDINALITY_CONSTRAINTS} or
35
+ * {@link VALUE_CONSTRAINTS}, so adding another is one function and one test.
36
+ *
37
+ * Not covered: `sh:languageIn` / `sh:uniqueLang` (skipped at serialization time
38
+ * too, so there is no metadata to check against) and `sh:hasValue`.
39
+ */
40
+ import { shacl } from '../ontologies/shacl.js';
41
+ import { xsd } from '../ontologies/xsd.js';
42
+ import { isNodeReferenceValue } from '../utils/NodeReference.js';
43
+ import { getUniquePropertyShapes } from './nodeShapeData.js';
44
+ import { getShapeClass } from '../utils/ShapeClass.js';
45
+ import { isExpressionNode } from '../expressions/ExpressionNode.js';
46
+ import { asContextRef } from '../queries/QueryContext.js';
47
+ /** Thrown by {@link assertValid} — carries the full report, not just the first violation. */
48
+ export class ShapeValidationError extends Error {
49
+ constructor(report) {
50
+ super(report.results.map((r) => r.resultMessage).join('\n'));
51
+ this.name = 'ShapeValidationError';
52
+ this.report = report;
53
+ }
54
+ }
55
+ /**
56
+ * Keys that carry metadata about the node rather than a property value: `id` /
57
+ * `__id` name it, and `shape` names the shape of a nested value when the
58
+ * property shape itself doesn't declare one (see `convertUpdateValue`).
59
+ */
60
+ const RESERVED_KEYS = new Set(['id', '__id', 'shape']);
61
+ /**
62
+ * The message for an undeclared property key. Shared with the normalization path
63
+ * in `MutationQuery`, which needs the same guard to build a field at all.
64
+ */
65
+ export function undeclaredPropertyMessage(key, shape) {
66
+ var _a;
67
+ const shapeName = shape.label || ((_a = shape.id) === null || _a === void 0 ? void 0 : _a.split('/').pop());
68
+ return (`Invalid property key: ${key}. The shape ${shapeName} does not have a registered ` +
69
+ `property with this name. Make sure the get/set method exists, and that it uses a ` +
70
+ `@objectProperty or @literalProperty decorator.`);
71
+ }
72
+ /**
73
+ * `sh:value` must be an RDF term. A literal or a node reference is one; a plain
74
+ * object, array or function is not, so it is left off rather than emitted as
75
+ * something no store could materialize — the message still names it.
76
+ */
77
+ function asTerm(value) {
78
+ if (isScalarValue(value))
79
+ return value;
80
+ if (isNodeReference(value))
81
+ return { id: value.id };
82
+ return undefined;
83
+ }
84
+ /**
85
+ * A violation about the node itself rather than one of its property shapes —
86
+ * `sh:sourceShape` is the node shape, and there is no `sh:resultPath` (an
87
+ * undeclared key has no property IRI to point at).
88
+ */
89
+ function nodeViolation(shape, ctx, component, message, propertyPath, value) {
90
+ const result = {
91
+ sourceConstraintComponent: component,
92
+ resultSeverity: shacl.Violation,
93
+ resultMessage: message,
94
+ };
95
+ if (ctx.focusNode)
96
+ result.focusNode = { id: ctx.focusNode };
97
+ if (propertyPath)
98
+ result.propertyPath = propertyPath;
99
+ const term = asTerm(value);
100
+ if (term !== undefined)
101
+ result.value = term;
102
+ if (shape.id)
103
+ result.sourceShape = { id: shape.id };
104
+ return result;
105
+ }
106
+ /**
107
+ * Build a result, omitting absent keys entirely — an `undefined` value is not a
108
+ * property the create pipeline should see.
109
+ */
110
+ function violation(ctx, component, message, value) {
111
+ const result = {
112
+ sourceConstraintComponent: component,
113
+ resultSeverity: shacl.Violation,
114
+ resultMessage: message,
115
+ };
116
+ if (ctx.focusNode)
117
+ result.focusNode = { id: ctx.focusNode };
118
+ const path = ctx.propertyShape.path;
119
+ if (path === null || path === void 0 ? void 0 : path.id)
120
+ result.resultPath = { id: path.id };
121
+ if (ctx.property)
122
+ result.propertyPath = ctx.property;
123
+ const term = asTerm(value);
124
+ if (term !== undefined)
125
+ result.value = term;
126
+ const sourceShape = ctx.propertyShape.id || ctx.shape.id;
127
+ if (sourceShape)
128
+ result.sourceShape = { id: sourceShape };
129
+ return result;
130
+ }
131
+ /** The label used in messages — the property's own label, not its nested path. */
132
+ function labelOf(ps) {
133
+ return ps.label || ps.id;
134
+ }
135
+ /** `sh:maxCount` — no more values than the shape allows. */
136
+ const maxCountCheck = (values, ctx) => {
137
+ const { maxCount } = ctx.propertyShape;
138
+ if (typeof maxCount !== 'number' || values.length <= maxCount)
139
+ return [];
140
+ return [
141
+ violation(ctx, shacl.MaxCountConstraintComponent, `Property '${labelOf(ctx.propertyShape)}' allows at most ${maxCount} value(s), but ${values.length} were provided.`),
142
+ ];
143
+ };
144
+ /** `sh:minCount` — at least as many values as the shape requires. */
145
+ const minCountCheck = (values, ctx) => {
146
+ const { minCount } = ctx.propertyShape;
147
+ if (typeof minCount !== 'number' || minCount <= 0 || values.length >= minCount)
148
+ return [];
149
+ return [
150
+ violation(ctx, shacl.MinCountConstraintComponent, `Property '${labelOf(ctx.propertyShape)}' requires at least ${minCount} value(s), but ${values.length} were provided.`),
151
+ ];
152
+ };
153
+ /** True when the property clearly accepts only literal values. */
154
+ function expectsLiteral(ps) {
155
+ if (ps.nodeKind)
156
+ return ps.nodeKind.id === shacl.Literal.id;
157
+ return !!ps.datatype && !ps.valueShape;
158
+ }
159
+ /** True when the property clearly accepts only nodes (IRIs/blank nodes). */
160
+ function expectsNode(ps) {
161
+ if (ps.nodeKind) {
162
+ return (ps.nodeKind.id === shacl.IRI.id ||
163
+ ps.nodeKind.id === shacl.BlankNode.id ||
164
+ ps.nodeKind.id === shacl.BlankNodeOrIRI.id);
165
+ }
166
+ return !!ps.valueShape;
167
+ }
168
+ function isScalarValue(value) {
169
+ return (typeof value === 'string' ||
170
+ typeof value === 'number' ||
171
+ typeof value === 'boolean' ||
172
+ value instanceof Date);
173
+ }
174
+ /**
175
+ * `sh:nodeKind` — literal properties reject nodes/objects, relation properties
176
+ * reject bare scalars. Ambiguous kinds (`sh:IRIOrLiteral`, or no `nodeKind` and
177
+ * no `datatype`/`valueShape` to infer from) are not enforced.
178
+ */
179
+ const nodeKindCheck = (values, ctx) => {
180
+ const ps = ctx.propertyShape;
181
+ const literalExpected = expectsLiteral(ps);
182
+ const nodeExpected = expectsNode(ps);
183
+ if (!literalExpected && !nodeExpected)
184
+ return [];
185
+ const results = [];
186
+ for (const el of values) {
187
+ if (!isCheckableElement(el))
188
+ continue;
189
+ const scalar = isScalarValue(el);
190
+ if (literalExpected && !scalar) {
191
+ results.push(violation(ctx, shacl.NodeKindConstraintComponent, `Property '${labelOf(ps)}' is a literal property but was given a ${typeof el === 'object' ? 'node/object' : typeof el} value.`, el));
192
+ }
193
+ else if (nodeExpected && scalar) {
194
+ results.push(violation(ctx, shacl.NodeKindConstraintComponent, `Property '${labelOf(ps)}' is a relation (object) property but was given a literal (${typeof el}). Provide a {id} reference or a nested object.`, el));
195
+ }
196
+ }
197
+ return results;
198
+ };
199
+ /**
200
+ * An element worth checking: a concrete value rather than something whose final
201
+ * form is decided elsewhere (an expression, a context ref, an absent value).
202
+ */
203
+ function isCheckableElement(el) {
204
+ return el !== null && el !== undefined && !isExpressionNode(el) && !asContextRef(el);
205
+ }
206
+ const XSD_BASE = xsd.string.id.slice(0, -'string'.length);
207
+ /** `xsd:integer` rather than the full IRI, when the datatype is an XSD one. */
208
+ function datatypeLabel(datatype) {
209
+ return datatype.id.startsWith(XSD_BASE)
210
+ ? `xsd:${datatype.id.slice(XSD_BASE.length)}`
211
+ : datatype.id;
212
+ }
213
+ /** How a value reads in a message — its JS kind, which is what went wrong. */
214
+ function describeValue(value) {
215
+ if (value instanceof Date)
216
+ return 'a Date';
217
+ if (Array.isArray(value))
218
+ return 'an array';
219
+ if (typeof value === 'number')
220
+ return Number.isInteger(value) ? 'a whole number' : 'a decimal number';
221
+ if (typeof value === 'object')
222
+ return 'a node/object';
223
+ return `a ${typeof value}`;
224
+ }
225
+ const isFiniteNumber = (v) => typeof v === 'number' && Number.isFinite(v);
226
+ /**
227
+ * What each XSD datatype accepts as a JavaScript value.
228
+ *
229
+ * This matters more than a normal type check: mutation literals are typed from
230
+ * the *JavaScript* type when they reach SPARQL (`irToAlgebra`), not from the
231
+ * declared datatype — a number becomes `xsd:integer`/`xsd:double`, a boolean
232
+ * `xsd:boolean`, a `Date` `xsd:dateTime`, and a string an untyped literal. So a
233
+ * string handed to an `xsd:integer` property does not merely skip a check, it
234
+ * writes the wrong RDF term. Rejecting it is a correctness fix.
235
+ *
236
+ * Temporal properties take a `Date` and nothing else — one representation for a
237
+ * point in time, rather than a JS object and a hand-written lexical string that
238
+ * behave differently. The serializer derives the right lexical form from the
239
+ * declared datatype (`irToAlgebra.dateToTerm`), so an `xsd:date` property gets
240
+ * `"2020-06-15"^^xsd:date` from the same `Date` an `xsd:dateTime` property gets
241
+ * a full timestamp from.
242
+ *
243
+ * Datatypes with no obvious JS counterpart (`xsd:duration`, `xsd:gYear`,
244
+ * `xsd:Bytes`) are not checked.
245
+ */
246
+ const DATATYPE_RULES = {
247
+ [xsd.string.id]: { accepts: (v) => typeof v === 'string', expected: 'a string' },
248
+ [xsd.boolean.id]: { accepts: (v) => typeof v === 'boolean', expected: 'a boolean' },
249
+ [xsd.integer.id]: { accepts: (v) => isFiniteNumber(v) && Number.isInteger(v), expected: 'a whole number' },
250
+ [xsd.long.id]: { accepts: (v) => isFiniteNumber(v) && Number.isInteger(v), expected: 'a whole number' },
251
+ [xsd.decimal.id]: { accepts: isFiniteNumber, expected: 'a number' },
252
+ [xsd.float.id]: { accepts: isFiniteNumber, expected: 'a number' },
253
+ [xsd.double.id]: { accepts: isFiniteNumber, expected: 'a number' },
254
+ [xsd.date.id]: { accepts: (v) => v instanceof Date, expected: 'a Date' },
255
+ [xsd.dateTime.id]: { accepts: (v) => v instanceof Date, expected: 'a Date' },
256
+ [xsd.time.id]: { accepts: (v) => v instanceof Date, expected: 'a Date' },
257
+ };
258
+ /** `sh:datatype` — the value's JavaScript type must match the declared datatype. */
259
+ const datatypeCheck = (values, ctx) => {
260
+ const ps = ctx.propertyShape;
261
+ if (!ps.datatype)
262
+ return [];
263
+ const rule = DATATYPE_RULES[ps.datatype.id];
264
+ if (!rule)
265
+ return [];
266
+ const results = [];
267
+ for (const el of values) {
268
+ // A node reference is a node-kind problem, not a datatype one — one
269
+ // violation per mistake, reported by the check that owns it.
270
+ if (!isCheckableElement(el) || isNodeReference(el) || rule.accepts(el))
271
+ continue;
272
+ results.push(violation(ctx, shacl.DatatypeConstraintComponent, `Property '${labelOf(ps)}' expects ${datatypeLabel(ps.datatype)} (${rule.expected}), but was given ${describeValue(el)}.`, el));
273
+ }
274
+ return results;
275
+ };
276
+ /** The four `sh:min/maxInclusive/Exclusive` range constraints, on numbers. */
277
+ const rangeCheck = (values, ctx) => {
278
+ const ps = ctx.propertyShape;
279
+ const bounds = [
280
+ { limit: ps.minInclusive, component: shacl.MinInclusiveConstraintComponent, ok: (v, l) => v >= l, phrase: 'at least' },
281
+ { limit: ps.maxInclusive, component: shacl.MaxInclusiveConstraintComponent, ok: (v, l) => v <= l, phrase: 'at most' },
282
+ { limit: ps.minExclusive, component: shacl.MinExclusiveConstraintComponent, ok: (v, l) => v > l, phrase: 'greater than' },
283
+ { limit: ps.maxExclusive, component: shacl.MaxExclusiveConstraintComponent, ok: (v, l) => v < l, phrase: 'less than' },
284
+ ];
285
+ const active = bounds.filter((b) => typeof b.limit === 'number');
286
+ if (!active.length)
287
+ return [];
288
+ const results = [];
289
+ for (const el of values) {
290
+ // Non-numbers are the datatype check's business.
291
+ if (!isCheckableElement(el) || typeof el !== 'number')
292
+ continue;
293
+ for (const bound of active) {
294
+ if (bound.ok(el, bound.limit))
295
+ continue;
296
+ results.push(violation(ctx, bound.component, `Property '${labelOf(ps)}' must be ${bound.phrase} ${bound.limit}, but was given ${el}.`, el));
297
+ }
298
+ }
299
+ return results;
300
+ };
301
+ /** `sh:minLength` / `sh:maxLength`, on strings. */
302
+ const lengthCheck = (values, ctx) => {
303
+ const ps = ctx.propertyShape;
304
+ if (typeof ps.minLength !== 'number' && typeof ps.maxLength !== 'number')
305
+ return [];
306
+ const results = [];
307
+ for (const el of values) {
308
+ if (!isCheckableElement(el) || typeof el !== 'string')
309
+ continue;
310
+ if (typeof ps.minLength === 'number' && el.length < ps.minLength) {
311
+ results.push(violation(ctx, shacl.MinLengthConstraintComponent, `Property '${labelOf(ps)}' must be at least ${ps.minLength} character(s), but was given ${el.length}.`, el));
312
+ }
313
+ if (typeof ps.maxLength === 'number' && el.length > ps.maxLength) {
314
+ results.push(violation(ctx, shacl.MaxLengthConstraintComponent, `Property '${labelOf(ps)}' must be at most ${ps.maxLength} character(s), but was given ${el.length}.`, el));
315
+ }
316
+ }
317
+ return results;
318
+ };
319
+ /** `sh:pattern` — the string form of the value must match the shape's regex. */
320
+ const patternCheck = (values, ctx) => {
321
+ const ps = ctx.propertyShape;
322
+ if (!ps.pattern)
323
+ return [];
324
+ // Rebuild without `g`/`y`: those carry `lastIndex` between calls, so a shared
325
+ // shape regex would match every other value.
326
+ const regex = new RegExp(ps.pattern.source, ps.pattern.flags.replace(/[gy]/g, ''));
327
+ const results = [];
328
+ for (const el of values) {
329
+ if (!isCheckableElement(el) || typeof el !== 'string')
330
+ continue;
331
+ if (regex.test(el))
332
+ continue;
333
+ results.push(violation(ctx, shacl.PatternConstraintComponent, `Property '${labelOf(ps)}' must match ${String(ps.pattern)}, but was given "${el}".`, el));
334
+ }
335
+ return results;
336
+ };
337
+ /** `sh:in` — the value must be one of the shape's allowed values. */
338
+ const inCheck = (values, ctx) => {
339
+ var _a;
340
+ const ps = ctx.propertyShape;
341
+ if (!((_a = ps.in) === null || _a === void 0 ? void 0 : _a.length))
342
+ return [];
343
+ const allowed = ps.in;
344
+ const matches = (el) => allowed.some((a) => isNodeReferenceValue(a)
345
+ ? isNodeReference(el) && el.id === a.id
346
+ : a === el);
347
+ const results = [];
348
+ for (const el of values) {
349
+ if (!isCheckableElement(el) || matches(el))
350
+ continue;
351
+ const rendered = allowed
352
+ .map((a) => (isNodeReferenceValue(a) ? a.id : JSON.stringify(a)))
353
+ .join(', ');
354
+ results.push(violation(ctx, shacl.InConstraintComponent, `Property '${labelOf(ps)}' must be one of [${rendered}].`, el));
355
+ }
356
+ return results;
357
+ };
358
+ /**
359
+ * The registry. Every property-level constraint the library enforces lives here;
360
+ * adding another SHACL component is one more entry plus its test.
361
+ *
362
+ * Split by what each kind of check needs to see. **Cardinality** needs the
363
+ * property's whole value set, so it cannot run against a set modification —
364
+ * `{add: […]}` changes a count that lives in the store. **Value** checks need
365
+ * only the value in hand, so they run everywhere a concrete value appears,
366
+ * including inside `add`.
367
+ *
368
+ * Cardinality runs first when it runs at all: a count problem explains itself
369
+ * better than the per-value violations that would follow it.
370
+ */
371
+ const CARDINALITY_CONSTRAINTS = [maxCountCheck, minCountCheck];
372
+ const VALUE_CONSTRAINTS = [
373
+ nodeKindCheck,
374
+ datatypeCheck,
375
+ rangeCheck,
376
+ lengthCheck,
377
+ patternCheck,
378
+ inCheck,
379
+ ];
380
+ const PROPERTY_CONSTRAINTS = [
381
+ ...CARDINALITY_CONSTRAINTS,
382
+ ...VALUE_CONSTRAINTS,
383
+ ];
384
+ // ---------------------------------------------------------------------------
385
+ // Value classification
386
+ // ---------------------------------------------------------------------------
387
+ /**
388
+ * A `{add, remove}` set modification. The resulting value count depends on the
389
+ * node's current state, so cardinality and kind are unknowable here.
390
+ */
391
+ function isSetModification(value) {
392
+ if (typeof value !== 'object' || value === null)
393
+ return false;
394
+ const obj = value;
395
+ const expected = (obj.add ? 1 : 0) + (obj.remove ? 1 : 0);
396
+ return expected > 0 && Object.getOwnPropertyNames(obj).length === expected;
397
+ }
398
+ /** An object carrying only an `id` — a reference to an existing node, not a description. */
399
+ function isNodeReference(value) {
400
+ return (typeof value === 'object' &&
401
+ value !== null &&
402
+ 'id' in value &&
403
+ Object.keys(value).length === 1);
404
+ }
405
+ /**
406
+ * A value that stands for something resolved later — an expression, a query
407
+ * context reference, a callback, or nothing at all.
408
+ *
409
+ * Must be ruled out *before* anything reads properties off the value: a resolved
410
+ * context ref is a query proxy that throws on any undecorated key, so probing it
411
+ * for `.add` is not a safe way to ask what it is.
412
+ */
413
+ function isDeferredValue(value) {
414
+ return (value === undefined ||
415
+ typeof value === 'function' ||
416
+ isExpressionNode(value) ||
417
+ !!asContextRef(value));
418
+ }
419
+ /** Values whose final shape isn't knowable without the store or a lowering pass. */
420
+ function isOpaqueValue(value) {
421
+ return isDeferredValue(value) || isSetModification(value);
422
+ }
423
+ /** A nested node description — an object to descend into, rather than a leaf value. */
424
+ function isNodeDescription(value) {
425
+ return (typeof value === 'object' &&
426
+ value !== null &&
427
+ !Array.isArray(value) &&
428
+ !(value instanceof Date) &&
429
+ !isNodeReference(value) &&
430
+ !isOpaqueValue(value));
431
+ }
432
+ function resolveShapeData(shape) {
433
+ const resolved = 'propertyShapes' in shape ? shape : shape.shape;
434
+ if (!resolved) {
435
+ throw new Error('validate() requires a node shape or a shape class with a static `shape`. ' +
436
+ 'Did you pass an unregistered class (missing @linkedShape)?');
437
+ }
438
+ return resolved;
439
+ }
440
+ /**
441
+ * Validate a plain data object against a node shape.
442
+ *
443
+ * Never throws for invalid *data* — a violation is a result, not an exception.
444
+ * (It does throw when the *shape* argument itself is unusable.)
445
+ *
446
+ * ```ts
447
+ * const report = validate(Person, {name: ['a', 'b']});
448
+ * report.conforms; // false
449
+ * report.results[0].sourceConstraintComponent.id; // …shacl#MaxCountConstraintComponent
450
+ * ```
451
+ */
452
+ export function validate(shape, data, options = {}) {
453
+ const { mode = 'complete', maxDepth = 10 } = options;
454
+ const results = validateNode(resolveShapeData(shape), data, {
455
+ mode,
456
+ maxDepth,
457
+ depth: 0,
458
+ prefix: '',
459
+ });
460
+ return {
461
+ conforms: !results.some((r) => r.resultSeverity.id === shacl.Violation.id),
462
+ results,
463
+ };
464
+ }
465
+ /** {@link validate}, but throws a {@link ShapeValidationError} when the data doesn't conform. */
466
+ export function assertValid(shape, data, options = {}) {
467
+ const report = validate(shape, data, options);
468
+ if (!report.conforms)
469
+ throw new ShapeValidationError(report);
470
+ }
471
+ function validateNode(shape, data, ctx) {
472
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
473
+ return [
474
+ nodeViolation(shape, ctx, shacl.NodeConstraintComponent, `Expected an object describing '${shape.label || shape.id}', but got ${data === null ? 'null' : typeof data}.`, ctx.prefix, data),
475
+ ];
476
+ }
477
+ const obj = data;
478
+ const propertyShapes = getUniquePropertyShapes(shape);
479
+ const byLabel = new Map(propertyShapes.map((ps) => [ps.label, ps]));
480
+ const focusNode = typeof obj.__id === 'string'
481
+ ? obj.__id
482
+ : typeof obj.id === 'string'
483
+ ? obj.id
484
+ : ctx.focusNode;
485
+ const results = [];
486
+ // Presence of required properties — only decidable for a complete description.
487
+ if (ctx.mode === 'complete') {
488
+ for (const ps of propertyShapes) {
489
+ if (typeof ps.minCount !== 'number' || ps.minCount <= 0)
490
+ continue;
491
+ if (ps.label in obj)
492
+ continue;
493
+ results.push(violation({ shape, propertyShape: ps, property: join(ctx.prefix, ps.label), focusNode, mode: ctx.mode }, shacl.MinCountConstraintComponent, `Property '${labelOf(ps)}' requires at least ${ps.minCount} value(s), but none were provided.`));
494
+ }
495
+ }
496
+ // The values actually provided.
497
+ for (const [key, value] of Object.entries(obj)) {
498
+ if (RESERVED_KEYS.has(key))
499
+ continue;
500
+ const propertyShape = byLabel.get(key);
501
+ if (!propertyShape) {
502
+ results.push(nodeViolation(shape, Object.assign(Object.assign({}, ctx), { focusNode }), shacl.ClosedConstraintComponent, undeclaredPropertyMessage(key, shape), join(ctx.prefix, key), value));
503
+ continue;
504
+ }
505
+ results.push(...validateProperty(value, {
506
+ shape,
507
+ propertyShape,
508
+ property: join(ctx.prefix, key),
509
+ focusNode,
510
+ mode: ctx.mode,
511
+ }, ctx));
512
+ }
513
+ return results;
514
+ }
515
+ function validateProperty(value, propCtx, walk) {
516
+ const ps = propCtx.propertyShape;
517
+ // `null` clears the property — the same as providing zero values, so clearing
518
+ // a required one is a cardinality violation (both spellings behave alike).
519
+ if (value === null) {
520
+ if (typeof ps.minCount === 'number' && ps.minCount > 0) {
521
+ return [
522
+ violation(propCtx, shacl.MinCountConstraintComponent, `Property '${labelOf(ps)}' requires at least ${ps.minCount} value(s) and cannot be cleared.`),
523
+ ];
524
+ }
525
+ return [];
526
+ }
527
+ // Ruled out first: reading `.add` off a resolved context proxy would throw.
528
+ if (isDeferredValue(value))
529
+ return [];
530
+ // A set modification adds to and removes from what the store already holds,
531
+ // so the resulting *count* is unknowable here — but each added value is as
532
+ // checkable as any other, and skipping them let mistyped literals through the
533
+ // one door the rest of this module closes. `remove` takes `{id}` references
534
+ // only, which normalization enforces on its own.
535
+ if (isSetModification(value)) {
536
+ const { add } = value;
537
+ if (add === undefined)
538
+ return [];
539
+ return runChecks(VALUE_CONSTRAINTS, toValues(add), propCtx, walk);
540
+ }
541
+ return runChecks(PROPERTY_CONSTRAINTS, toValues(value), propCtx, walk);
542
+ }
543
+ /** A property's value(s) as an array — a single value becomes a one-element one. */
544
+ function toValues(value) {
545
+ return Array.isArray(value) ? value : [value];
546
+ }
547
+ /**
548
+ * Run a set of constraint checks over a property's values, then descend into any
549
+ * nested node descriptions among them (`sh:node`-style recursion). A bare `{id}`
550
+ * is a reference to an existing node and has nothing to validate; an object with
551
+ * an id *and* data is a nested create with a predefined id.
552
+ */
553
+ function runChecks(checks, values, propCtx, walk) {
554
+ const results = [];
555
+ for (const check of checks) {
556
+ results.push(...check(values, propCtx));
557
+ }
558
+ if (walk.depth < walk.maxDepth) {
559
+ for (const el of values) {
560
+ if (!isNodeDescription(el))
561
+ continue;
562
+ const nestedShape = resolveValueShape(propCtx.propertyShape, el);
563
+ if (!nestedShape)
564
+ continue;
565
+ results.push(...validateNode(nestedShape, el, Object.assign(Object.assign({}, walk), { depth: walk.depth + 1, prefix: propCtx.property, focusNode: undefined })));
566
+ }
567
+ }
568
+ return results;
569
+ }
570
+ /**
571
+ * The shape a nested value should be validated against: the property's declared
572
+ * `valueShape`, or — for properties that declare none — the shape class carried
573
+ * in the value's reserved `shape` key. Mirrors `convertUpdateValue`; returns
574
+ * undefined when neither is available (normalization reports that itself).
575
+ */
576
+ function resolveValueShape(ps, value) {
577
+ var _a;
578
+ if (ps.valueShape)
579
+ return (_a = getShapeClass(ps.valueShape)) === null || _a === void 0 ? void 0 : _a.shape;
580
+ const declared = value.shape;
581
+ return declared === null || declared === void 0 ? void 0 : declared.shape;
582
+ }
583
+ function join(prefix, label) {
584
+ return prefix ? `${prefix}.${label}` : label;
585
+ }
586
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/shapes/validation.ts"],"names":[],"mappings":"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"}