feat(provider-contract): add classified unit contact aspect

This commit is contained in:
Codex
2026-07-24 09:31:34 +03:00
parent f02a1d4125
commit eab47bc1fa
10 changed files with 501 additions and 31 deletions
@@ -140,7 +140,7 @@ const MAPPING_TARGET_KEYS = new Set(["dataProductId", "version", "ontologyRevisi
const FACT_KEYS = new Set(["sourceId", "semanticType", "observedAt", "geometry", "attributes"]);
const EXPRESSION_KEYS = new Set([
"strategy", "paths", "coerce", "prefix", "fallback", "constant", "derive",
"omitIfMissing", "omitIfInvalid", "minimum", "maximum",
"omitIfMissing", "omitIfInvalid", "minimum", "maximum", "guardPath", "guardEquals",
]);
const GEOMETRY_KEYS = new Set([
"type", "longitude", "latitude", "strategy", "paths", "allowedTypes", "omitIfInvalid",
@@ -1013,6 +1013,18 @@ function validateExpression(value, path, errors) {
if (value.derive !== undefined) requiredIdentifier(value.derive, `${path}.derive`, errors);
if (value.omitIfMissing !== undefined && typeof value.omitIfMissing !== "boolean") errors.push(`${path}.omitIfMissing_must_be_boolean`);
if (value.omitIfInvalid !== undefined && typeof value.omitIfInvalid !== "boolean") errors.push(`${path}.omitIfInvalid_must_be_boolean`);
const hasGuardPath = value.guardPath !== undefined;
const hasGuardEquals = value.guardEquals !== undefined;
if (hasGuardPath !== hasGuardEquals) errors.push(`${path}.guard_requires_path_and_equals`);
if (hasGuardPath) {
if (!isCanonicalSourcePath(value.guardPath)) {
errors.push(`${path}.guardPath_must_be_canonical_dot_path`);
}
if (!["string", "number", "boolean"].includes(typeof value.guardEquals)) {
errors.push(`${path}.guardEquals_must_be_scalar`);
}
if (value.omitIfMissing !== true) errors.push(`${path}.guard_requires_omitIfMissing`);
}
if (value.minimum !== undefined || value.maximum !== undefined) {
if (value.coerce !== "number") errors.push(`${path}.range_requires_number_coercion`);
if (value.minimum !== undefined && !Number.isFinite(value.minimum)) errors.push(`${path}.minimum_invalid`);