@sakibcoolz/core 0.1.1 → 0.2.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 (142) hide show
  1. package/README.md +67 -7
  2. package/dist/acquisition.d.ts +29 -0
  3. package/dist/acquisition.d.ts.map +1 -0
  4. package/dist/acquisition.js +30 -0
  5. package/dist/acquisition.js.map +1 -0
  6. package/dist/assembly.d.ts +5 -2
  7. package/dist/assembly.d.ts.map +1 -1
  8. package/dist/assembly.js +7 -4
  9. package/dist/assembly.js.map +1 -1
  10. package/dist/attach.d.ts +4 -2
  11. package/dist/attach.d.ts.map +1 -1
  12. package/dist/attach.js +5 -3
  13. package/dist/attach.js.map +1 -1
  14. package/dist/clipboard.d.ts +6 -4
  15. package/dist/clipboard.d.ts.map +1 -1
  16. package/dist/clipboard.js +25 -4
  17. package/dist/clipboard.js.map +1 -1
  18. package/dist/collision.d.ts +2 -2
  19. package/dist/collision.js.map +1 -1
  20. package/dist/digest.d.ts +9 -0
  21. package/dist/digest.d.ts.map +1 -0
  22. package/dist/digest.js +68 -0
  23. package/dist/digest.js.map +1 -0
  24. package/dist/flow.d.ts +3 -2
  25. package/dist/flow.d.ts.map +1 -1
  26. package/dist/flow.js.map +1 -1
  27. package/dist/graph.d.ts +67 -7
  28. package/dist/graph.d.ts.map +1 -1
  29. package/dist/graph.js +195 -10
  30. package/dist/graph.js.map +1 -1
  31. package/dist/index.d.ts +13 -6
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +7 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/observation.d.ts +1 -1
  36. package/dist/observation.d.ts.map +1 -1
  37. package/dist/observation.js +4 -1
  38. package/dist/observation.js.map +1 -1
  39. package/dist/routing.d.ts +6 -3
  40. package/dist/routing.d.ts.map +1 -1
  41. package/dist/routing.js +12 -2
  42. package/dist/routing.js.map +1 -1
  43. package/dist/scene.d.ts +245 -5
  44. package/dist/scene.d.ts.map +1 -1
  45. package/dist/scene.js +94 -3
  46. package/dist/scene.js.map +1 -1
  47. package/dist/serialization.d.ts +7 -7
  48. package/dist/serialization.d.ts.map +1 -1
  49. package/dist/serialization.js +120 -8
  50. package/dist/serialization.js.map +1 -1
  51. package/dist/snapping.d.ts +2 -2
  52. package/dist/snapping.d.ts.map +1 -1
  53. package/dist/snapping.js +10 -7
  54. package/dist/snapping.js.map +1 -1
  55. package/dist/status.d.ts +56 -0
  56. package/dist/status.d.ts.map +1 -0
  57. package/dist/status.js +114 -0
  58. package/dist/status.js.map +1 -0
  59. package/dist/tags.d.ts +52 -0
  60. package/dist/tags.d.ts.map +1 -0
  61. package/dist/tags.js +103 -0
  62. package/dist/tags.js.map +1 -0
  63. package/dist/telemetry.d.ts +42 -4
  64. package/dist/telemetry.d.ts.map +1 -1
  65. package/dist/telemetry.js +84 -8
  66. package/dist/telemetry.js.map +1 -1
  67. package/dist/touching.d.ts +2 -2
  68. package/dist/touching.d.ts.map +1 -1
  69. package/dist/touching.js +7 -4
  70. package/dist/touching.js.map +1 -1
  71. package/dist/units.js +1 -1
  72. package/dist/units.js.map +1 -1
  73. package/dist/upgrade.d.ts +2 -2
  74. package/dist/upgrade.js.map +1 -1
  75. package/dist/validation.d.ts +33 -6
  76. package/dist/validation.d.ts.map +1 -1
  77. package/dist/validation.js +806 -39
  78. package/dist/validation.js.map +1 -1
  79. package/package.json +4 -2
  80. package/schema/fixtures/invalid/association-without-relationship.scene.json +69 -0
  81. package/schema/fixtures/invalid/binding-kind.scene.json +14 -0
  82. package/schema/fixtures/invalid/command-zero-step.scene.json +105 -0
  83. package/schema/fixtures/invalid/empty-name.scene.json +30 -0
  84. package/schema/fixtures/invalid/expected.json +70 -0
  85. package/schema/fixtures/invalid/extension-not-namespaced.scene.json +10 -0
  86. package/schema/fixtures/invalid/extension-prototype-key.scene.json +12 -0
  87. package/schema/fixtures/invalid/missing-document-type.scene.json +6 -0
  88. package/schema/fixtures/invalid/non-string-label.scene.json +32 -0
  89. package/schema/fixtures/invalid/underlay-opacity.scene.json +17 -0
  90. package/schema/fixtures/invalid/unknown-component-kind.scene.json +29 -0
  91. package/schema/fixtures/invalid/unknown-relationship.scene.json +63 -0
  92. package/schema/fixtures/invalid/unknown-root-field.scene.json +8 -0
  93. package/schema/fixtures/invalid/unsupported-version.scene.json +7 -0
  94. package/schema/fixtures/invalid/view-rotation.scene.json +139 -0
  95. package/schema/fixtures/invalid/writable-string.scene.json +93 -0
  96. package/schema/fixtures/invalid/writable-without-limits.scene.json +100 -0
  97. package/schema/fixtures/invalid/zero-scale.scene.json +29 -0
  98. package/schema/fixtures/migration/README.md +18 -0
  99. package/schema/fixtures/migration/v1-demo.scene.json +160 -0
  100. package/schema/fixtures/migration/v1-demo.v4.json +198 -0
  101. package/schema/fixtures/migration/v2-demo.scene.json +244 -0
  102. package/schema/fixtures/migration/v2-demo.v4.json +245 -0
  103. package/schema/fixtures/migration/v2-generated-12.scene.json +473 -0
  104. package/schema/fixtures/migration/v2-generated-12.v4.json +474 -0
  105. package/schema/fixtures/migration/v3-demo.scene.json +244 -0
  106. package/schema/fixtures/migration/v3-demo.v4.json +245 -0
  107. package/schema/fixtures/migration/v3-generated-12.scene.json +473 -0
  108. package/schema/fixtures/migration/v3-generated-12.v4.json +474 -0
  109. package/schema/fixtures/migration/v3-mostly-connected-plant.scene.json +386 -0
  110. package/schema/fixtures/migration/v3-mostly-connected-plant.v4.json +387 -0
  111. package/schema/fixtures/migration/v3-open-joints-plant.scene.json +288 -0
  112. package/schema/fixtures/migration/v3-open-joints-plant.v4.json +289 -0
  113. package/schema/fixtures/migration/v3-unconnected-plant.scene.json +14 -0
  114. package/schema/fixtures/migration/v3-unconnected-plant.v4.json +276 -0
  115. package/schema/fixtures/projection/acquisition.plan.json +50 -0
  116. package/schema/fixtures/projection/control-line.plan.json +86 -0
  117. package/schema/fixtures/valid/acquisition.scene.json +117 -0
  118. package/schema/fixtures/valid/associations.scene.json +79 -0
  119. package/schema/fixtures/valid/commands.scene.json +155 -0
  120. package/schema/fixtures/valid/control-line.scene.json +210 -0
  121. package/schema/fixtures/valid/empty.scene.json +7 -0
  122. package/schema/fixtures/valid/identity-and-extensions.scene.json +96 -0
  123. package/schema/fixtures/valid/tank-valve-line.scene.json +89 -0
  124. package/schema/fixtures/valid/views.scene.json +139 -0
  125. package/schema/fixtures/validator-only/association-id-reuses-connection.scene.json +70 -0
  126. package/schema/fixtures/validator-only/association-unknown-component.scene.json +70 -0
  127. package/schema/fixtures/validator-only/command-max-below-min.scene.json +104 -0
  128. package/schema/fixtures/validator-only/command-out-of-type-range.scene.json +97 -0
  129. package/schema/fixtures/validator-only/connection-domain-mismatch.scene.json +63 -0
  130. package/schema/fixtures/validator-only/credential-in-connection.scene.json +66 -0
  131. package/schema/fixtures/validator-only/credential-in-extension.scene.json +14 -0
  132. package/schema/fixtures/validator-only/credential-label.scene.json +32 -0
  133. package/schema/fixtures/validator-only/duplicate-component-id.scene.json +50 -0
  134. package/schema/fixtures/validator-only/endpoint-with-credentials.scene.json +74 -0
  135. package/schema/fixtures/validator-only/expected.json +66 -0
  136. package/schema/fixtures/validator-only/modbus-coil-float.scene.json +100 -0
  137. package/schema/fixtures/validator-only/non-unit-rotation.scene.json +29 -0
  138. package/schema/fixtures/validator-only/unknown-data-source.scene.json +100 -0
  139. package/schema/fixtures/validator-only/unknown-port.scene.json +62 -0
  140. package/schema/fixtures/validator-only/unregistered-host-type.scene.json +29 -0
  141. package/schema/fixtures/validator-only/view-unknown-component.scene.json +143 -0
  142. package/schema/industrial-scene.v4.schema.json +365 -0
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n componentKinds,\n portsCompatible,\n type ComponentInstance,\n type ComponentKind,\n type ConnectionPort,\n type Quantity,\n type SceneUnderlay,\n type QuaternionLike,\n type QuaternionTuple,\n type Vector3Like,\n type ScadaScene,\n type TagBinding,\n type SceneConnection,\n type Vector3Tuple,\n} from './scene.js';\nimport { quaternionFromEuler } from './quaternion.js';\nimport { isKnownUnit } from './units.js';\nimport { tupleToQuaternion, tupleToVector } from './vectors.js';\n\nexport type SceneValidationErrorCode =\n | 'NOT_AN_OBJECT'\n | 'UNSUPPORTED_VERSION'\n | 'INVALID_FIELD'\n | 'UNKNOWN_FIELD'\n | 'LIMIT_EXCEEDED'\n | 'UNKNOWN_COMPONENT_KIND'\n | 'DUPLICATE_COMPONENT_ID'\n | 'DUPLICATE_CONNECTION_ID'\n | 'UNKNOWN_INSTANCE'\n | 'UNKNOWN_PORT'\n | 'SELF_CONNECTION'\n | 'INCOMPATIBLE_PORTS'\n | 'PORT_OCCUPIED'\n | 'DUPLICATE_EDGE'\n | 'UNSUPPORTED_SCALE'\n | 'INVALID_JSON'\n | 'UNKNOWN_CONNECTION'\n | 'UNBINDABLE_PROPERTY'\n | 'INVALID_UNIT'\n | 'DUPLICATE_BINDING_ID'\n | 'DUPLICATE_BINDING_TARGET'\n | 'INVALID_PROPERTY'\n | 'UNKNOWN_PARENT'\n | 'PARENT_CYCLE'\n | 'INVALID_UNDERLAY';\n\nexport interface SceneValidationError {\n code: SceneValidationErrorCode;\n /** Location in the input, e.g. `connections[2].to.instanceId`. */\n path: string;\n message: string;\n}\n\nexport type SceneValidationResult =\n /** `migratedFrom` is set when the input was an older schema version that was upgraded. */\n | { ok: true; scene: ScadaScene; migratedFrom?: 1 | 2 }\n | { ok: false; errors: SceneValidationError[] };\n\nexport interface SceneLimits {\n maxComponents: number;\n maxConnections: number;\n maxBindings: number;\n maxIdLength: number;\n maxProperties: number;\n maxStringLength: number;\n /** UTF-8 bytes of `underlay.svg`. */\n maxUnderlayBytes: number;\n}\n\nexport const defaultSceneLimits: Readonly<SceneLimits> = {\n maxComponents: 10_000,\n maxConnections: 20_000,\n maxBindings: 20_000,\n maxIdLength: 128,\n maxProperties: 64,\n maxStringLength: 1024,\n maxUnderlayBytes: 512 * 1024,\n};\n\nexport interface SceneValidationOptions {\n /**\n * Declared ports for a component type. Core does not import the catalog, so the caller supplies it.\n * `properties` lets parametric types (e.g. pipe length) return per-instance ports.\n */\n resolvePorts: (type: ComponentKind, properties?: ComponentInstance['properties']) => readonly ConnectionPort[] | undefined;\n /**\n * Bindable properties and their quantities for a component type. When omitted, property bindings\n * are only checked for an existing component, and their units are not checked.\n */\n resolveBindable?: (type: ComponentKind) => Readonly<Record<string, Quantity>> | undefined;\n /**\n * Checks authored property values (e.g. pipe length range). Each problem becomes an\n * INVALID_PROPERTY error at `components[i].properties.<property>`. Optional.\n */\n validateProperties?: (type: ComponentKind, properties: ComponentInstance['properties']) => readonly { property: string; message: string }[];\n limits?: Partial<SceneLimits>;\n /**\n * Checks the content of `underlay.svg` (e.g. `sanitizeSvg` from @sakibcoolz/asset-import) and returns a\n * reason to reject it, or undefined. Core checks only structure and size. Optional.\n */\n validateUnderlay?: (svg: string) => string | undefined;\n}\n\ntype Errors = SceneValidationError[];\ntype Json = Record<string, unknown>;\n\ntype SchemaVersion = 1 | 2 | 3;\nconst sceneKeys: Record<SchemaVersion, string[]> = {\n 1: ['version', 'components', 'connections'],\n 2: ['schemaVersion', 'units', 'components', 'connections', 'tagBindings'],\n 3: ['schemaVersion', 'units', 'components', 'connections', 'tagBindings', 'underlay'],\n};\nconst underlayKeys = ['svg', 'position', 'width', 'rotation', 'opacity'];\nconst componentKeys: Record<SchemaVersion, string[]> = {\n 1: ['id', 'kind', 'position', 'rotation', 'properties'],\n 2: ['id', 'type', 'position', 'rotation', 'scale', 'properties'],\n 3: ['id', 'type', 'parentId', 'position', 'rotation', 'scale', 'properties'],\n};\n/** Accepted deviation of a rotation quaternion's length from 1; larger values are rejected, never renormalised. */\nconst UNIT_TOLERANCE = 1e-6;\nconst connectionKeys = ['id', 'from', 'to'];\nconst bindingKeys = {\n property: ['id', 'tagId', 'kind', 'instanceId', 'property', 'unit'],\n flow: ['id', 'tagId', 'kind', 'connectionId', 'unit'],\n};\nconst endpointKeys = ['instanceId', 'portId'];\n\n/** Describes any input value for an error message without throwing (JSON.stringify throws on BigInt). */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value.length > 64 ? `${value.slice(0, 64)}…` : value);\n if (typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined) return String(value);\n return `a ${Array.isArray(value) ? 'array' : typeof value}`;\n}\n\nfunction isObject(value: unknown): value is Json {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction checkKeys(value: Json, allowed: string[], path: string, errors: Errors): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) {\n errors.push({ code: 'UNKNOWN_FIELD', path: path ? `${path}.${key}` : key, message: `Unknown field \"${key}\".` });\n }\n }\n}\n\nfunction readId(value: unknown, path: string, limits: SceneLimits, errors: Errors): string | undefined {\n if (typeof value !== 'string' || value.length === 0) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a non-empty string id.' });\n return undefined;\n }\n if (value.length > limits.maxIdLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `Id is longer than ${limits.maxIdLength} characters.` });\n return undefined;\n }\n return value;\n}\n\n/**\n * True for a dense array of exactly `length` finite numbers. Checks every index: `every` would\n * skip holes in sparse arrays such as `[0, , 0]`.\n */\nfunction isFiniteTuple(value: unknown, length: number): value is number[] {\n if (!Array.isArray(value) || value.length !== length) return false;\n for (let i = 0; i < length; i++) {\n const n: unknown = value[i];\n if (typeof n !== 'number' || !Number.isFinite(n)) return false;\n }\n return true;\n}\n\n/** -0 and 0 are the same physical value, but JSON writes both as 0; normalise so accepted scenes round-trip exactly. */\nconst plusZero = (n: number) => (n === 0 ? 0 : n);\n\nfunction readVector(value: unknown, path: string, errors: Errors): Vector3Tuple | undefined {\n if (!isFiniteTuple(value, 3)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected three finite numbers.' });\n return undefined;\n }\n return [plusZero(value[0]), plusZero(value[1]), plusZero(value[2])];\n}\n\nfunction readQuaternion(value: unknown, path: string, errors: Errors): QuaternionTuple | undefined {\n // Written as \"not within tolerance\" so a NaN length can never pass.\n if (!isFiniteTuple(value, 4) || !(Math.abs(Math.hypot(...value) - 1) <= UNIT_TOLERANCE)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a unit quaternion [x, y, z, w].' });\n return undefined;\n }\n return [plusZero(value[0]), plusZero(value[1]), plusZero(value[2]), plusZero(value[3])];\n}\n\nfunction readScale(value: unknown, path: string, errors: Errors): Vector3Tuple | undefined {\n if (!isFiniteTuple(value, 3) || !value.every((n) => n > 0)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected three positive finite numbers.' });\n return undefined;\n }\n return [value[0], value[1], value[2]];\n}\n\n/**\n * Reads a named-axis object (version 3) such as { x, y, z }. Extra keys are UNKNOWN_FIELD; a\n * missing, non-number or non-finite axis (or a non-positive one when `positive`) is INVALID_FIELD.\n */\nfunction readAxes(value: unknown, axes: readonly string[], path: string, errors: Errors, positive = false): number[] | undefined {\n const expected = `Expected an object with finite${positive ? ' positive' : ''} ${axes.join(', ')}.`;\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: expected });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, [...axes], path, errors);\n const numbers: number[] = [];\n for (const axis of axes) {\n const n: unknown = value[axis];\n if (typeof n !== 'number' || !Number.isFinite(n) || (positive && !(n > 0))) {\n errors.push({ code: 'INVALID_FIELD', path, message: expected });\n return undefined;\n }\n numbers.push(plusZero(n));\n }\n return errors.length > before ? undefined : numbers;\n}\n\nfunction readVectorObject(value: unknown, path: string, errors: Errors, positive = false): Vector3Like | undefined {\n const axes = readAxes(value, ['x', 'y', 'z'], path, errors, positive);\n return axes && tupleToVector(axes);\n}\n\nfunction readQuaternionObject(value: unknown, path: string, errors: Errors): QuaternionLike | undefined {\n const axes = readAxes(value, ['x', 'y', 'z', 'w'], path, errors);\n if (!axes) return undefined;\n if (!(Math.abs(Math.hypot(...axes) - 1) <= UNIT_TOLERANCE)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a unit quaternion { x, y, z, w }.' });\n return undefined;\n }\n return tupleToQuaternion(axes);\n}\n\nfunction readProperties(\n value: unknown,\n path: string,\n limits: SceneLimits,\n errors: Errors,\n): ComponentInstance['properties'] | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an object of properties.' });\n return undefined;\n }\n const entries = Object.entries(value);\n if (entries.length > limits.maxProperties) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `More than ${limits.maxProperties} properties.` });\n return undefined;\n }\n const properties: ComponentInstance['properties'] = {};\n let valid = true;\n for (const [key, v] of entries) {\n const propertyPath = `${path}.${key}`;\n if (typeof v === 'string') {\n if (v.length > limits.maxStringLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path: propertyPath, message: `String longer than ${limits.maxStringLength} characters.` });\n valid = false;\n continue;\n }\n } else if (typeof v !== 'boolean' && !(typeof v === 'number' && Number.isFinite(v))) {\n errors.push({ code: 'INVALID_FIELD', path: propertyPath, message: 'Expected a string, boolean or finite number.' });\n valid = false;\n continue;\n }\n // defineProperty keeps keys such as \"__proto__\" as plain data instead of touching the prototype.\n Object.defineProperty(properties, key, { value: typeof v === 'number' ? plusZero(v) : v, enumerable: true, writable: true, configurable: true });\n }\n return valid ? properties : undefined;\n}\n\n/**\n * Reads one component in the input's own schema version and returns it in the current model.\n * Version 3 uses named { x, y, z } / { x, y, z, w } objects. Version 2 uses arrays. Version 1 uses\n * `kind` and Euler XYZ radians and has no scale. Older versions migrate to the version 3 objects.\n */\nfunction readComponent(\n value: unknown,\n path: string,\n version: SchemaVersion,\n limits: SceneLimits,\n errors: Errors,\n): ComponentInstance | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a component object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, componentKeys[version], path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const typeField = version === 1 ? 'kind' : 'type';\n const type = value[typeField];\n if (!componentKinds.includes(type as ComponentKind)) {\n errors.push({ code: 'UNKNOWN_COMPONENT_KIND', path: `${path}.${typeField}`, message: `Unknown component type ${describe(type)}.` });\n }\n let position: Vector3Like | undefined;\n let rotation: QuaternionLike | undefined;\n let scale: Vector3Like | undefined;\n const parentId = version === 3 && value.parentId !== undefined ? readId(value.parentId, `${path}.parentId`, limits, errors) : undefined;\n if (version === 3) {\n position = readVectorObject(value.position, `${path}.position`, errors);\n rotation = readQuaternionObject(value.rotation, `${path}.rotation`, errors);\n scale = readVectorObject(value.scale, `${path}.scale`, errors, true);\n } else {\n const p = readVector(value.position, `${path}.position`, errors);\n position = p && tupleToVector(p);\n if (version === 1) {\n const euler = readVector(value.rotation, `${path}.rotation`, errors);\n rotation = euler && tupleToQuaternion(quaternionFromEuler(euler));\n scale = { x: 1, y: 1, z: 1 };\n } else {\n const q = readQuaternion(value.rotation, `${path}.rotation`, errors);\n rotation = q && tupleToQuaternion(q);\n const sc = readScale(value.scale, `${path}.scale`, errors);\n scale = sc && tupleToVector(sc);\n }\n }\n const properties = readProperties(value.properties, `${path}.properties`, limits, errors);\n if (errors.length > before || !id || !position || !rotation || !scale || !properties) return undefined;\n return { id, type: type as ComponentKind, ...(parentId ? { parentId } : {}), position, rotation, scale, properties };\n}\n\nfunction readEndpoint(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneConnection['from'] | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an endpoint object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, endpointKeys, path, errors);\n const instanceId = readId(value.instanceId, `${path}.instanceId`, limits, errors);\n const portId = readId(value.portId, `${path}.portId`, limits, errors);\n if (errors.length > before || !instanceId || !portId) return undefined;\n return { instanceId, portId };\n}\n\nfunction readConnection(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneConnection | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a connection object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, connectionKeys, path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const from = readEndpoint(value.from, `${path}.from`, limits, errors);\n const to = readEndpoint(value.to, `${path}.to`, limits, errors);\n if (errors.length > before || !id || !from || !to) return undefined;\n return { id, from, to };\n}\n\nfunction readBinding(value: unknown, path: string, limits: SceneLimits, errors: Errors): TagBinding | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a binding object.' });\n return undefined;\n }\n const before = errors.length;\n const kind = value.kind;\n if (kind !== 'property' && kind !== 'flow') {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.kind`, message: 'Expected kind \"property\" or \"flow\".' });\n return undefined;\n }\n checkKeys(value, bindingKeys[kind], path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const tagId = readId(value.tagId, `${path}.tagId`, limits, errors);\n if (value.unit !== undefined && typeof value.unit !== 'string') {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.unit`, message: 'Expected a unit string.' });\n }\n const unit = typeof value.unit === 'string' ? { unit: value.unit } : {};\n if (kind === 'property') {\n const instanceId = readId(value.instanceId, `${path}.instanceId`, limits, errors);\n const property = readId(value.property, `${path}.property`, limits, errors);\n if (errors.length > before || !id || !tagId || !instanceId || !property) return undefined;\n return { id, tagId, kind, instanceId, property, ...unit };\n }\n const connectionId = readId(value.connectionId, `${path}.connectionId`, limits, errors);\n if (errors.length > before || !id || !tagId || !connectionId) return undefined;\n return { id, tagId, kind, connectionId, ...unit };\n}\n\nfunction checkBindings(scene: ScadaScene, options: SceneValidationOptions, errors: Errors): void {\n const components = new Map(scene.components.map((c) => [c.id, c]));\n const connections = new Set(scene.connections.map((c) => c.id));\n const ids = new Set<string>();\n const targets = new Set<string>();\n scene.tagBindings?.forEach((binding, i) => {\n const path = `tagBindings[${i}]`;\n if (ids.has(binding.id)) {\n errors.push({ code: 'DUPLICATE_BINDING_ID', path: `${path}.id`, message: `Duplicate binding id \"${binding.id}\".` });\n return;\n }\n ids.add(binding.id);\n let quantity: Quantity | undefined;\n let target: string;\n if (binding.kind === 'property') {\n const owner = components.get(binding.instanceId);\n if (!owner) {\n errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.instanceId`, message: `No component \"${binding.instanceId}\".` });\n return;\n }\n if (options.resolveBindable) {\n quantity = options.resolveBindable(owner.type)?.[binding.property];\n if (!quantity) {\n errors.push({ code: 'UNBINDABLE_PROPERTY', path: `${path}.property`, message: `A ${owner.type} has no bindable property \"${binding.property}\".` });\n return;\n }\n }\n target = JSON.stringify(['property', binding.instanceId, binding.property]);\n } else {\n if (!connections.has(binding.connectionId)) {\n errors.push({ code: 'UNKNOWN_CONNECTION', path: `${path}.connectionId`, message: `No connection \"${binding.connectionId}\".` });\n return;\n }\n quantity = 'flow';\n target = JSON.stringify(['flow', binding.connectionId]);\n }\n if (quantity && !isKnownUnit(quantity, binding.unit)) {\n errors.push({ code: 'INVALID_UNIT', path: `${path}.unit`, message: `Unit \"${binding.unit}\" is not accepted for ${quantity}.` });\n return;\n }\n if (targets.has(target)) {\n errors.push({ code: 'DUPLICATE_BINDING_TARGET', path, message: 'Another binding already drives this target.' });\n return;\n }\n targets.add(target);\n });\n}\n\nfunction readList<T>(\n value: unknown,\n path: string,\n max: number,\n errors: Errors,\n read: (item: unknown, itemPath: string) => T | undefined,\n): T[] | undefined {\n if (!Array.isArray(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an array.' });\n return undefined;\n }\n if (value.length > max) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `More than ${max} entries.` });\n return undefined;\n }\n const items: T[] = [];\n value.forEach((item, i) => {\n const parsed = read(item, `${path}[${i}]`);\n if (parsed) items.push(parsed);\n });\n return items;\n}\n\nfunction checkReferences(scene: ScadaScene, options: SceneValidationOptions, errors: Errors): void {\n const componentsById = new Map<string, ComponentInstance>();\n scene.components.forEach((c, i) => {\n // Scaling a part with ports would change its port positions and bore away from the catalog.\n for (const problem of options.validateProperties?.(c.type, c.properties) ?? []) {\n errors.push({ code: 'INVALID_PROPERTY', path: `components[${i}].properties.${problem.property}`, message: problem.message });\n }\n const hasPorts = (options.resolvePorts(c.type, c.properties)?.length ?? 0) > 0;\n if (hasPorts && (c.scale.x !== 1 || c.scale.y !== 1 || c.scale.z !== 1)) {\n errors.push({ code: 'UNSUPPORTED_SCALE', path: `components[${i}].scale`, message: 'Components with ports must keep scale { x: 1, y: 1, z: 1 }.' });\n }\n if (c.parentId !== undefined && !scene.components.some((p) => p.id === c.parentId)) {\n errors.push({ code: 'UNKNOWN_PARENT', path: `components[${i}].parentId`, message: `No component \"${c.parentId}\" to be the parent.` });\n } else if (c.parentId !== undefined) {\n // Walk up the parent chain; coming back to this component means a cycle.\n const parents = new Map(scene.components.map((p) => [p.id, p.parentId]));\n let at: string | undefined = c.parentId;\n for (let steps = 0; at !== undefined && steps <= scene.components.length; steps++) {\n if (at === c.id) {\n errors.push({ code: 'PARENT_CYCLE', path: `components[${i}].parentId`, message: 'A component cannot be its own ancestor.' });\n break;\n }\n at = parents.get(at);\n }\n }\n if (componentsById.has(c.id)) {\n errors.push({ code: 'DUPLICATE_COMPONENT_ID', path: `components[${i}].id`, message: `Duplicate component id \"${c.id}\".` });\n } else {\n componentsById.set(c.id, c);\n }\n });\n\n const connectionIds = new Set<string>();\n const occupied = new Set<string>();\n const pairs = new Set<string>();\n const endpointKey = (e: SceneConnection['from']) => JSON.stringify([e.instanceId, e.portId]);\n\n scene.connections.forEach((connection, i) => {\n const path = `connections[${i}]`;\n if (connectionIds.has(connection.id)) {\n errors.push({ code: 'DUPLICATE_CONNECTION_ID', path: `${path}.id`, message: `Duplicate connection id \"${connection.id}\".` });\n return;\n }\n connectionIds.add(connection.id);\n\n const resolve = (side: 'from' | 'to'): ConnectionPort | undefined => {\n const endpoint = connection[side];\n const owner = componentsById.get(endpoint.instanceId);\n if (!owner) {\n errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.${side}.instanceId`, message: `No component \"${endpoint.instanceId}\".` });\n return undefined;\n }\n const port = options.resolvePorts(owner.type, owner.properties)?.find((p) => p.id === endpoint.portId);\n if (!port) {\n errors.push({ code: 'UNKNOWN_PORT', path: `${path}.${side}.portId`, message: `A ${owner.type} has no port \"${endpoint.portId}\".` });\n }\n return port;\n };\n const fromPort = resolve('from');\n const toPort = resolve('to');\n if (!fromPort || !toPort) return;\n\n if (connection.from.instanceId === connection.to.instanceId) {\n errors.push({ code: 'SELF_CONNECTION', path, message: 'A component cannot connect to itself.' });\n return;\n }\n if (!portsCompatible(fromPort, toPort)) {\n errors.push({ code: 'INCOMPATIBLE_PORTS', path, message: 'Port domains or nominal sizes do not match.' });\n return;\n }\n const fromKey = endpointKey(connection.from);\n const toKey = endpointKey(connection.to);\n const pair = [fromKey, toKey].sort().join('|');\n if (pairs.has(pair)) {\n errors.push({ code: 'DUPLICATE_EDGE', path, message: 'These ports are already connected.' });\n return;\n }\n let free = true;\n for (const [side, key] of [['from', fromKey], ['to', toKey]] as const) {\n if (occupied.has(key)) {\n errors.push({ code: 'PORT_OCCUPIED', path: `${path}.${side}`, message: 'Port already has a connection.' });\n free = false;\n }\n }\n if (!free) return;\n pairs.add(pair);\n occupied.add(fromKey);\n occupied.add(toKey);\n });\n}\n\n/**\n * Validates an untrusted value as a scene and returns it in the current (version 3) model.\n * Version 1 (`version: 1`) and version 2 (array vectors) input is migrated deterministically and\n * reported via `migratedFrom`.\n * Never mutates or repairs the input: on success it returns a fresh copy, otherwise every error\n * found, in input order, with paths in the input's own field names. Reference checks (ids, ports,\n * compatibility, occupancy, scale policy) run only once the structure is valid. Each port accepts\n * one connection.\n */\nfunction readUnderlay(value: unknown, limits: SceneLimits, options: SceneValidationOptions, errors: Errors): SceneUnderlay | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path: 'underlay', message: 'Expected an underlay object.' });\n return undefined;\n }\n checkKeys(value, underlayKeys, 'underlay', errors);\n const before = errors.length;\n const finite = (v: unknown, path: string, ok: (n: number) => boolean, rule: string): number => {\n if (typeof v !== 'number' || !Number.isFinite(v) || !ok(v)) errors.push({ code: 'INVALID_FIELD', path, message: `Expected ${rule}.` });\n return v as number;\n };\n let svg = '';\n if (typeof value.svg !== 'string') errors.push({ code: 'INVALID_FIELD', path: 'underlay.svg', message: 'Expected SVG markup as a string.' });\n else if (new TextEncoder().encode(value.svg).length > limits.maxUnderlayBytes) errors.push({ code: 'LIMIT_EXCEEDED', path: 'underlay.svg', message: `Underlay larger than ${limits.maxUnderlayBytes} bytes.` });\n else svg = value.svg;\n const position = isObject(value.position) ? value.position : undefined;\n if (!position) errors.push({ code: 'INVALID_FIELD', path: 'underlay.position', message: 'Expected { x, z } in metres.' });\n else checkKeys(position, ['x', 'z'], 'underlay.position', errors);\n const x = position ? finite(position.x, 'underlay.position.x', () => true, 'a finite number of metres') : 0;\n const z = position ? finite(position.z, 'underlay.position.z', () => true, 'a finite number of metres') : 0;\n const width = finite(value.width, 'underlay.width', (n) => n > 0 && n <= 1000, 'a width in metres above 0 and at most 1000');\n const rotation = finite(value.rotation, 'underlay.rotation', () => true, 'a finite angle in degrees');\n const opacity = finite(value.opacity, 'underlay.opacity', (n) => n >= 0 && n <= 1, 'an opacity from 0 to 1');\n if (errors.length > before) return undefined;\n const reason = options.validateUnderlay?.(svg);\n if (reason !== undefined) {\n errors.push({ code: 'INVALID_UNDERLAY', path: 'underlay.svg', message: reason });\n return undefined;\n }\n return { svg, position: { x, z }, width, rotation, opacity };\n}\n\nexport function validateScene(input: unknown, options: SceneValidationOptions): SceneValidationResult {\n const limits: SceneLimits = { ...defaultSceneLimits, ...options.limits };\n const errors: Errors = [];\n if (!isObject(input)) {\n return { ok: false, errors: [{ code: 'NOT_AN_OBJECT', path: '', message: 'Expected a scene object.' }] };\n }\n let version: SchemaVersion;\n if ('schemaVersion' in input) {\n // Unsupported numbers are reported and read with the newest rules.\n version = input.schemaVersion === 2 ? 2 : 3;\n if (input.schemaVersion !== 2 && input.schemaVersion !== 3) {\n errors.push({ code: 'UNSUPPORTED_VERSION', path: 'schemaVersion', message: `Unsupported schemaVersion ${describe(input.schemaVersion)}.` });\n }\n if (input.units !== 'm') {\n errors.push({ code: 'INVALID_FIELD', path: 'units', message: 'Expected units \"m\".' });\n }\n } else {\n version = 1;\n if (input.version !== 1) {\n errors.push({ code: 'UNSUPPORTED_VERSION', path: 'version', message: `Unsupported scene version ${describe(input.version)}.` });\n }\n }\n checkKeys(input, sceneKeys[version], '', errors);\n const components = readList(input.components, 'components', limits.maxComponents, errors, (item, path) =>\n readComponent(item, path, version, limits, errors),\n );\n const connections = readList(input.connections, 'connections', limits.maxConnections, errors, (item, path) =>\n readConnection(item, path, limits, errors),\n );\n const tagBindings =\n version !== 1 && input.tagBindings !== undefined\n ? readList(input.tagBindings, 'tagBindings', limits.maxBindings, errors, (item, path) => readBinding(item, path, limits, errors))\n : undefined;\n const underlay = version === 3 && input.underlay !== undefined ? readUnderlay(input.underlay, limits, options, errors) : undefined;\n if (errors.length > 0 || !components || !connections) return { ok: false, errors };\n\n const scene: ScadaScene = { schemaVersion: 3, units: 'm', components, connections, ...(tagBindings ? { tagBindings } : {}), ...(underlay ? { underlay } : {}) };\n checkReferences(scene, options, errors);\n checkBindings(scene, options, errors);\n if (errors.length > 0) return { ok: false, errors };\n return version === 3 ? { ok: true, scene } : { ok: true, scene, migratedFrom: version };\n}\n"]}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n checkPorts,\n portCapacity,\n portKinds,\n isRelationship,\n relationshipKinds,\n type PortKind,\n SCENE_DOCUMENT_TYPE,\n type JsonValue,\n type SceneExtensions,\n type SceneProject,\n type ComponentInstance,\n type ComponentType,\n isBuiltInKind,\n isNamespacedType,\n type ConnectionPort,\n type Quantity,\n type SceneUnderlay,\n type QuaternionLike,\n type QuaternionTuple,\n type Vector3Like,\n type ScadaScene,\n type TagBinding,\n type SceneAssociation,\n type SceneDataSource,\n type CommandLimits,\n type RuntimeVariable,\n type VariableAddress,\n dataTypes,\n modbusAreas,\n protocols,\n type SceneConnection,\n type SceneViews,\n type SymbolPlacement,\n type ViewLayout,\n type ViewRoute,\n type Vector3Tuple,\n viewKinds,\n ownValue,\n} from './scene.js';\nimport { quaternionFromEuler } from './quaternion.js';\nimport { isKnownUnit } from './units.js';\nimport { valueFitsDataType } from './telemetry.js';\nimport { tupleToQuaternion, tupleToVector } from './vectors.js';\n\nexport type SceneValidationErrorCode =\n | 'NOT_AN_OBJECT'\n | 'UNSUPPORTED_VERSION'\n | 'INVALID_FIELD'\n | 'UNKNOWN_FIELD'\n | 'LIMIT_EXCEEDED'\n | 'UNKNOWN_COMPONENT_KIND'\n | 'DUPLICATE_COMPONENT_ID'\n | 'DUPLICATE_CONNECTION_ID'\n | 'UNKNOWN_INSTANCE'\n | 'UNKNOWN_PORT'\n | 'SELF_CONNECTION'\n | 'INCOMPATIBLE_PORTS'\n | 'PORT_OCCUPIED'\n | 'DUPLICATE_EDGE'\n | 'UNSUPPORTED_SCALE'\n | 'INVALID_JSON'\n | 'UNKNOWN_CONNECTION'\n | 'UNBINDABLE_PROPERTY'\n | 'INVALID_UNIT'\n | 'DUPLICATE_BINDING_ID'\n | 'DUPLICATE_BINDING_TARGET'\n | 'INVALID_PROPERTY'\n | 'UNKNOWN_PARENT'\n | 'PARENT_CYCLE'\n | 'INVALID_UNDERLAY'\n | 'SECRET_FIELD'\n | 'DUPLICATE_DATA_SOURCE_ID'\n | 'DUPLICATE_VARIABLE_ID'\n | 'UNKNOWN_DATA_SOURCE'\n | 'INVALID_ADDRESS'\n | 'TYPE_MISMATCH'\n | 'UNKNOWN_VIEW_REFERENCE';\n\nexport interface SceneValidationError {\n code: SceneValidationErrorCode;\n /** Location in the input, e.g. `connections[2].to.instanceId`. */\n path: string;\n message: string;\n}\n\nexport type SceneValidationResult =\n /** `migratedFrom` is set when the input was an older schema version that was upgraded. */\n | { ok: true; scene: ScadaScene; migratedFrom?: 1 | 2 | 3 }\n | { ok: false; errors: SceneValidationError[] };\n\nexport interface SceneLimits {\n maxComponents: number;\n maxConnections: number;\n /** Port-less associations (ADR-0023), counted separately from connections. */\n maxAssociations: number;\n /** Acquisition sources and runtime variables (ADR-0024). */\n maxDataSources: number;\n maxVariables: number;\n maxBindings: number;\n maxIdLength: number;\n maxProperties: number;\n maxStringLength: number;\n /** UTF-8 bytes of `underlay.svg`. */\n maxUnderlayBytes: number;\n}\n\nexport const defaultSceneLimits: Readonly<SceneLimits> = {\n maxComponents: 10_000,\n maxConnections: 20_000,\n maxAssociations: 20_000,\n maxDataSources: 1_000,\n maxVariables: 20_000,\n maxBindings: 20_000,\n maxIdLength: 128,\n maxProperties: 64,\n maxStringLength: 1024,\n maxUnderlayBytes: 512 * 1024,\n};\n\nexport interface SceneValidationOptions {\n /**\n * Checks the address of a runtime variable on a host's own (namespaced) protocol (ADR-0024) and\n * returns its problems as sentences. Without it, such addresses are accepted as plain JSON.\n */\n validateAddress?: (protocol: string, address: JsonValue) => string[];\n /**\n * Declared ports for a component type. Core does not import the catalog, so the caller supplies it.\n * `properties` lets parametric types (e.g. pipe length) return per-instance ports.\n */\n resolvePorts: (type: ComponentType, properties?: ComponentInstance['properties']) => readonly ConnectionPort[] | undefined;\n /**\n * Whether the host knows a component type (ADR-0022). Optional: without it only the built-in\n * kinds are accepted. Custom types must also be namespaced (`com.example.part`); bare names\n * are reserved for the built-ins.\n */\n resolveType?: (type: ComponentType) => boolean;\n /**\n * Bindable properties and their quantities for a component type. When omitted, property bindings\n * are only checked for an existing component, and their units are not checked.\n */\n resolveBindable?: (type: ComponentType) => Readonly<Record<string, Quantity>> | undefined;\n /**\n * Checks authored property values (e.g. pipe length range). Each problem becomes an\n * INVALID_PROPERTY error at `components[i].properties.<property>`. Optional.\n */\n validateProperties?: (type: ComponentType, properties: ComponentInstance['properties']) => readonly { property: string; message: string }[];\n limits?: Partial<SceneLimits>;\n /**\n * Checks the content of `underlay.svg` (e.g. `sanitizeSvg` from @sakibcoolz/asset-import) and returns a\n * reason to reject it, or undefined. Core checks only structure and size. Optional.\n */\n validateUnderlay?: (svg: string) => string | undefined;\n}\n\ntype Errors = SceneValidationError[];\ntype Json = Record<string, unknown>;\n\ntype SchemaVersion = 1 | 2 | 3 | 4;\nconst sceneKeys: Record<SchemaVersion, string[]> = {\n 1: ['version', 'components', 'connections'],\n 2: ['schemaVersion', 'units', 'components', 'connections', 'tagBindings'],\n 3: ['schemaVersion', 'units', 'components', 'connections', 'tagBindings', 'underlay'],\n 4: ['schemaVersion', 'documentType', 'units', 'project', 'components', 'connections', 'associations', 'dataSources', 'runtimeVariables', 'tagBindings', 'underlay', 'views', 'extensions'],\n};\nconst projectKeys = ['id', 'name', 'revision', 'description'];\nconst viewLayoutKeys = ['symbols', 'routes'];\nconst symbolKeys = ['x', 'y', 'rotation', 'hidden'];\n/** Drawing coordinates (ADR-0026) stay within ±1,000,000 units; a route has 2 to 1,000 points. */\nconst MAX_VIEW_COORDINATE = 1_000_000;\nconst MAX_ROUTE_POINTS = 1_000;\nconst underlayKeys = ['svg', 'position', 'width', 'rotation', 'opacity'];\nconst componentKeys: Record<SchemaVersion, string[]> = {\n 1: ['id', 'kind', 'position', 'rotation', 'properties'],\n 2: ['id', 'type', 'position', 'rotation', 'scale', 'properties'],\n 3: ['id', 'type', 'parentId', 'position', 'rotation', 'scale', 'properties'],\n 4: ['id', 'name', 'type', 'typeVersion', 'manufacturer', 'model', 'parentId', 'position', 'rotation', 'scale', 'properties', 'labels', 'extensions'],\n};\n/** Deepest nesting accepted inside one extension value, and most values in all extensions of a scene (ADR-0021). */\nconst MAX_EXTENSION_DEPTH = 16;\nconst MAX_EXTENSION_VALUES = 10_000;\n/** Most JSON values in one variable address. Each address has its own budget, so `maxVariables` bounds the total. */\nconst MAX_ADDRESS_VALUES = 64;\n/** JSON values still accepted, and the error once they run out. */\ntype ValueBudget = { left: number; exceeded: string };\n/** Reverse-DNS namespace for extension keys, e.g. `com.example.app`. */\nconst NAMESPACE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i;\n/** Keys that would reach an object's prototype if copied naively. */\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst SECRET_WORDS = ['password', 'passwd', 'passphrase', 'secret', 'credential', 'apikey', 'accesskey', 'privatekey'];\n/** True for a key that names a credential: scene documents carry references to secrets, never secrets (ADR-0021). */\nexport function isSecretKey(key: string): boolean {\n const k = key.toLowerCase().replace(/[-_.\\s]/g, '');\n // \"auth\" only as a whole name or \"authorization…\": as a substring it would catch \"author\" (T-096).\n return k === 'pwd' || k === 'auth' || k.startsWith('authorization') || k.endsWith('token') || SECRET_WORDS.some((w) => k.includes(w));\n}\n/** Accepted deviation of a rotation quaternion's length from 1; larger values are rejected, never renormalised. */\nconst UNIT_TOLERANCE = 1e-6;\nconst connectionKeys: Record<SchemaVersion, string[]> = {\n 1: ['id', 'from', 'to'],\n 2: ['id', 'from', 'to'],\n 3: ['id', 'from', 'to'],\n 4: ['id', 'domain', 'relationship', 'from', 'to', 'properties'],\n};\nconst associationKeys = ['id', 'relationship', 'from', 'to', 'properties'];\nconst dataSourceKeys = ['id', 'name', 'protocol', 'deviceId', 'endpointRef', 'properties'];\nconst variableKeys = ['id', 'name', 'componentId', 'dataType', 'unit', 'access', 'source', 'scaling', 'command'];\nconst commandKeys = ['min', 'max', 'step', 'confirm'];\nconst variableSourceKeys = ['dataSourceId', 'variable', 'address'];\nconst scalingKeys = ['kind', 'rawMin', 'rawMax', 'min', 'max'];\nconst opcUaKeys = ['nodeId', 'namespaceUri'];\nconst modbusKeys = ['area', 'address', 'unitId', 'byteOrder', 'wordOrder', 'bit'];\n/** Registers a Modbus value spans (ADR-0024); `string` is not addressable in Modbus. */\nconst MODBUS_REGISTERS: Partial<Record<RuntimeVariable['dataType'], number>> = { bool: 1, int16: 1, uint16: 1, int32: 2, uint32: 2, float32: 2, float64: 4 };\n/** `scheme://user:password@host`: an endpoint carrying credentials. */\nconst URL_WITH_USER_INFO = /^[a-z][a-z0-9+.-]*:\\/\\/[^/?#]*@/i;\n/** A URL query or matrix parameter named like a credential, e.g. `?password=…` or `;token=…` (T-096). */\nconst SECRET_PARAMETER = /[?&;]([^=&;#]*)=/g;\n/** Whether an endpoint reference carries a credential: user info (also after leading spaces) or a secret-named parameter. */\nfunction endpointCarriesSecret(ref: string): boolean {\n return URL_WITH_USER_INFO.test(ref.trim()) || [...ref.matchAll(SECRET_PARAMETER)].some((m) => isSecretKey(decodeSafe(m[1])));\n}\nconst decodeSafe = (text: string): string => {\n try {\n return decodeURIComponent(text);\n } catch {\n return text;\n }\n};\nconst MAX_UNIT_LENGTH = 32;\nconst bindingKeys = {\n property: ['id', 'tagId', 'kind', 'instanceId', 'property', 'unit'],\n flow: ['id', 'tagId', 'kind', 'connectionId', 'unit'],\n};\nconst endpointKeys = ['instanceId', 'portId'];\n\n/** Describes any input value for an error message without throwing (JSON.stringify throws on BigInt). */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value.length > 64 ? `${value.slice(0, 64)}…` : value);\n if (typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined) return String(value);\n return `a ${Array.isArray(value) ? 'array' : typeof value}`;\n}\n\nfunction isObject(value: unknown): value is Json {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction checkKeys(value: Json, allowed: string[], path: string, errors: Errors): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) {\n errors.push({ code: 'UNKNOWN_FIELD', path: path ? `${path}.${key}` : key, message: `Unknown field \"${key}\".` });\n }\n }\n}\n\nfunction readId(value: unknown, path: string, limits: SceneLimits, errors: Errors): string | undefined {\n if (typeof value !== 'string' || value.length === 0) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a non-empty string id.' });\n return undefined;\n }\n if (value.length > limits.maxIdLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `Id is longer than ${limits.maxIdLength} characters.` });\n return undefined;\n }\n return value;\n}\n\n/**\n * True for a dense array of exactly `length` finite numbers. Checks every index: `every` would\n * skip holes in sparse arrays such as `[0, , 0]`.\n */\nfunction isFiniteTuple(value: unknown, length: number): value is number[] {\n if (!Array.isArray(value) || value.length !== length) return false;\n for (let i = 0; i < length; i++) {\n const n: unknown = value[i];\n if (typeof n !== 'number' || !Number.isFinite(n)) return false;\n }\n return true;\n}\n\n/** -0 and 0 are the same physical value, but JSON writes both as 0; normalise so accepted scenes round-trip exactly. */\nconst plusZero = (n: number) => (n === 0 ? 0 : n);\n\nfunction readVector(value: unknown, path: string, errors: Errors): Vector3Tuple | undefined {\n if (!isFiniteTuple(value, 3)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected three finite numbers.' });\n return undefined;\n }\n return [plusZero(value[0]), plusZero(value[1]), plusZero(value[2])];\n}\n\nfunction readQuaternion(value: unknown, path: string, errors: Errors): QuaternionTuple | undefined {\n // Written as \"not within tolerance\" so a NaN length can never pass.\n if (!isFiniteTuple(value, 4) || !(Math.abs(Math.hypot(...value) - 1) <= UNIT_TOLERANCE)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a unit quaternion [x, y, z, w].' });\n return undefined;\n }\n return [plusZero(value[0]), plusZero(value[1]), plusZero(value[2]), plusZero(value[3])];\n}\n\nfunction readScale(value: unknown, path: string, errors: Errors): Vector3Tuple | undefined {\n if (!isFiniteTuple(value, 3) || !value.every((n) => n > 0)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected three positive finite numbers.' });\n return undefined;\n }\n return [value[0], value[1], value[2]];\n}\n\n/**\n * Reads a named-axis object (version 3) such as { x, y, z }. Extra keys are UNKNOWN_FIELD; a\n * missing, non-number or non-finite axis (or a non-positive one when `positive`) is INVALID_FIELD.\n */\nfunction readAxes(value: unknown, axes: readonly string[], path: string, errors: Errors, positive = false): number[] | undefined {\n const expected = `Expected an object with finite${positive ? ' positive' : ''} ${axes.join(', ')}.`;\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: expected });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, [...axes], path, errors);\n const numbers: number[] = [];\n for (const axis of axes) {\n const n: unknown = value[axis];\n if (typeof n !== 'number' || !Number.isFinite(n) || (positive && !(n > 0))) {\n errors.push({ code: 'INVALID_FIELD', path, message: expected });\n return undefined;\n }\n numbers.push(plusZero(n));\n }\n return errors.length > before ? undefined : numbers;\n}\n\nfunction readVectorObject(value: unknown, path: string, errors: Errors, positive = false): Vector3Like | undefined {\n const axes = readAxes(value, ['x', 'y', 'z'], path, errors, positive);\n return axes && tupleToVector(axes);\n}\n\nfunction readQuaternionObject(value: unknown, path: string, errors: Errors): QuaternionLike | undefined {\n const axes = readAxes(value, ['x', 'y', 'z', 'w'], path, errors);\n if (!axes) return undefined;\n if (!(Math.abs(Math.hypot(...axes) - 1) <= UNIT_TOLERANCE)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a unit quaternion { x, y, z, w }.' });\n return undefined;\n }\n return tupleToQuaternion(axes);\n}\n\nfunction readProperties(\n value: unknown,\n path: string,\n limits: SceneLimits,\n errors: Errors,\n): ComponentInstance['properties'] | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an object of properties.' });\n return undefined;\n }\n const entries = Object.entries(value);\n if (entries.length > limits.maxProperties) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `More than ${limits.maxProperties} properties.` });\n return undefined;\n }\n const properties: ComponentInstance['properties'] = {};\n let valid = true;\n for (const [key, v] of entries) {\n const propertyPath = `${path}.${key}`;\n if (isSecretKey(key)) {\n errors.push({ code: 'SECRET_FIELD', path: propertyPath, message: `\"${key}\" looks like a credential; store a reference in the host instead.` });\n valid = false;\n continue;\n }\n if (typeof v === 'string') {\n if (v.length > limits.maxStringLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path: propertyPath, message: `String longer than ${limits.maxStringLength} characters.` });\n valid = false;\n continue;\n }\n } else if (typeof v !== 'boolean' && !(typeof v === 'number' && Number.isFinite(v))) {\n errors.push({ code: 'INVALID_FIELD', path: propertyPath, message: 'Expected a string, boolean or finite number.' });\n valid = false;\n continue;\n }\n // defineProperty keeps keys such as \"__proto__\" as plain data instead of touching the prototype.\n Object.defineProperty(properties, key, { value: typeof v === 'number' ? plusZero(v) : v, enumerable: true, writable: true, configurable: true });\n }\n return valid ? properties : undefined;\n}\n\n/** A non-empty string no longer than the string limit. */\nfunction readText(value: unknown, path: string, limits: SceneLimits, errors: Errors): string | undefined {\n if (typeof value !== 'string' || value.length === 0) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a non-empty string.' });\n return undefined;\n }\n if (value.length > limits.maxStringLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `String longer than ${limits.maxStringLength} characters.` });\n return undefined;\n }\n return value;\n}\n\n/** Defines a key as plain data, so keys such as \"__proto__\" never touch the prototype. */\nfunction put<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\n\nfunction readProject(value: unknown, limits: SceneLimits, errors: Errors): SceneProject | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path: 'project', message: 'Expected a project object.' });\n return undefined;\n }\n checkKeys(value, projectKeys, 'project', errors);\n const project: SceneProject = {};\n if (value.id !== undefined) {\n const id = readId(value.id, 'project.id', limits, errors);\n if (id !== undefined) project.id = id;\n }\n for (const key of ['name', 'revision', 'description'] as const) {\n if (value[key] !== undefined) {\n const text = readText(value[key], `project.${key}`, limits, errors);\n if (text !== undefined) project[key] = text;\n }\n }\n return project;\n}\n\n/** Identification labels: string keys to string values, no credentials (ADR-0021). */\nfunction readLabels(value: unknown, path: string, limits: SceneLimits, errors: Errors): Record<string, string> | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an object of labels.' });\n return undefined;\n }\n const entries = Object.entries(value);\n if (entries.length > limits.maxProperties) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `More than ${limits.maxProperties} labels.` });\n return undefined;\n }\n const labels: Record<string, string> = {};\n for (const [key, v] of entries) {\n const labelPath = `${path}.${key}`;\n if (key.length === 0 || key.length > limits.maxIdLength) {\n errors.push({ code: 'INVALID_FIELD', path: labelPath, message: `Label names must be 1 to ${limits.maxIdLength} characters.` });\n continue;\n }\n if (isSecretKey(key)) {\n errors.push({ code: 'SECRET_FIELD', path: labelPath, message: `\"${key}\" looks like a credential; store a reference in the host instead.` });\n continue;\n }\n if (typeof v !== 'string') {\n errors.push({ code: 'INVALID_FIELD', path: labelPath, message: 'Expected a string label.' });\n continue;\n }\n if (v.length > limits.maxStringLength) {\n errors.push({ code: 'LIMIT_EXCEEDED', path: labelPath, message: `String longer than ${limits.maxStringLength} characters.` });\n continue;\n }\n put(labels, key, v);\n }\n return labels;\n}\n\n/**\n * Extensions: reverse-DNS namespaces to plain JSON, bounded in depth and size, with no prototype\n * keys and no credentials anywhere inside (ADR-0021). Returns a fresh copy.\n */\nfunction readExtensions(value: unknown, path: string, budget: ValueBudget, limits: SceneLimits, errors: Errors): SceneExtensions | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an object keyed by namespace.' });\n return undefined;\n }\n const out: SceneExtensions = {};\n for (const [key, v] of Object.entries(value)) {\n if (!NAMESPACE.test(key)) {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.${key}`, message: 'Extension keys must be reverse-DNS namespaces such as \"com.example.app\".' });\n continue;\n }\n const copy = readJson(v, `${path}.${key}`, 1, budget, limits, errors);\n if (copy !== undefined) put(out, key, copy);\n }\n return out;\n}\n\nfunction readJson(value: unknown, path: string, depth: number, budget: ValueBudget, limits: SceneLimits, errors: Errors): JsonValue | undefined {\n if (--budget.left < 0) {\n if (budget.left === -1) errors.push({ code: 'LIMIT_EXCEEDED', path, message: budget.exceeded });\n return undefined;\n }\n if (depth > MAX_EXTENSION_DEPTH) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `Extension values nest deeper than ${MAX_EXTENSION_DEPTH} levels.` });\n return undefined;\n }\n if (value === null || typeof value === 'boolean') return value;\n if (typeof value === 'number') {\n if (Number.isFinite(value)) return plusZero(value);\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a finite number.' });\n return undefined;\n }\n if (typeof value === 'string') {\n if (value.length <= limits.maxStringLength) return value;\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `String longer than ${limits.maxStringLength} characters.` });\n return undefined;\n }\n if (Array.isArray(value)) {\n const out: JsonValue[] = [];\n for (let i = 0; i < value.length; i++) {\n const item = readJson(value[i], `${path}[${i}]`, depth + 1, budget, limits, errors);\n if (item === undefined) return undefined;\n out.push(item);\n }\n return out;\n }\n if (isObject(value)) {\n const out: { [key: string]: JsonValue } = {};\n for (const [key, v] of Object.entries(value)) {\n const keyPath = `${path}.${key}`;\n if (FORBIDDEN_KEYS.has(key)) {\n errors.push({ code: 'INVALID_FIELD', path: keyPath, message: `\"${key}\" is not allowed as a key.` });\n return undefined;\n }\n if (isSecretKey(key)) {\n errors.push({ code: 'SECRET_FIELD', path: keyPath, message: `\"${key}\" looks like a credential; store a reference in the host instead.` });\n return undefined;\n }\n const item = readJson(v, keyPath, depth + 1, budget, limits, errors);\n if (item === undefined) return undefined;\n put(out, key, item);\n }\n return out;\n }\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected plain JSON.' });\n return undefined;\n}\n\n/**\n * Reads one component in the input's own schema version and returns it in the current model.\n * Versions 3 and 4 use named { x, y, z } / { x, y, z, w } objects; version 4 adds identity, labels and\n * extensions. Version 2 uses arrays. Version 1 uses `kind` and Euler XYZ radians and has no scale.\n * Older versions migrate to the current model.\n */\nfunction readComponent(\n value: unknown,\n path: string,\n version: SchemaVersion,\n limits: SceneLimits,\n errors: Errors,\n extensionBudget: ValueBudget,\n resolveType: ((type: ComponentType) => boolean) | undefined,\n): ComponentInstance | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a component object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, componentKeys[version], path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const typeField = version === 1 ? 'kind' : 'type';\n const type = value[typeField];\n if (!isBuiltInKind(type) && !isNamespacedType(type)) {\n // Bare names belong to the SDK; a host's own types are namespaced (ADR-0022).\n errors.push({ code: 'UNKNOWN_COMPONENT_KIND', path: `${path}.${typeField}`, message: `Unknown component type ${describe(type)}; custom types are namespaced, such as \"com.example.part\".` });\n } else if (resolveType ? !resolveType(type) : !isBuiltInKind(type)) {\n errors.push({ code: 'UNKNOWN_COMPONENT_KIND', path: `${path}.${typeField}`, message: `Unknown component type ${describe(type)}; no definition is registered for it.` });\n }\n let position: Vector3Like | undefined;\n let rotation: QuaternionLike | undefined;\n let scale: Vector3Like | undefined;\n const parentId = version >= 3 && value.parentId !== undefined ? readId(value.parentId, `${path}.parentId`, limits, errors) : undefined;\n if (version >= 3) {\n position = readVectorObject(value.position, `${path}.position`, errors);\n rotation = readQuaternionObject(value.rotation, `${path}.rotation`, errors);\n scale = readVectorObject(value.scale, `${path}.scale`, errors, true);\n } else {\n const p = readVector(value.position, `${path}.position`, errors);\n position = p && tupleToVector(p);\n if (version === 1) {\n const euler = readVector(value.rotation, `${path}.rotation`, errors);\n rotation = euler && tupleToQuaternion(quaternionFromEuler(euler));\n scale = { x: 1, y: 1, z: 1 };\n } else {\n const q = readQuaternion(value.rotation, `${path}.rotation`, errors);\n rotation = q && tupleToQuaternion(q);\n const sc = readScale(value.scale, `${path}.scale`, errors);\n scale = sc && tupleToVector(sc);\n }\n }\n const properties = readProperties(value.properties, `${path}.properties`, limits, errors);\n const identity: Pick<ComponentInstance, 'name' | 'typeVersion' | 'manufacturer' | 'model' | 'labels' | 'extensions'> = {};\n if (version === 4) {\n for (const key of ['name', 'typeVersion', 'manufacturer', 'model'] as const) {\n if (value[key] !== undefined) {\n const text = readText(value[key], `${path}.${key}`, limits, errors);\n if (text !== undefined) identity[key] = text;\n }\n }\n if (value.labels !== undefined) identity.labels = readLabels(value.labels, `${path}.labels`, limits, errors);\n if (value.extensions !== undefined) identity.extensions = readExtensions(value.extensions, `${path}.extensions`, extensionBudget, limits, errors);\n }\n if (errors.length > before || !id || !position || !rotation || !scale || !properties) return undefined;\n return {\n id,\n type: type as ComponentType,\n ...(parentId ? { parentId } : {}),\n position,\n rotation,\n scale,\n properties,\n ...identity,\n };\n}\n\nfunction readEndpoint(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneConnection['from'] | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an endpoint object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, endpointKeys, path, errors);\n const instanceId = readId(value.instanceId, `${path}.instanceId`, limits, errors);\n const portId = readId(value.portId, `${path}.portId`, limits, errors);\n if (errors.length > before || !instanceId || !portId) return undefined;\n return { instanceId, portId };\n}\n\n/** Edge data on a connection or association (ADR-0023): property value rules, and no credential-like names. */\nfunction readEdgeProperties(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneConnection['properties'] {\n const properties = readProperties(value, path, limits, errors);\n for (const key of Object.keys(properties ?? {})) {\n if (isSecretKey(key)) errors.push({ code: 'SECRET_FIELD', path: `${path}.${key}`, message: `\"${key}\" looks like a credential; store a reference in the host instead.` });\n }\n return properties;\n}\n\nfunction readAssociation(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneAssociation | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an association object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, associationKeys, path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n if (!isRelationship(value.relationship)) {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.relationship`, message: `Expected a relationship: one of ${relationshipKinds.join(', ')}, or a namespaced name such as \"com.example.supervises\".` });\n }\n const from = readId(value.from, `${path}.from`, limits, errors);\n const to = readId(value.to, `${path}.to`, limits, errors);\n const properties = value.properties !== undefined ? readEdgeProperties(value.properties, `${path}.properties`, limits, errors) : undefined;\n if (errors.length > before || !id || !from || !to) return undefined;\n return { id, relationship: value.relationship as SceneAssociation['relationship'], from, to, ...(properties ? { properties } : {}) };\n}\n\nfunction readDataSource(value: unknown, path: string, limits: SceneLimits, errors: Errors): SceneDataSource | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a data source object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, dataSourceKeys, path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const source: Partial<SceneDataSource> = {};\n if (value.name !== undefined) source.name = readText(value.name, `${path}.name`, limits, errors);\n if ((protocols as readonly unknown[]).includes(value.protocol) || isNamespacedType(value.protocol)) source.protocol = value.protocol as string;\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.protocol`, message: `Unknown protocol ${describe(value.protocol)}; expected one of ${protocols.join(', ')}, or a namespaced name such as \"com.vendor.bus\".` });\n if (value.deviceId !== undefined) source.deviceId = readId(value.deviceId, `${path}.deviceId`, limits, errors);\n if (value.endpointRef !== undefined) {\n const ref = readText(value.endpointRef, `${path}.endpointRef`, limits, errors);\n if (ref !== undefined && endpointCarriesSecret(ref)) {\n errors.push({ code: 'SECRET_FIELD', path: `${path}.endpointRef`, message: 'The endpoint carries a user name or password; store a reference the host resolves instead.' });\n } else if (ref !== undefined) source.endpointRef = ref;\n }\n if (value.properties !== undefined) source.properties = readEdgeProperties(value.properties, `${path}.properties`, limits, errors);\n if (errors.length > before || !id) return undefined;\n return { id, ...source } as SceneDataSource;\n}\n\nfunction readFinite(value: unknown, path: string, errors: Errors): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return plusZero(value);\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a finite number.' });\n return undefined;\n}\n\n/** Reads a variable; its address stays plain JSON here and is checked against its source's protocol in `checkAcquisition`. */\nfunction readVariable(value: unknown, path: string, limits: SceneLimits, errors: Errors): RuntimeVariable | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a runtime variable object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, variableKeys, path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const variable: Partial<RuntimeVariable> = {};\n if (value.name !== undefined) variable.name = readText(value.name, `${path}.name`, limits, errors);\n if (value.componentId !== undefined) variable.componentId = readId(value.componentId, `${path}.componentId`, limits, errors);\n if ((dataTypes as readonly unknown[]).includes(value.dataType)) variable.dataType = value.dataType as RuntimeVariable['dataType'];\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.dataType`, message: `Unknown data type ${describe(value.dataType)}; expected one of ${dataTypes.join(', ')}.` });\n if (value.unit !== undefined) {\n if (typeof value.unit === 'string' && value.unit.length <= MAX_UNIT_LENGTH) variable.unit = value.unit;\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.unit`, message: `Expected a unit of at most ${MAX_UNIT_LENGTH} characters.` });\n }\n if (value.access === 'read' || value.access === 'readWrite') variable.access = value.access;\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.access`, message: `Expected access \"read\" or \"readWrite\".` });\n if (value.source !== undefined) {\n const s = value.source;\n if (!isObject(s)) errors.push({ code: 'INVALID_FIELD', path: `${path}.source`, message: 'Expected a source object.' });\n else {\n checkKeys(s, variableSourceKeys, `${path}.source`, errors);\n const dataSourceId = readId(s.dataSourceId, `${path}.source.dataSourceId`, limits, errors);\n const name = s.variable !== undefined ? readText(s.variable, `${path}.source.variable`, limits, errors) : undefined;\n let address: JsonValue | undefined;\n if (s.address !== undefined) {\n if (!isObject(s.address)) errors.push({ code: 'INVALID_ADDRESS', path: `${path}.source.address`, message: 'Expected an address object.' });\n else address = readJson(s.address, `${path}.source.address`, 1, { left: MAX_ADDRESS_VALUES, exceeded: `An address holds more than ${MAX_ADDRESS_VALUES} values.` }, limits, errors);\n }\n if (dataSourceId) variable.source = { dataSourceId, ...(name !== undefined ? { variable: name } : {}), ...(address !== undefined ? { address: address as VariableAddress } : {}) };\n }\n }\n if (value.scaling !== undefined) {\n const sc = value.scaling;\n if (!isObject(sc)) errors.push({ code: 'INVALID_FIELD', path: `${path}.scaling`, message: 'Expected a scaling object.' });\n else {\n checkKeys(sc, scalingKeys, `${path}.scaling`, errors);\n if (sc.kind !== 'linear') errors.push({ code: 'INVALID_FIELD', path: `${path}.scaling.kind`, message: 'Expected scaling kind \"linear\".' });\n const [rawMin, rawMax, min, max] = (['rawMin', 'rawMax', 'min', 'max'] as const).map((k) => readFinite(sc[k], `${path}.scaling.${k}`, errors));\n if (rawMin !== undefined && rawMax !== undefined && rawMin === rawMax) errors.push({ code: 'INVALID_FIELD', path: `${path}.scaling.rawMax`, message: 'rawMin and rawMax must differ.' });\n if (rawMin !== undefined && rawMax !== undefined && min !== undefined && max !== undefined) variable.scaling = { kind: 'linear', rawMin, rawMax, min, max };\n }\n }\n if (value.command !== undefined) variable.command = readCommand(value.command, `${path}.command`, limits, errors);\n if (variable.dataType && variable.access) checkCommand(variable as RuntimeVariable, value, path, errors);\n if (errors.length > before || !id) return undefined;\n return { id, ...variable } as RuntimeVariable;\n}\n\nfunction readCommand(value: unknown, path: string, limits: SceneLimits, errors: Errors): CommandLimits | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a command limits object.' });\n return undefined;\n }\n checkKeys(value, commandKeys, path, errors);\n const command: CommandLimits = {};\n for (const key of ['min', 'max', 'step'] as const) if (value[key] !== undefined) command[key] = readFinite(value[key], `${path}.${key}`, errors);\n if (value.confirm !== undefined) command.confirm = readText(value.confirm, `${path}.confirm`, limits, errors);\n return command;\n}\n\n/**\n * The command boundary's document rules (ADR-0029 §2): only a `readWrite` variable has limits; it\n * needs a source; strings cannot be commanded; numeric types are bounded within their data type.\n */\nfunction checkCommand(variable: RuntimeVariable, value: Json, path: string, errors: Errors): void {\n const bad = (field: string, message: string): void => {\n errors.push({ code: 'INVALID_FIELD', path: `${path}${field}`, message });\n };\n if (variable.access === 'read') {\n if (value.command !== undefined) bad('.command', 'Only a \"readWrite\" variable takes command limits.');\n return;\n }\n if (variable.dataType === 'string') return bad('.access', 'A string variable cannot be commanded (ADR-0029).');\n if (value.source === undefined) bad('.source', 'A writable variable needs a source the host writes to.');\n const command = variable.command;\n if (value.command === undefined) return bad('.command', 'A writable variable needs command limits (ADR-0029).');\n if (!command) return;\n if (command.step !== undefined && !(command.step > 0)) bad('.command.step', 'The step must be greater than zero.');\n if (variable.dataType === 'bool') {\n for (const key of ['min', 'max'] as const) if (command[key] !== undefined) bad(`.command.${key}`, 'An on/off variable takes no minimum or maximum.');\n return;\n }\n // Unbounded setpoints are refused: both limits, in order, and within the data type.\n for (const key of ['min', 'max'] as const) {\n const limit = command[key];\n if (limit === undefined) {\n if (value.command && isObject(value.command) && value.command[key] === undefined) bad(`.command.${key}`, `A numeric writable variable needs a ${key === 'min' ? 'minimum' : 'maximum'}.`);\n } else if (!valueFitsDataType(limit, variable.dataType, !!variable.scaling)) bad(`.command.${key}`, `${limit} does not fit ${variable.dataType}.`);\n }\n if (command.min !== undefined && command.max !== undefined && !(command.min < command.max)) bad('.command.max', 'The maximum must be greater than the minimum.');\n}\n\n/** Keys anywhere in plain JSON that name a credential. */\nfunction secretKeys(value: JsonValue, path: string, errors: Errors): void {\n if (Array.isArray(value)) value.forEach((v, i) => secretKeys(v, `${path}[${i}]`, errors));\n else if (value !== null && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n if (isSecretKey(k)) errors.push({ code: 'SECRET_FIELD', path: `${path}.${k}`, message: `\"${k}\" looks like a credential; store a reference in the host instead.` });\n else secretKeys(v, `${path}.${k}`, errors);\n }\n }\n}\n\n/** Address rules per protocol (ADR-0024); every problem is `INVALID_ADDRESS` at the field's path. */\nfunction checkAddress(protocol: string, variable: RuntimeVariable, path: string, options: SceneValidationOptions, errors: Errors): void {\n const address = variable.source?.address as Record<string, JsonValue> | undefined;\n const bad = (at: string, message: string): void => {\n errors.push({ code: 'INVALID_ADDRESS', path: at ? `${path}.${at}` : path, message });\n };\n const isInt = (v: unknown, lo: number, hi: number): v is number => typeof v === 'number' && Number.isInteger(v) && v >= lo && v <= hi;\n if (protocol === 'host') {\n if (address !== undefined) bad('', 'A host source reads by tag id or `variable`; it takes no address.');\n return;\n }\n if (protocol === 'opcua' || protocol === 'modbus-tcp' || protocol === 'modbus-rtu') {\n if (address === undefined) return bad('', `A ${protocol} source needs an address.`);\n if (protocol === 'opcua') {\n for (const key of Object.keys(address)) if (!opcUaKeys.includes(key)) bad(key, `Unknown OPC UA address field \"${key}\".`);\n if (typeof address.nodeId !== 'string' || address.nodeId.length === 0) bad('nodeId', 'Expected a node id such as \"ns=2;s=Line2.Speed\".');\n if (address.namespaceUri !== undefined && (typeof address.namespaceUri !== 'string' || address.namespaceUri.length === 0)) bad('namespaceUri', 'Expected a namespace URI.');\n return;\n }\n for (const key of Object.keys(address)) if (!modbusKeys.includes(key)) bad(key, `Unknown Modbus address field \"${key}\".`);\n const area = address.area;\n if (!(modbusAreas as readonly unknown[]).includes(area)) return bad('area', `Expected an area: ${modbusAreas.join(', ')}.`);\n if (!isInt(address.unitId, 0, 255)) bad('unitId', 'Expected a unit id 0–255.');\n if (address.byteOrder !== undefined && address.byteOrder !== 'big' && address.byteOrder !== 'little') bad('byteOrder', 'Expected \"big\" or \"little\".');\n if (address.wordOrder !== undefined && address.wordOrder !== 'high-first' && address.wordOrder !== 'low-first') bad('wordOrder', 'Expected \"high-first\" or \"low-first\".');\n const registers = MODBUS_REGISTERS[variable.dataType];\n if (registers === undefined) return bad('', `A ${variable.dataType} cannot be read from Modbus.`);\n if ((area === 'coil' || area === 'discrete') && variable.dataType !== 'bool') bad('area', `A ${area} holds only bool, not ${variable.dataType}.`);\n if (!isInt(address.address, 0, 65535)) bad('address', 'Expected an address 0–65535.');\n else if (address.address + registers - 1 > 65535) bad('address', `A ${variable.dataType} spans ${registers} registers and does not fit below 65536.`);\n if (address.bit !== undefined) {\n if (!isInt(address.bit, 0, 15)) bad('bit', 'Expected a bit 0–15.');\n else if (variable.dataType !== 'bool' || (area !== 'holding' && area !== 'input')) bad('bit', 'A bit applies only to a bool in a holding or input register.');\n }\n return;\n }\n // A host's own protocol: plain JSON, checked by the host when it can.\n if (address === undefined) return;\n secretKeys(address, `${path}`, errors);\n for (const message of options.validateAddress?.(protocol, address) ?? []) bad('', message);\n}\n\n/** References and address rules of data sources and runtime variables (ADR-0024). */\nfunction checkAcquisition(scene: ScadaScene, options: SceneValidationOptions, errors: Errors): void {\n const components = new Set(scene.components.map((c) => c.id));\n const sources = new Map<string, SceneDataSource>();\n scene.dataSources?.forEach((s, i) => {\n const path = `dataSources[${i}]`;\n if (sources.has(s.id)) errors.push({ code: 'DUPLICATE_DATA_SOURCE_ID', path: `${path}.id`, message: `Duplicate data source id \"${s.id}\".` });\n else sources.set(s.id, s);\n if (s.deviceId !== undefined && !components.has(s.deviceId)) errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.deviceId`, message: `No component \"${s.deviceId}\".` });\n });\n const ids = new Set<string>();\n scene.runtimeVariables?.forEach((v, i) => {\n const path = `runtimeVariables[${i}]`;\n if (ids.has(v.id)) {\n errors.push({ code: 'DUPLICATE_VARIABLE_ID', path: `${path}.id`, message: `Duplicate runtime variable id \"${v.id}\".` });\n return;\n }\n ids.add(v.id);\n if (v.componentId !== undefined && !components.has(v.componentId)) errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.componentId`, message: `No component \"${v.componentId}\".` });\n if (!v.source) return;\n const source = sources.get(v.source.dataSourceId);\n if (!source) {\n errors.push({ code: 'UNKNOWN_DATA_SOURCE', path: `${path}.source.dataSourceId`, message: `No data source \"${v.source.dataSourceId}\".` });\n return;\n }\n checkAddress(source.protocol, v, `${path}.source.address`, options, errors);\n });\n}\n\nfunction readConnection(value: unknown, path: string, version: SchemaVersion, limits: SceneLimits, errors: Errors): SceneConnection | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a connection object.' });\n return undefined;\n }\n const before = errors.length;\n checkKeys(value, connectionKeys[version], path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const from = readEndpoint(value.from, `${path}.from`, limits, errors);\n const to = readEndpoint(value.to, `${path}.to`, limits, errors);\n // Version 4 fields (ADR-0023); older versions reject them as unknown keys above.\n const extra: Pick<SceneConnection, 'domain' | 'relationship' | 'properties'> = {};\n if (version === 4) {\n if (value.domain !== undefined) {\n if ((portKinds as readonly unknown[]).includes(value.domain)) extra.domain = value.domain as PortKind;\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.domain`, message: `Unknown connection domain ${describe(value.domain)}; expected one of ${portKinds.join(', ')}.` });\n }\n if (value.relationship !== undefined) {\n if (isRelationship(value.relationship)) extra.relationship = value.relationship;\n else errors.push({ code: 'INVALID_FIELD', path: `${path}.relationship`, message: `Unknown relationship ${describe(value.relationship)}; expected one of ${relationshipKinds.join(', ')}, or a namespaced name such as \"com.example.supervises\".` });\n }\n if (value.properties !== undefined) {\n const properties = readEdgeProperties(value.properties, `${path}.properties`, limits, errors);\n if (properties) extra.properties = properties;\n }\n }\n if (errors.length > before || !id || !from || !to) return undefined;\n return { id, ...extra, from, to };\n}\n\nfunction readBinding(value: unknown, path: string, limits: SceneLimits, errors: Errors): TagBinding | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a binding object.' });\n return undefined;\n }\n const before = errors.length;\n const kind = value.kind;\n if (kind !== 'property' && kind !== 'flow') {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.kind`, message: 'Expected kind \"property\" or \"flow\".' });\n return undefined;\n }\n checkKeys(value, bindingKeys[kind], path, errors);\n const id = readId(value.id, `${path}.id`, limits, errors);\n const tagId = readId(value.tagId, `${path}.tagId`, limits, errors);\n if (value.unit !== undefined && typeof value.unit !== 'string') {\n errors.push({ code: 'INVALID_FIELD', path: `${path}.unit`, message: 'Expected a unit string.' });\n }\n const unit = typeof value.unit === 'string' ? { unit: value.unit } : {};\n if (kind === 'property') {\n const instanceId = readId(value.instanceId, `${path}.instanceId`, limits, errors);\n const property = readId(value.property, `${path}.property`, limits, errors);\n if (errors.length > before || !id || !tagId || !instanceId || !property) return undefined;\n return { id, tagId, kind, instanceId, property, ...unit };\n }\n const connectionId = readId(value.connectionId, `${path}.connectionId`, limits, errors);\n if (errors.length > before || !id || !tagId || !connectionId) return undefined;\n return { id, tagId, kind, connectionId, ...unit };\n}\n\nfunction checkBindings(scene: ScadaScene, options: SceneValidationOptions, errors: Errors): void {\n const components = new Map(scene.components.map((c) => [c.id, c]));\n const connections = new Set(scene.connections.map((c) => c.id));\n const variables = new Map((scene.runtimeVariables ?? []).map((v) => [v.id, v]));\n const ids = new Set<string>();\n const targets = new Set<string>();\n scene.tagBindings?.forEach((binding, i) => {\n const path = `tagBindings[${i}]`;\n if (ids.has(binding.id)) {\n errors.push({ code: 'DUPLICATE_BINDING_ID', path: `${path}.id`, message: `Duplicate binding id \"${binding.id}\".` });\n return;\n }\n ids.add(binding.id);\n let quantity: Quantity | undefined;\n let target: string;\n if (binding.kind === 'property') {\n const owner = components.get(binding.instanceId);\n if (!owner) {\n errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.instanceId`, message: `No component \"${binding.instanceId}\".` });\n return;\n }\n if (options.resolveBindable) {\n quantity = ownValue(options.resolveBindable(owner.type), binding.property);\n if (!quantity) {\n errors.push({ code: 'UNBINDABLE_PROPERTY', path: `${path}.property`, message: `A ${owner.type} has no bindable property \"${binding.property}\".` });\n return;\n }\n }\n target = JSON.stringify(['property', binding.instanceId, binding.property]);\n } else {\n if (!connections.has(binding.connectionId)) {\n errors.push({ code: 'UNKNOWN_CONNECTION', path: `${path}.connectionId`, message: `No connection \"${binding.connectionId}\".` });\n return;\n }\n quantity = 'flow';\n target = JSON.stringify(['flow', binding.connectionId]);\n }\n const variable = variables.get(binding.tagId);\n if (variable) {\n // The tag is described (ADR-0024): its data type must fit the property, and its unit applies when the binding gives none.\n const fits = variable.dataType === 'string' ? false : quantity === undefined ? true : (quantity === 'boolean') === (variable.dataType === 'bool');\n if (!fits) {\n const needs = quantity === 'boolean' ? 'a bool' : quantity ? `a number (${quantity})` : 'a bool or a number';\n errors.push({ code: 'TYPE_MISMATCH', path: `${path}.tagId`, message: `Tag \"${binding.tagId}\" is ${variable.dataType}, but this binding needs ${needs}.` });\n return;\n }\n if (quantity && binding.unit === undefined && variable.unit !== undefined && !isKnownUnit(quantity, variable.unit)) {\n errors.push({ code: 'INVALID_UNIT', path: `${path}.tagId`, message: `Tag \"${binding.tagId}\" is in \"${variable.unit}\", which is not accepted for ${quantity}.` });\n return;\n }\n }\n if (quantity && !isKnownUnit(quantity, binding.unit)) {\n errors.push({ code: 'INVALID_UNIT', path: `${path}.unit`, message: `Unit \"${binding.unit}\" is not accepted for ${quantity}.` });\n return;\n }\n if (targets.has(target)) {\n errors.push({ code: 'DUPLICATE_BINDING_TARGET', path, message: 'Another binding already drives this target.' });\n return;\n }\n targets.add(target);\n });\n}\n\nfunction readList<T>(\n value: unknown,\n path: string,\n max: number,\n errors: Errors,\n read: (item: unknown, itemPath: string) => T | undefined,\n): T[] | undefined {\n if (!Array.isArray(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected an array.' });\n return undefined;\n }\n if (value.length > max) {\n errors.push({ code: 'LIMIT_EXCEEDED', path, message: `More than ${max} entries.` });\n return undefined;\n }\n const items: T[] = [];\n // Every index, not forEach: a hole in a sparse array (`[, x]`) is an invalid entry, as `null` is in JSON.\n for (let i = 0; i < value.length; i++) {\n const parsed = read(value[i], `${path}[${i}]`);\n if (parsed) items.push(parsed);\n }\n return items;\n}\n\nfunction checkReferences(scene: ScadaScene, options: SceneValidationOptions, errors: Errors): void {\n const componentsById = new Map<string, ComponentInstance>();\n scene.components.forEach((c, i) => {\n // Scaling a part with ports would change its port positions and bore away from the catalog.\n for (const problem of options.validateProperties?.(c.type, c.properties) ?? []) {\n errors.push({ code: 'INVALID_PROPERTY', path: `components[${i}].properties.${problem.property}`, message: problem.message });\n }\n const hasPorts = (options.resolvePorts(c.type, c.properties)?.length ?? 0) > 0;\n if (hasPorts && (c.scale.x !== 1 || c.scale.y !== 1 || c.scale.z !== 1)) {\n errors.push({ code: 'UNSUPPORTED_SCALE', path: `components[${i}].scale`, message: 'Components with ports must keep scale { x: 1, y: 1, z: 1 }.' });\n }\n if (c.parentId !== undefined && !scene.components.some((p) => p.id === c.parentId)) {\n errors.push({ code: 'UNKNOWN_PARENT', path: `components[${i}].parentId`, message: `No component \"${c.parentId}\" to be the parent.` });\n } else if (c.parentId !== undefined) {\n // Walk up the parent chain; coming back to this component means a cycle.\n const parents = new Map(scene.components.map((p) => [p.id, p.parentId]));\n let at: string | undefined = c.parentId;\n for (let steps = 0; at !== undefined && steps <= scene.components.length; steps++) {\n if (at === c.id) {\n errors.push({ code: 'PARENT_CYCLE', path: `components[${i}].parentId`, message: 'A component cannot be its own ancestor.' });\n break;\n }\n at = parents.get(at);\n }\n }\n if (componentsById.has(c.id)) {\n errors.push({ code: 'DUPLICATE_COMPONENT_ID', path: `components[${i}].id`, message: `Duplicate component id \"${c.id}\".` });\n } else {\n componentsById.set(c.id, c);\n }\n });\n\n const connectionIds = new Set<string>();\n const occupied = new Map<string, number>();\n const pairs = new Set<string>();\n const endpointKey = (e: SceneConnection['from']) => JSON.stringify([e.instanceId, e.portId]);\n\n scene.connections.forEach((connection, i) => {\n const path = `connections[${i}]`;\n if (connectionIds.has(connection.id)) {\n errors.push({ code: 'DUPLICATE_CONNECTION_ID', path: `${path}.id`, message: `Duplicate connection id \"${connection.id}\".` });\n return;\n }\n connectionIds.add(connection.id);\n\n const resolve = (side: 'from' | 'to'): ConnectionPort | undefined => {\n const endpoint = connection[side];\n const owner = componentsById.get(endpoint.instanceId);\n if (!owner) {\n errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.${side}.instanceId`, message: `No component \"${endpoint.instanceId}\".` });\n return undefined;\n }\n const port = options.resolvePorts(owner.type, owner.properties)?.find((p) => p.id === endpoint.portId);\n if (!port) {\n errors.push({ code: 'UNKNOWN_PORT', path: `${path}.${side}.portId`, message: `A ${owner.type} has no port \"${endpoint.portId}\".` });\n }\n return port;\n };\n const fromPort = resolve('from');\n const toPort = resolve('to');\n if (!fromPort || !toPort) return;\n\n if (connection.from.instanceId === connection.to.instanceId) {\n errors.push({ code: 'SELF_CONNECTION', path, message: 'A component cannot connect to itself.' });\n return;\n }\n const check = checkPorts(fromPort, toPort);\n if (!check.ok) {\n errors.push({ code: 'INCOMPATIBLE_PORTS', path, message: `Incompatible ports: ${check.reason}.` });\n return;\n }\n if (connection.domain !== undefined && connection.domain !== fromPort.kind) {\n errors.push({ code: 'INCOMPATIBLE_PORTS', path: `${path}.domain`, message: `The connection is marked ${connection.domain}, but its ports are ${fromPort.kind} ports.` });\n return;\n }\n const fromKey = endpointKey(connection.from);\n const toKey = endpointKey(connection.to);\n const pair = [fromKey, toKey].sort().join('|');\n if (pairs.has(pair)) {\n errors.push({ code: 'DUPLICATE_EDGE', path, message: 'These ports are already connected.' });\n return;\n }\n let free = true;\n for (const [side, key, port] of [['from', fromKey, fromPort], ['to', toKey, toPort]] as const) {\n const capacity = portCapacity(port);\n if ((occupied.get(key) ?? 0) >= capacity) {\n errors.push({ code: 'PORT_OCCUPIED', path: `${path}.${side}`, message: capacity === 1 ? 'Port already has a connection.' : `Port already has ${capacity} connections, its maximum.` });\n free = false;\n }\n }\n if (!free) return;\n pairs.add(pair);\n occupied.set(fromKey, (occupied.get(fromKey) ?? 0) + 1);\n occupied.set(toKey, (occupied.get(toKey) ?? 0) + 1);\n });\n\n // Associations (ADR-0023): ids share the connections' namespace; directed, so only an identical\n // (from, to, relationship) repeats.\n const facts = new Set<string>();\n scene.associations?.forEach((a, i) => {\n const path = `associations[${i}]`;\n if (connectionIds.has(a.id)) {\n errors.push({ code: 'DUPLICATE_CONNECTION_ID', path: `${path}.id`, message: `Duplicate connection or association id \"${a.id}\".` });\n return;\n }\n connectionIds.add(a.id);\n let known = true;\n for (const side of ['from', 'to'] as const) {\n if (!componentsById.has(a[side])) {\n errors.push({ code: 'UNKNOWN_INSTANCE', path: `${path}.${side}`, message: `No component \"${a[side]}\".` });\n known = false;\n }\n }\n if (!known) return;\n if (a.from === a.to) {\n errors.push({ code: 'SELF_CONNECTION', path, message: 'A component cannot be associated with itself.' });\n return;\n }\n const fact = JSON.stringify([a.from, a.to, a.relationship]);\n if (facts.has(fact)) {\n errors.push({ code: 'DUPLICATE_EDGE', path, message: `\"${a.from}\" already ${a.relationship} \"${a.to}\".` });\n return;\n }\n facts.add(fact);\n });\n}\n\n/**\n * Reads the optional 2D layouts (ADR-0026): per view, symbol placements by component id and routes by\n * connection id. Structure only; `checkViews` checks that the ids exist.\n */\nfunction readViews(value: unknown, limits: SceneLimits, errors: Errors): SceneViews | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path: 'views', message: 'Expected an object of views.' });\n return undefined;\n }\n checkKeys(value, [...viewKinds], 'views', errors);\n const views: SceneViews = {};\n for (const kind of viewKinds) {\n if (value[kind] === undefined) continue;\n const layout = readViewLayout(value[kind], `views.${kind}`, limits, errors);\n if (layout) views[kind] = layout;\n }\n return views;\n}\n\nfunction readViewLayout(value: unknown, path: string, limits: SceneLimits, errors: Errors): ViewLayout | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path, message: 'Expected a view layout object.' });\n return undefined;\n }\n checkKeys(value, viewLayoutKeys, path, errors);\n const layout: ViewLayout = {};\n const coordinate = (v: unknown, at: string): number | undefined => {\n if (typeof v !== 'number' || !Number.isFinite(v) || Math.abs(v) > MAX_VIEW_COORDINATE) {\n errors.push({ code: 'INVALID_FIELD', path: at, message: `Expected a finite number within ±${MAX_VIEW_COORDINATE}.` });\n return undefined;\n }\n return v === 0 ? 0 : v; // -0 is written as 0, so read it as 0\n };\n const entries = (field: 'symbols' | 'routes', max: number): [string, unknown, string][] | undefined => {\n const record = value[field];\n if (record === undefined) return undefined;\n const at = `${path}.${field}`;\n if (!isObject(record)) {\n errors.push({ code: 'INVALID_FIELD', path: at, message: 'Expected an object keyed by id.' });\n return undefined;\n }\n const list = Object.entries(record);\n if (list.length > max) {\n errors.push({ code: 'LIMIT_EXCEEDED', path: at, message: `More than ${max} entries.` });\n return undefined;\n }\n return list.filter(([key]) => readId(key, `${at}.${key}`, limits, errors) !== undefined).map(([key, v]) => [key, v, `${at}.${key}`]);\n };\n\n const symbolEntries = entries('symbols', limits.maxComponents);\n if (symbolEntries) {\n const symbols: Record<string, SymbolPlacement> = {};\n for (const [id, v, at] of symbolEntries) {\n if (!isObject(v)) {\n errors.push({ code: 'INVALID_FIELD', path: at, message: 'Expected a symbol placement object.' });\n continue;\n }\n const before = errors.length;\n checkKeys(v, symbolKeys, at, errors);\n const x = coordinate(v.x, `${at}.x`), y = coordinate(v.y, `${at}.y`);\n if (v.rotation !== undefined && !(v.rotation === 0 || v.rotation === 90 || v.rotation === 180 || v.rotation === 270)) {\n errors.push({ code: 'INVALID_FIELD', path: `${at}.rotation`, message: 'Expected a rotation of 0, 90, 180 or 270.' });\n }\n if (v.hidden !== undefined && v.hidden !== true) errors.push({ code: 'INVALID_FIELD', path: `${at}.hidden`, message: 'Expected true, or no field.' });\n if (errors.length > before || x === undefined || y === undefined) continue;\n put(symbols, id, { x, y, ...(v.rotation !== undefined ? { rotation: v.rotation as SymbolPlacement['rotation'] } : {}), ...(v.hidden ? { hidden: true as const } : {}) });\n }\n layout.symbols = symbols;\n }\n\n const routeEntries = entries('routes', limits.maxConnections + limits.maxAssociations);\n if (routeEntries) {\n const routes: Record<string, ViewRoute> = {};\n for (const [id, v, at] of routeEntries) {\n if (!isObject(v)) {\n errors.push({ code: 'INVALID_FIELD', path: at, message: 'Expected a route object.' });\n continue;\n }\n checkKeys(v, ['points'], at, errors);\n const points = v.points;\n if (!Array.isArray(points) || points.length < 2 || points.length > MAX_ROUTE_POINTS) {\n errors.push({ code: 'INVALID_FIELD', path: `${at}.points`, message: `Expected 2 to ${MAX_ROUTE_POINTS} points.` });\n continue;\n }\n const read: [number, number][] = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!Array.isArray(p) || p.length !== 2) {\n errors.push({ code: 'INVALID_FIELD', path: `${at}.points[${i}]`, message: 'Expected an [x, y] point.' });\n continue;\n }\n const x = coordinate(p[0], `${at}.points[${i}][0]`), y = coordinate(p[1], `${at}.points[${i}][1]`);\n if (x !== undefined && y !== undefined) read.push([x, y]);\n }\n if (read.length === points.length) put(routes, id, { points: read });\n }\n layout.routes = routes;\n }\n return layout;\n}\n\n/** Every placed symbol is a component, and every route a connection or association (ADR-0026). */\nfunction checkViews(scene: ScadaScene, errors: Errors): void {\n if (!scene.views) return;\n const components = new Set(scene.components.map((c) => c.id));\n const edges = new Set([...scene.connections.map((c) => c.id), ...(scene.associations ?? []).map((a) => a.id)]);\n for (const kind of viewKinds) {\n const layout = scene.views[kind];\n for (const id of Object.keys(layout?.symbols ?? {})) {\n if (!components.has(id)) errors.push({ code: 'UNKNOWN_VIEW_REFERENCE', path: `views.${kind}.symbols.${id}`, message: `No component \"${id}\" to place.` });\n }\n for (const id of Object.keys(layout?.routes ?? {})) {\n if (!edges.has(id)) errors.push({ code: 'UNKNOWN_VIEW_REFERENCE', path: `views.${kind}.routes.${id}`, message: `No connection or association \"${id}\" to route.` });\n }\n }\n}\n\n/** Reads the optional reference drawing (ADR-0012); sanitizing is the host's `validateUnderlay`. */\nfunction readUnderlay(value: unknown, limits: SceneLimits, options: SceneValidationOptions, errors: Errors): SceneUnderlay | undefined {\n if (!isObject(value)) {\n errors.push({ code: 'INVALID_FIELD', path: 'underlay', message: 'Expected an underlay object.' });\n return undefined;\n }\n checkKeys(value, underlayKeys, 'underlay', errors);\n const before = errors.length;\n const finite = (v: unknown, path: string, ok: (n: number) => boolean, rule: string): number => {\n if (typeof v !== 'number' || !Number.isFinite(v) || !ok(v)) errors.push({ code: 'INVALID_FIELD', path, message: `Expected ${rule}.` });\n return v as number;\n };\n let svg = '';\n if (typeof value.svg !== 'string') errors.push({ code: 'INVALID_FIELD', path: 'underlay.svg', message: 'Expected SVG markup as a string.' });\n else if (new TextEncoder().encode(value.svg).length > limits.maxUnderlayBytes) errors.push({ code: 'LIMIT_EXCEEDED', path: 'underlay.svg', message: `Underlay larger than ${limits.maxUnderlayBytes} bytes.` });\n else svg = value.svg;\n const position = isObject(value.position) ? value.position : undefined;\n if (!position) errors.push({ code: 'INVALID_FIELD', path: 'underlay.position', message: 'Expected { x, z } in metres.' });\n else checkKeys(position, ['x', 'z'], 'underlay.position', errors);\n const x = position ? finite(position.x, 'underlay.position.x', () => true, 'a finite number of metres') : 0;\n const z = position ? finite(position.z, 'underlay.position.z', () => true, 'a finite number of metres') : 0;\n const width = finite(value.width, 'underlay.width', (n) => n > 0 && n <= 1000, 'a width in metres above 0 and at most 1000');\n const rotation = finite(value.rotation, 'underlay.rotation', () => true, 'a finite angle in degrees');\n const opacity = finite(value.opacity, 'underlay.opacity', (n) => n >= 0 && n <= 1, 'an opacity from 0 to 1');\n if (errors.length > before) return undefined;\n const reason = options.validateUnderlay?.(svg);\n if (reason !== undefined) {\n errors.push({ code: 'INVALID_UNDERLAY', path: 'underlay.svg', message: reason });\n return undefined;\n }\n return { svg, position: { x, z }, width, rotation, opacity };\n}\n\n/**\n * Validates an untrusted value as a scene and returns it in the current (version 4) model.\n * Version 1 (`version: 1`), version 2 (array vectors) and version 3 input is migrated\n * deterministically and reported via `migratedFrom` (ADR-0021).\n * Never mutates or repairs the input: on success it returns a fresh copy, otherwise every error\n * found, in input order, with paths in the input's own field names. Reference checks (ids, ports,\n * compatibility, occupancy, scale policy) run only once the structure is valid. Each port accepts\n * one connection.\n */\nexport function validateScene(input: unknown, options: SceneValidationOptions): SceneValidationResult {\n const limits: SceneLimits = { ...defaultSceneLimits, ...options.limits };\n const errors: Errors = [];\n if (!isObject(input)) {\n return { ok: false, errors: [{ code: 'NOT_AN_OBJECT', path: '', message: 'Expected a scene object.' }] };\n }\n let version: SchemaVersion;\n if ('schemaVersion' in input) {\n // Unsupported numbers are reported and read with the newest rules.\n version = input.schemaVersion === 2 || input.schemaVersion === 3 ? input.schemaVersion : 4;\n if (input.schemaVersion !== 2 && input.schemaVersion !== 3 && input.schemaVersion !== 4) {\n errors.push({ code: 'UNSUPPORTED_VERSION', path: 'schemaVersion', message: `Unsupported schemaVersion ${describe(input.schemaVersion)}.` });\n }\n if (input.schemaVersion === 4 && input.documentType !== SCENE_DOCUMENT_TYPE) {\n errors.push({ code: 'INVALID_FIELD', path: 'documentType', message: `Expected documentType \"${SCENE_DOCUMENT_TYPE}\".` });\n }\n if (input.units !== 'm') {\n errors.push({ code: 'INVALID_FIELD', path: 'units', message: 'Expected units \"m\".' });\n }\n } else {\n version = 1;\n if (input.version !== 1) {\n errors.push({ code: 'UNSUPPORTED_VERSION', path: 'version', message: `Unsupported scene version ${describe(input.version)}.` });\n }\n }\n checkKeys(input, sceneKeys[version], '', errors);\n const extensionBudget: ValueBudget = { left: MAX_EXTENSION_VALUES, exceeded: `Extensions hold more than ${MAX_EXTENSION_VALUES} values.` };\n const project = version === 4 && input.project !== undefined ? readProject(input.project, limits, errors) : undefined;\n const components = readList(input.components, 'components', limits.maxComponents, errors, (item, path) =>\n readComponent(item, path, version, limits, errors, extensionBudget, options.resolveType),\n );\n const connections = readList(input.connections, 'connections', limits.maxConnections, errors, (item, path) =>\n readConnection(item, path, version, limits, errors),\n );\n const associations =\n version === 4 && input.associations !== undefined\n ? readList(input.associations, 'associations', limits.maxAssociations, errors, (item, path) => readAssociation(item, path, limits, errors))\n : undefined;\n const dataSources =\n version === 4 && input.dataSources !== undefined\n ? readList(input.dataSources, 'dataSources', limits.maxDataSources, errors, (item, path) => readDataSource(item, path, limits, errors))\n : undefined;\n const runtimeVariables =\n version === 4 && input.runtimeVariables !== undefined\n ? readList(input.runtimeVariables, 'runtimeVariables', limits.maxVariables, errors, (item, path) => readVariable(item, path, limits, errors))\n : undefined;\n const tagBindings =\n version !== 1 && input.tagBindings !== undefined\n ? readList(input.tagBindings, 'tagBindings', limits.maxBindings, errors, (item, path) => readBinding(item, path, limits, errors))\n : undefined;\n const underlay = version >= 3 && input.underlay !== undefined ? readUnderlay(input.underlay, limits, options, errors) : undefined;\n const views = version === 4 && input.views !== undefined ? readViews(input.views, limits, errors) : undefined;\n const extensions = version === 4 && input.extensions !== undefined ? readExtensions(input.extensions, 'extensions', extensionBudget, limits, errors) : undefined;\n if (errors.length > 0 || !components || !connections) return { ok: false, errors };\n\n const scene: ScadaScene = {\n schemaVersion: 4,\n documentType: SCENE_DOCUMENT_TYPE,\n units: 'm',\n ...(project ? { project } : {}),\n components,\n connections,\n ...(associations ? { associations } : {}),\n ...(dataSources ? { dataSources } : {}),\n ...(runtimeVariables ? { runtimeVariables } : {}),\n ...(tagBindings ? { tagBindings } : {}),\n ...(underlay ? { underlay } : {}),\n ...(views ? { views } : {}),\n ...(extensions ? { extensions } : {}),\n };\n checkReferences(scene, options, errors);\n checkViews(scene, errors);\n checkBindings(scene, options, errors);\n checkAcquisition(scene, options, errors);\n if (errors.length > 0) return { ok: false, errors };\n return version === 4 ? { ok: true, scene } : { ok: true, scene, migratedFrom: version };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sakibcoolz/core",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Framework-neutral scene model, port graph, validation and routing for 3D SCADA scenes.",
5
5
  "license": "MIT",
6
6
  "author": "sakibcoolz",
@@ -30,13 +30,15 @@
30
30
  "sideEffects": false,
31
31
  "files": [
32
32
  "dist",
33
+ "schema",
33
34
  "LICENSE"
34
35
  ],
35
36
  "exports": {
36
37
  ".": {
37
38
  "types": "./dist/index.d.ts",
38
39
  "import": "./dist/index.js"
39
- }
40
+ },
41
+ "./schema/*": "./schema/*"
40
42
  },
41
43
  "publishConfig": {
42
44
  "access": "public"
@@ -0,0 +1,69 @@
1
+ {
2
+ "schemaVersion": 4,
3
+ "documentType": "industrial.scene",
4
+ "units": "m",
5
+ "components": [
6
+ {
7
+ "id": "T1",
8
+ "type": "tank",
9
+ "position": {
10
+ "x": 0,
11
+ "y": 0.5,
12
+ "z": 0
13
+ },
14
+ "rotation": {
15
+ "x": 0,
16
+ "y": 0,
17
+ "z": 0,
18
+ "w": 1
19
+ },
20
+ "scale": {
21
+ "x": 1,
22
+ "y": 1,
23
+ "z": 1
24
+ },
25
+ "properties": {}
26
+ },
27
+ {
28
+ "id": "V1",
29
+ "type": "valve",
30
+ "position": {
31
+ "x": 2,
32
+ "y": 0.5,
33
+ "z": 0
34
+ },
35
+ "rotation": {
36
+ "x": 0,
37
+ "y": 0,
38
+ "z": 0,
39
+ "w": 1
40
+ },
41
+ "scale": {
42
+ "x": 1,
43
+ "y": 1,
44
+ "z": 1
45
+ },
46
+ "properties": {}
47
+ }
48
+ ],
49
+ "connections": [
50
+ {
51
+ "id": "c",
52
+ "from": {
53
+ "instanceId": "T1",
54
+ "portId": "outlet"
55
+ },
56
+ "to": {
57
+ "instanceId": "V1",
58
+ "portId": "in"
59
+ }
60
+ }
61
+ ],
62
+ "associations": [
63
+ {
64
+ "id": "a1",
65
+ "from": "T1",
66
+ "to": "V1"
67
+ }
68
+ ]
69
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schemaVersion": 4,
3
+ "documentType": "industrial.scene",
4
+ "units": "m",
5
+ "components": [],
6
+ "connections": [],
7
+ "tagBindings": [
8
+ {
9
+ "id": "b",
10
+ "tagId": "t",
11
+ "kind": "alarm"
12
+ }
13
+ ]
14
+ }