@matter/model 0.16.0-alpha.0-20251102-faee7ab25 → 0.16.0-alpha.0-20251104-8c3166ea3

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 (266) hide show
  1. package/dist/cjs/aspects/Conformance.d.ts +6 -2
  2. package/dist/cjs/aspects/Conformance.d.ts.map +1 -1
  3. package/dist/cjs/aspects/Conformance.js +4 -6
  4. package/dist/cjs/aspects/Conformance.js.map +1 -1
  5. package/dist/cjs/elements/RequirementElement.d.ts +2 -1
  6. package/dist/cjs/elements/RequirementElement.d.ts.map +1 -1
  7. package/dist/cjs/elements/RequirementElement.js +1 -0
  8. package/dist/cjs/elements/RequirementElement.js.map +1 -1
  9. package/dist/cjs/logic/ClusterModifier.d.ts +3 -3
  10. package/dist/cjs/logic/ClusterModifier.d.ts.map +1 -1
  11. package/dist/cjs/logic/ClusterModifier.js +3 -3
  12. package/dist/cjs/logic/ClusterModifier.js.map +1 -1
  13. package/dist/cjs/logic/Scope.d.ts +10 -2
  14. package/dist/cjs/logic/Scope.d.ts.map +1 -1
  15. package/dist/cjs/logic/Scope.js +32 -25
  16. package/dist/cjs/logic/Scope.js.map +2 -2
  17. package/dist/cjs/logic/definition-validation/RequirementValidator.js +2 -2
  18. package/dist/cjs/logic/definition-validation/RequirementValidator.js.map +1 -1
  19. package/dist/cjs/logic/definition-validation/ValueValidator.js +1 -1
  20. package/dist/cjs/logic/definition-validation/ValueValidator.js.map +1 -1
  21. package/dist/cjs/models/ClusterModel.d.ts +3 -2
  22. package/dist/cjs/models/ClusterModel.d.ts.map +1 -1
  23. package/dist/cjs/models/ClusterModel.js +1 -1
  24. package/dist/cjs/models/ClusterModel.js.map +1 -1
  25. package/dist/cjs/models/Model.d.ts +7 -3
  26. package/dist/cjs/models/Model.d.ts.map +1 -1
  27. package/dist/cjs/models/Model.js +12 -2
  28. package/dist/cjs/models/Model.js.map +1 -1
  29. package/dist/cjs/models/Schema.d.ts +10 -2
  30. package/dist/cjs/models/Schema.d.ts.map +1 -1
  31. package/dist/cjs/models/Schema.js +1 -0
  32. package/dist/cjs/models/Schema.js.map +1 -1
  33. package/dist/cjs/standard/elements/air-purifier.element.d.ts.map +1 -1
  34. package/dist/cjs/standard/elements/air-purifier.element.js +5 -1
  35. package/dist/cjs/standard/elements/air-purifier.element.js.map +1 -1
  36. package/dist/cjs/standard/elements/battery-storage.element.d.ts.map +1 -1
  37. package/dist/cjs/standard/elements/battery-storage.element.js +49 -1
  38. package/dist/cjs/standard/elements/battery-storage.element.js.map +1 -1
  39. package/dist/cjs/standard/elements/bridged-node.element.d.ts.map +1 -1
  40. package/dist/cjs/standard/elements/bridged-node.element.js +1 -0
  41. package/dist/cjs/standard/elements/bridged-node.element.js.map +1 -1
  42. package/dist/cjs/standard/elements/cooktop.element.d.ts.map +1 -1
  43. package/dist/cjs/standard/elements/cooktop.element.js +2 -1
  44. package/dist/cjs/standard/elements/cooktop.element.js.map +1 -1
  45. package/dist/cjs/standard/elements/energy-evse-device.element.d.ts.map +1 -1
  46. package/dist/cjs/standard/elements/energy-evse-device.element.js +4 -1
  47. package/dist/cjs/standard/elements/energy-evse-device.element.js.map +1 -1
  48. package/dist/cjs/standard/elements/extractor-hood.element.d.ts.map +1 -1
  49. package/dist/cjs/standard/elements/extractor-hood.element.js +2 -1
  50. package/dist/cjs/standard/elements/extractor-hood.element.js.map +1 -1
  51. package/dist/cjs/standard/elements/fan.element.d.ts.map +1 -1
  52. package/dist/cjs/standard/elements/fan.element.js +2 -1
  53. package/dist/cjs/standard/elements/fan.element.js.map +1 -1
  54. package/dist/cjs/standard/elements/heat-pump.element.d.ts.map +1 -1
  55. package/dist/cjs/standard/elements/heat-pump.element.js +43 -1
  56. package/dist/cjs/standard/elements/heat-pump.element.js.map +1 -1
  57. package/dist/cjs/standard/elements/microwave-oven.element.d.ts.map +1 -1
  58. package/dist/cjs/standard/elements/microwave-oven.element.js +2 -1
  59. package/dist/cjs/standard/elements/microwave-oven.element.js.map +1 -1
  60. package/dist/cjs/standard/elements/oven.element.d.ts.map +1 -1
  61. package/dist/cjs/standard/elements/oven.element.js +3 -1
  62. package/dist/cjs/standard/elements/oven.element.js.map +1 -1
  63. package/dist/cjs/standard/elements/refrigerator-device.element.d.ts.map +1 -1
  64. package/dist/cjs/standard/elements/refrigerator-device.element.js +2 -1
  65. package/dist/cjs/standard/elements/refrigerator-device.element.js.map +1 -1
  66. package/dist/cjs/standard/elements/room-air-conditioner-device.element.d.ts.map +1 -1
  67. package/dist/cjs/standard/elements/room-air-conditioner-device.element.js +3 -1
  68. package/dist/cjs/standard/elements/room-air-conditioner-device.element.js.map +1 -1
  69. package/dist/cjs/standard/elements/root-node.element.d.ts.map +1 -1
  70. package/dist/cjs/standard/elements/root-node.element.js +1 -0
  71. package/dist/cjs/standard/elements/root-node.element.js.map +1 -1
  72. package/dist/cjs/standard/elements/smoke-co-alarm-device.element.d.ts.map +1 -1
  73. package/dist/cjs/standard/elements/smoke-co-alarm-device.element.js +2 -1
  74. package/dist/cjs/standard/elements/smoke-co-alarm-device.element.js.map +1 -1
  75. package/dist/cjs/standard/elements/solar-power.element.d.ts.map +1 -1
  76. package/dist/cjs/standard/elements/solar-power.element.js +38 -1
  77. package/dist/cjs/standard/elements/solar-power.element.js.map +1 -1
  78. package/dist/cjs/standard/elements/water-heater.element.d.ts.map +1 -1
  79. package/dist/cjs/standard/elements/water-heater.element.js +5 -1
  80. package/dist/cjs/standard/elements/water-heater.element.js.map +1 -1
  81. package/dist/cjs/standard/resources/air-purifier.resource.js +5 -1
  82. package/dist/cjs/standard/resources/air-purifier.resource.js.map +1 -1
  83. package/dist/cjs/standard/resources/battery-storage.resource.js +8 -1
  84. package/dist/cjs/standard/resources/battery-storage.resource.js.map +1 -1
  85. package/dist/cjs/standard/resources/bridged-node.resource.js +7 -1
  86. package/dist/cjs/standard/resources/bridged-node.resource.js.map +1 -1
  87. package/dist/cjs/standard/resources/cooktop.resource.js +2 -1
  88. package/dist/cjs/standard/resources/cooktop.resource.js.map +1 -1
  89. package/dist/cjs/standard/resources/energy-evse-device.resource.js +4 -1
  90. package/dist/cjs/standard/resources/energy-evse-device.resource.js.map +1 -1
  91. package/dist/cjs/standard/resources/extractor-hood.resource.js +2 -1
  92. package/dist/cjs/standard/resources/extractor-hood.resource.js.map +1 -1
  93. package/dist/cjs/standard/resources/fan.resource.js +2 -1
  94. package/dist/cjs/standard/resources/fan.resource.js.map +1 -1
  95. package/dist/cjs/standard/resources/heat-pump.resource.js +7 -1
  96. package/dist/cjs/standard/resources/heat-pump.resource.js.map +1 -1
  97. package/dist/cjs/standard/resources/microwave-oven.resource.js +2 -1
  98. package/dist/cjs/standard/resources/microwave-oven.resource.js.map +1 -1
  99. package/dist/cjs/standard/resources/oven.resource.js +5 -1
  100. package/dist/cjs/standard/resources/oven.resource.js.map +1 -1
  101. package/dist/cjs/standard/resources/refrigerator-device.resource.js +2 -1
  102. package/dist/cjs/standard/resources/refrigerator-device.resource.js.map +1 -1
  103. package/dist/cjs/standard/resources/room-air-conditioner-device.resource.js +3 -1
  104. package/dist/cjs/standard/resources/room-air-conditioner-device.resource.js.map +1 -1
  105. package/dist/cjs/standard/resources/root-node.resource.js +1 -0
  106. package/dist/cjs/standard/resources/root-node.resource.js.map +1 -1
  107. package/dist/cjs/standard/resources/smoke-co-alarm-device.resource.js +2 -1
  108. package/dist/cjs/standard/resources/smoke-co-alarm-device.resource.js.map +1 -1
  109. package/dist/cjs/standard/resources/solar-power.resource.js +7 -1
  110. package/dist/cjs/standard/resources/solar-power.resource.js.map +1 -1
  111. package/dist/cjs/standard/resources/water-heater.resource.js +5 -1
  112. package/dist/cjs/standard/resources/water-heater.resource.js.map +1 -1
  113. package/dist/esm/aspects/Conformance.d.ts +6 -2
  114. package/dist/esm/aspects/Conformance.d.ts.map +1 -1
  115. package/dist/esm/aspects/Conformance.js +4 -6
  116. package/dist/esm/aspects/Conformance.js.map +1 -1
  117. package/dist/esm/elements/RequirementElement.d.ts +2 -1
  118. package/dist/esm/elements/RequirementElement.d.ts.map +1 -1
  119. package/dist/esm/elements/RequirementElement.js +1 -0
  120. package/dist/esm/elements/RequirementElement.js.map +1 -1
  121. package/dist/esm/logic/ClusterModifier.d.ts +3 -3
  122. package/dist/esm/logic/ClusterModifier.d.ts.map +1 -1
  123. package/dist/esm/logic/ClusterModifier.js +3 -3
  124. package/dist/esm/logic/ClusterModifier.js.map +1 -1
  125. package/dist/esm/logic/Scope.d.ts +10 -2
  126. package/dist/esm/logic/Scope.d.ts.map +1 -1
  127. package/dist/esm/logic/Scope.js +32 -25
  128. package/dist/esm/logic/Scope.js.map +2 -2
  129. package/dist/esm/logic/definition-validation/RequirementValidator.js +2 -2
  130. package/dist/esm/logic/definition-validation/RequirementValidator.js.map +1 -1
  131. package/dist/esm/logic/definition-validation/ValueValidator.js +1 -1
  132. package/dist/esm/logic/definition-validation/ValueValidator.js.map +1 -1
  133. package/dist/esm/models/ClusterModel.d.ts +3 -2
  134. package/dist/esm/models/ClusterModel.d.ts.map +1 -1
  135. package/dist/esm/models/ClusterModel.js +1 -1
  136. package/dist/esm/models/ClusterModel.js.map +1 -1
  137. package/dist/esm/models/Model.d.ts +7 -3
  138. package/dist/esm/models/Model.d.ts.map +1 -1
  139. package/dist/esm/models/Model.js +12 -2
  140. package/dist/esm/models/Model.js.map +1 -1
  141. package/dist/esm/models/Schema.d.ts +10 -2
  142. package/dist/esm/models/Schema.d.ts.map +1 -1
  143. package/dist/esm/models/Schema.js +1 -0
  144. package/dist/esm/models/Schema.js.map +1 -1
  145. package/dist/esm/standard/elements/air-purifier.element.d.ts.map +1 -1
  146. package/dist/esm/standard/elements/air-purifier.element.js +5 -1
  147. package/dist/esm/standard/elements/air-purifier.element.js.map +1 -1
  148. package/dist/esm/standard/elements/battery-storage.element.d.ts.map +1 -1
  149. package/dist/esm/standard/elements/battery-storage.element.js +49 -1
  150. package/dist/esm/standard/elements/battery-storage.element.js.map +1 -1
  151. package/dist/esm/standard/elements/bridged-node.element.d.ts.map +1 -1
  152. package/dist/esm/standard/elements/bridged-node.element.js +1 -0
  153. package/dist/esm/standard/elements/bridged-node.element.js.map +1 -1
  154. package/dist/esm/standard/elements/cooktop.element.d.ts.map +1 -1
  155. package/dist/esm/standard/elements/cooktop.element.js +2 -1
  156. package/dist/esm/standard/elements/cooktop.element.js.map +1 -1
  157. package/dist/esm/standard/elements/energy-evse-device.element.d.ts.map +1 -1
  158. package/dist/esm/standard/elements/energy-evse-device.element.js +4 -1
  159. package/dist/esm/standard/elements/energy-evse-device.element.js.map +1 -1
  160. package/dist/esm/standard/elements/extractor-hood.element.d.ts.map +1 -1
  161. package/dist/esm/standard/elements/extractor-hood.element.js +2 -1
  162. package/dist/esm/standard/elements/extractor-hood.element.js.map +1 -1
  163. package/dist/esm/standard/elements/fan.element.d.ts.map +1 -1
  164. package/dist/esm/standard/elements/fan.element.js +2 -1
  165. package/dist/esm/standard/elements/fan.element.js.map +1 -1
  166. package/dist/esm/standard/elements/heat-pump.element.d.ts.map +1 -1
  167. package/dist/esm/standard/elements/heat-pump.element.js +43 -1
  168. package/dist/esm/standard/elements/heat-pump.element.js.map +1 -1
  169. package/dist/esm/standard/elements/microwave-oven.element.d.ts.map +1 -1
  170. package/dist/esm/standard/elements/microwave-oven.element.js +2 -1
  171. package/dist/esm/standard/elements/microwave-oven.element.js.map +1 -1
  172. package/dist/esm/standard/elements/oven.element.d.ts.map +1 -1
  173. package/dist/esm/standard/elements/oven.element.js +3 -1
  174. package/dist/esm/standard/elements/oven.element.js.map +1 -1
  175. package/dist/esm/standard/elements/refrigerator-device.element.d.ts.map +1 -1
  176. package/dist/esm/standard/elements/refrigerator-device.element.js +2 -1
  177. package/dist/esm/standard/elements/refrigerator-device.element.js.map +1 -1
  178. package/dist/esm/standard/elements/room-air-conditioner-device.element.d.ts.map +1 -1
  179. package/dist/esm/standard/elements/room-air-conditioner-device.element.js +3 -1
  180. package/dist/esm/standard/elements/room-air-conditioner-device.element.js.map +1 -1
  181. package/dist/esm/standard/elements/root-node.element.d.ts.map +1 -1
  182. package/dist/esm/standard/elements/root-node.element.js +1 -0
  183. package/dist/esm/standard/elements/root-node.element.js.map +1 -1
  184. package/dist/esm/standard/elements/smoke-co-alarm-device.element.d.ts.map +1 -1
  185. package/dist/esm/standard/elements/smoke-co-alarm-device.element.js +2 -1
  186. package/dist/esm/standard/elements/smoke-co-alarm-device.element.js.map +1 -1
  187. package/dist/esm/standard/elements/solar-power.element.d.ts.map +1 -1
  188. package/dist/esm/standard/elements/solar-power.element.js +38 -1
  189. package/dist/esm/standard/elements/solar-power.element.js.map +1 -1
  190. package/dist/esm/standard/elements/water-heater.element.d.ts.map +1 -1
  191. package/dist/esm/standard/elements/water-heater.element.js +5 -1
  192. package/dist/esm/standard/elements/water-heater.element.js.map +1 -1
  193. package/dist/esm/standard/resources/air-purifier.resource.js +5 -1
  194. package/dist/esm/standard/resources/air-purifier.resource.js.map +1 -1
  195. package/dist/esm/standard/resources/battery-storage.resource.js +8 -1
  196. package/dist/esm/standard/resources/battery-storage.resource.js.map +1 -1
  197. package/dist/esm/standard/resources/bridged-node.resource.js +7 -1
  198. package/dist/esm/standard/resources/bridged-node.resource.js.map +1 -1
  199. package/dist/esm/standard/resources/cooktop.resource.js +2 -1
  200. package/dist/esm/standard/resources/cooktop.resource.js.map +1 -1
  201. package/dist/esm/standard/resources/energy-evse-device.resource.js +4 -1
  202. package/dist/esm/standard/resources/energy-evse-device.resource.js.map +1 -1
  203. package/dist/esm/standard/resources/extractor-hood.resource.js +2 -1
  204. package/dist/esm/standard/resources/extractor-hood.resource.js.map +1 -1
  205. package/dist/esm/standard/resources/fan.resource.js +2 -1
  206. package/dist/esm/standard/resources/fan.resource.js.map +1 -1
  207. package/dist/esm/standard/resources/heat-pump.resource.js +7 -1
  208. package/dist/esm/standard/resources/heat-pump.resource.js.map +1 -1
  209. package/dist/esm/standard/resources/microwave-oven.resource.js +2 -1
  210. package/dist/esm/standard/resources/microwave-oven.resource.js.map +1 -1
  211. package/dist/esm/standard/resources/oven.resource.js +5 -1
  212. package/dist/esm/standard/resources/oven.resource.js.map +1 -1
  213. package/dist/esm/standard/resources/refrigerator-device.resource.js +2 -1
  214. package/dist/esm/standard/resources/refrigerator-device.resource.js.map +1 -1
  215. package/dist/esm/standard/resources/room-air-conditioner-device.resource.js +3 -1
  216. package/dist/esm/standard/resources/room-air-conditioner-device.resource.js.map +1 -1
  217. package/dist/esm/standard/resources/root-node.resource.js +1 -0
  218. package/dist/esm/standard/resources/root-node.resource.js.map +1 -1
  219. package/dist/esm/standard/resources/smoke-co-alarm-device.resource.js +2 -1
  220. package/dist/esm/standard/resources/smoke-co-alarm-device.resource.js.map +1 -1
  221. package/dist/esm/standard/resources/solar-power.resource.js +7 -1
  222. package/dist/esm/standard/resources/solar-power.resource.js.map +1 -1
  223. package/dist/esm/standard/resources/water-heater.resource.js +5 -1
  224. package/dist/esm/standard/resources/water-heater.resource.js.map +1 -1
  225. package/package.json +4 -4
  226. package/src/aspects/Conformance.ts +9 -7
  227. package/src/elements/RequirementElement.ts +1 -0
  228. package/src/logic/ClusterModifier.ts +3 -3
  229. package/src/logic/Scope.ts +39 -21
  230. package/src/logic/definition-validation/RequirementValidator.ts +7 -2
  231. package/src/logic/definition-validation/ValueValidator.ts +1 -1
  232. package/src/models/ClusterModel.ts +6 -2
  233. package/src/models/Model.ts +16 -6
  234. package/src/models/Schema.ts +13 -1
  235. package/src/standard/elements/air-purifier.element.ts +5 -1
  236. package/src/standard/elements/battery-storage.element.ts +58 -1
  237. package/src/standard/elements/bridged-node.element.ts +1 -0
  238. package/src/standard/elements/cooktop.element.ts +2 -1
  239. package/src/standard/elements/energy-evse-device.element.ts +4 -1
  240. package/src/standard/elements/extractor-hood.element.ts +3 -1
  241. package/src/standard/elements/fan.element.ts +2 -1
  242. package/src/standard/elements/heat-pump.element.ts +50 -1
  243. package/src/standard/elements/microwave-oven.element.ts +2 -1
  244. package/src/standard/elements/oven.element.ts +3 -1
  245. package/src/standard/elements/refrigerator-device.element.ts +2 -1
  246. package/src/standard/elements/room-air-conditioner-device.element.ts +3 -1
  247. package/src/standard/elements/root-node.element.ts +1 -0
  248. package/src/standard/elements/smoke-co-alarm-device.element.ts +2 -1
  249. package/src/standard/elements/solar-power.element.ts +42 -1
  250. package/src/standard/elements/water-heater.element.ts +5 -1
  251. package/src/standard/resources/air-purifier.resource.ts +5 -1
  252. package/src/standard/resources/battery-storage.resource.ts +9 -1
  253. package/src/standard/resources/bridged-node.resource.ts +5 -1
  254. package/src/standard/resources/cooktop.resource.ts +2 -1
  255. package/src/standard/resources/energy-evse-device.resource.ts +4 -1
  256. package/src/standard/resources/extractor-hood.resource.ts +2 -1
  257. package/src/standard/resources/fan.resource.ts +2 -1
  258. package/src/standard/resources/heat-pump.resource.ts +7 -1
  259. package/src/standard/resources/microwave-oven.resource.ts +2 -1
  260. package/src/standard/resources/oven.resource.ts +5 -1
  261. package/src/standard/resources/refrigerator-device.resource.ts +3 -1
  262. package/src/standard/resources/room-air-conditioner-device.resource.ts +3 -1
  263. package/src/standard/resources/root-node.resource.ts +1 -0
  264. package/src/standard/resources/smoke-co-alarm-device.resource.ts +2 -1
  265. package/src/standard/resources/solar-power.resource.ts +8 -1
  266. package/src/standard/resources/water-heater.resource.ts +5 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/standard/resources/root-node.resource.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAY,gBAAgB;AAAA,EAAQ,MAAM;AAAA,EAEnE,SAAS;AAAA,EAYT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,kBAAe;AAAA,IACrE,EAAE,KAAK,eAAe,MAAM,iBAAiB,MAAM,kBAAe;AAAA,IAClE,EAAE,KAAK,eAAe,MAAM,4BAA4B,MAAM,kBAAe;AAAA,IAC7E,EAAE,KAAK,eAAe,MAAM,uBAAuB,MAAM,kBAAe;AAAA,IACxE,EAAE,KAAK,eAAe,MAAM,sBAAsB,MAAM,kBAAe;AAAA,IACvE,EAAE,KAAK,eAAe,MAAM,wBAAwB,MAAM,kBAAe;AAAA,IACzE,EAAE,KAAK,eAAe,MAAM,wBAAwB,MAAM,kBAAe;AAAA,IACzE,EAAE,KAAK,eAAe,MAAM,8BAA8B,MAAM,kBAAe;AAAA,IAC/E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,6BAA6B,MAAM,kBAAe;AAAA,IAC9E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,kBAAe;AAAA,IACrE,EAAE,KAAK,eAAe,MAAM,sBAAsB,MAAM,kBAAe;AAAA,IACvE,EAAE,KAAK,eAAe,MAAM,kBAAkB,MAAM,kBAAe;AAAA,IACnE,EAAE,KAAK,eAAe,MAAM,uBAAuB,MAAM,kBAAe;AAAA,IACxE,EAAE,KAAK,eAAe,MAAM,8BAA8B,MAAM,kBAAe;AAAA,IAC/E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,4BAA4B,MAAM,kBAAe;AAAA,IAC7E,EAAE,KAAK,eAAe,MAAM,iBAAiB,MAAM,kBAAe;AAAA,IAElE;AAAA,MACI,KAAK;AAAA,MAAS,MAAM;AAAA,MAEpB,UAAU;AAAA,QACN;AAAA,UACI,KAAK;AAAA,UAAS,MAAM;AAAA,UACpB,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,QACA;AAAA,UACI,KAAK;AAAA,UAAS,MAAM;AAAA,UACpB,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ,CAAC;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAY,gBAAgB;AAAA,EAAQ,MAAM;AAAA,EAEnE,SAAS;AAAA,EAYT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,kBAAe;AAAA,IACrE,EAAE,KAAK,eAAe,MAAM,iBAAiB,MAAM,kBAAe;AAAA,IAClE,EAAE,KAAK,eAAe,MAAM,4BAA4B,MAAM,kBAAe;AAAA,IAC7E,EAAE,KAAK,eAAe,MAAM,uBAAuB,MAAM,kBAAe;AAAA,IACxE,EAAE,KAAK,eAAe,MAAM,sBAAsB,MAAM,kBAAe;AAAA,IACvE,EAAE,KAAK,eAAe,MAAM,wBAAwB,MAAM,kBAAe;AAAA,IACzE,EAAE,KAAK,eAAe,MAAM,wBAAwB,MAAM,kBAAe;AAAA,IACzE,EAAE,KAAK,eAAe,MAAM,8BAA8B,MAAM,kBAAe;AAAA,IAC/E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,6BAA6B,MAAM,kBAAe;AAAA,IAC9E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,kBAAe;AAAA,IACrE,EAAE,KAAK,eAAe,MAAM,sBAAsB,MAAM,kBAAe;AAAA,IACvE,EAAE,KAAK,eAAe,MAAM,kBAAkB,MAAM,kBAAe;AAAA,IACnE,EAAE,KAAK,eAAe,MAAM,uBAAuB,MAAM,kBAAe;AAAA,IACxE,EAAE,KAAK,eAAe,MAAM,8BAA8B,MAAM,kBAAe;AAAA,IAC/E,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,4BAA4B,MAAM,kBAAe;AAAA,IAC7E,EAAE,KAAK,eAAe,MAAM,iBAAiB,MAAM,kBAAe;AAAA,IAClE,EAAE,KAAK,eAAe,MAAM,eAAe,MAAM,kBAAe;AAAA,IAEhE;AAAA,MACI,KAAK;AAAA,MAAS,MAAM;AAAA,MAEpB,UAAU;AAAA,QACN;AAAA,UACI,KAAK;AAAA,UAAS,MAAM;AAAA,UACpB,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,QACA;AAAA,UACI,KAAK;AAAA,UAAS,MAAM;AAAA,UACpB,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ,CAAC;",
5
5
  "names": []
6
6
  }
@@ -16,7 +16,8 @@ Resource.add({
16
16
  { tag: "requirement", name: "SmokeCoAlarm", xref: "device\xA77.9.5" },
17
17
  { tag: "requirement", name: "RelativeHumidityMeasurement", xref: "device\xA77.9.5" },
18
18
  { tag: "requirement", name: "TemperatureMeasurement", xref: "device\xA77.9.5" },
19
- { tag: "requirement", name: "CarbonMonoxideConcentrationMeasurement", xref: "device\xA77.9.5" }
19
+ { tag: "requirement", name: "CarbonMonoxideConcentrationMeasurement", xref: "device\xA77.9.5" },
20
+ { tag: "requirement", name: "PowerSource", xref: "device\xA77.9.4" }
20
21
  ]
21
22
  });
22
23
  //# sourceMappingURL=smoke-co-alarm-device.resource.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/standard/resources/smoke-co-alarm-device.resource.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAgB,gBAAgB;AAAA,EAAU,MAAM;AAAA,EAEzE,SAAS;AAAA,EAYT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,kBAAe;AAAA,IAC7D,EAAE,KAAK,eAAe,MAAM,UAAU,MAAM,kBAAe;AAAA,IAC3D,EAAE,KAAK,eAAe,MAAM,gBAAgB,MAAM,kBAAe;AAAA,IACjE,EAAE,KAAK,eAAe,MAAM,+BAA+B,MAAM,kBAAe;AAAA,IAChF,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,0CAA0C,MAAM,kBAAe;AAAA,EAC/F;AACJ,CAAC;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAgB,gBAAgB;AAAA,EAAU,MAAM;AAAA,EAEzE,SAAS;AAAA,EAYT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,kBAAe;AAAA,IAC7D,EAAE,KAAK,eAAe,MAAM,UAAU,MAAM,kBAAe;AAAA,IAC3D,EAAE,KAAK,eAAe,MAAM,gBAAgB,MAAM,kBAAe;AAAA,IACjE,EAAE,KAAK,eAAe,MAAM,+BAA+B,MAAM,kBAAe;AAAA,IAChF,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,kBAAe;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,0CAA0C,MAAM,kBAAe;AAAA,IAC3F,EAAE,KAAK,eAAe,MAAM,eAAe,MAAM,kBAAe;AAAA,EACpE;AACJ,CAAC;",
5
5
  "names": []
6
6
  }
@@ -10,6 +10,12 @@ Resource.add({
10
10
  classification: "simple",
11
11
  xref: "device\xA714.3",
12
12
  details: "A Solar Power device is a device that allows a solar panel array, which can optionally be comprised of a set parallel strings of solar panels, and its associated controller and, if appropriate, inverter, to be monitored and controlled by an Energy Management System.",
13
- children: [{ tag: "requirement", name: "Identify", xref: "device\xA714.3.6" }]
13
+ children: [
14
+ { tag: "requirement", name: "Identify", xref: "device\xA714.3.6" },
15
+ { tag: "requirement", name: "PowerSource", xref: "device\xA714.3.5" },
16
+ { tag: "requirement", name: "ElectricalSensor", xref: "device\xA714.3.5" },
17
+ { tag: "requirement", name: "DeviceEnergyManagement", xref: "device\xA714.3.5" },
18
+ { tag: "requirement", name: "TemperatureSensor", xref: "device\xA714.3.5" }
19
+ ]
14
20
  });
15
21
  //# sourceMappingURL=solar-power.resource.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/standard/resources/solar-power.resource.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAc,gBAAgB;AAAA,EAAU,MAAM;AAAA,EACvE,SAAS;AAAA,EAGT,UAAU,CAAC,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,mBAAgB,CAAC;AAC9E,CAAC;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAc,gBAAgB;AAAA,EAAU,MAAM;AAAA,EACvE,SAAS;AAAA,EAIT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,mBAAgB;AAAA,IAC9D,EAAE,KAAK,eAAe,MAAM,eAAe,MAAM,mBAAgB;AAAA,IACjE,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,mBAAgB;AAAA,IACtE,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,mBAAgB;AAAA,IAC5E,EAAE,KAAK,eAAe,MAAM,qBAAqB,MAAM,mBAAgB;AAAA,EAC3E;AACJ,CAAC;",
5
5
  "names": []
6
6
  }
@@ -14,7 +14,11 @@ Resource.add({
14
14
  { tag: "requirement", name: "Identify", xref: "device\xA714.2.6" },
15
15
  { tag: "requirement", name: "Thermostat", xref: "device\xA714.2.6" },
16
16
  { tag: "requirement", name: "WaterHeaterManagement", xref: "device\xA714.2.6" },
17
- { tag: "requirement", name: "WaterHeaterMode", xref: "device\xA714.2.6" }
17
+ { tag: "requirement", name: "WaterHeaterMode", xref: "device\xA714.2.6" },
18
+ { tag: "requirement", name: "PowerSource", xref: "device\xA714.2.5" },
19
+ { tag: "requirement", name: "TemperatureSensor", xref: "device\xA714.2.5" },
20
+ { tag: "requirement", name: "ElectricalSensor", xref: "device\xA714.2.5" },
21
+ { tag: "requirement", name: "DeviceEnergyManagement", xref: "device\xA714.2.5" }
18
22
  ]
19
23
  });
20
24
  //# sourceMappingURL=water-heater.resource.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/standard/resources/water-heater.resource.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAe,gBAAgB;AAAA,EAAU,MAAM;AAAA,EACxE,SAAS;AAAA,EAGT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,mBAAgB;AAAA,IAC9D,EAAE,KAAK,eAAe,MAAM,cAAc,MAAM,mBAAgB;AAAA,IAChE,EAAE,KAAK,eAAe,MAAM,yBAAyB,MAAM,mBAAgB;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,mBAAmB,MAAM,mBAAgB;AAAA,EACzE;AACJ,CAAC;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,gBAAgB;AAEzB,SAAS,IAAI;AAAA,EACT,KAAK;AAAA,EAAc,MAAM;AAAA,EAAe,gBAAgB;AAAA,EAAU,MAAM;AAAA,EACxE,SAAS;AAAA,EAGT,UAAU;AAAA,IACN,EAAE,KAAK,eAAe,MAAM,YAAY,MAAM,mBAAgB;AAAA,IAC9D,EAAE,KAAK,eAAe,MAAM,cAAc,MAAM,mBAAgB;AAAA,IAChE,EAAE,KAAK,eAAe,MAAM,yBAAyB,MAAM,mBAAgB;AAAA,IAC3E,EAAE,KAAK,eAAe,MAAM,mBAAmB,MAAM,mBAAgB;AAAA,IACrE,EAAE,KAAK,eAAe,MAAM,eAAe,MAAM,mBAAgB;AAAA,IACjE,EAAE,KAAK,eAAe,MAAM,qBAAqB,MAAM,mBAAgB;AAAA,IACvE,EAAE,KAAK,eAAe,MAAM,oBAAoB,MAAM,mBAAgB;AAAA,IACtE,EAAE,KAAK,eAAe,MAAM,0BAA0B,MAAM,mBAAgB;AAAA,EAChF;AACJ,CAAC;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/model",
3
- "version": "0.16.0-alpha.0-20251102-faee7ab25",
3
+ "version": "0.16.0-alpha.0-20251104-8c3166ea3",
4
4
  "description": "Matter data model",
5
5
  "keywords": [
6
6
  "iot",
@@ -31,11 +31,11 @@
31
31
  "embed-examples": "embedme **/README.md"
32
32
  },
33
33
  "dependencies": {
34
- "@matter/general": "0.16.0-alpha.0-20251102-faee7ab25"
34
+ "@matter/general": "0.16.0-alpha.0-20251104-8c3166ea3"
35
35
  },
36
36
  "devDependencies": {
37
- "@matter/testing": "0.16.0-alpha.0-20251102-faee7ab25",
38
- "@matter/tools": "0.16.0-alpha.0-20251102-faee7ab25"
37
+ "@matter/testing": "0.16.0-alpha.0-20251104-8c3166ea3",
38
+ "@matter/tools": "0.16.0-alpha.0-20251104-8c3166ea3"
39
39
  },
40
40
  "files": [
41
41
  "dist/**/*",
@@ -67,10 +67,10 @@ export class Conformance extends Aspect<Conformance.Definition> {
67
67
  return Conformance.validateReferences(this, this.ast, errorTarget, lookup);
68
68
  }
69
69
 
70
- validateComputation(errorTarget: Conformance.ErrorTarget, featuresAvailable?: FeatureSet) {
70
+ validateComputation(errorTarget: Conformance.ErrorTarget, features?: FeatureSet) {
71
71
  try {
72
72
  // This validation only confirms we can perform computation; we ignore the result
73
- this.applicabilityOf(featuresAvailable ?? new Set(), new Set());
73
+ this.applicabilityFor({ definedFeatures: features ?? new Set(), supportedFeatures: new Set() });
74
74
  } catch (e) {
75
75
  errorTarget.error("CANNOT_COMPUTE_CONFORMANCE", `Error computing conformance: ${asError(e).message}`);
76
76
  }
@@ -106,11 +106,8 @@ export class Conformance extends Aspect<Conformance.Definition> {
106
106
  * This is useful for filtering elements at compile time. For complete accuracy you then need to filter at runtime
107
107
  * once field values are known.
108
108
  */
109
- applicabilityOf(features: Iterable<string>, supportedFeatures: Iterable<string>) {
110
- const fset = features instanceof Set ? (features as Set<string>) : new Set(features);
111
- const sfset =
112
- supportedFeatures instanceof Set ? (supportedFeatures as Set<string>) : new Set(supportedFeatures);
113
- return computeApplicability(fset, sfset, this);
109
+ applicabilityFor({ definedFeatures: features, supportedFeatures }: Conformance.FeatureContext) {
110
+ return computeApplicability(features, supportedFeatures, this);
114
111
  }
115
112
 
116
113
  override toString() {
@@ -124,6 +121,11 @@ export class Conformance extends Aspect<Conformance.Definition> {
124
121
  }
125
122
 
126
123
  export namespace Conformance {
124
+ export interface FeatureContext {
125
+ definedFeatures: Set<string>;
126
+ supportedFeatures: Set<string>;
127
+ }
128
+
127
129
  export enum Applicability {
128
130
  None = 0,
129
131
  Optional = 1,
@@ -51,5 +51,6 @@ export namespace RequirementElement {
51
51
  Command = "command",
52
52
  Event = "event",
53
53
  CommandField = "commandField",
54
+ DeviceType = "deviceType",
54
55
  }
55
56
  }
@@ -73,14 +73,14 @@ export namespace ClusterModifier {
73
73
  */
74
74
  export function applyPresence(target: ClusterModel, modifications: ClusterModifier.PresenceModifications) {
75
75
  return apply(target, modifications, (element, isSupported) => {
76
- if (element.isSupported === isSupported) {
76
+ if (element.effectiveIsSupported === isSupported) {
77
77
  return;
78
78
  }
79
79
 
80
80
  if (element.isFinal) {
81
81
  element = element.clone();
82
82
  }
83
- element.isSupported = isSupported;
83
+ element.operationalIsSupported = isSupported;
84
84
 
85
85
  return element;
86
86
  });
@@ -116,7 +116,7 @@ export namespace ClusterModifier {
116
116
 
117
117
  const replacement = apply(member, mod as T);
118
118
  if (replacement === member || replacement === undefined) {
119
- return;
119
+ continue;
120
120
  }
121
121
 
122
122
  if (model === undefined) {
@@ -4,15 +4,15 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { Conformance } from "#aspects/Conformance.js";
7
8
  import { ElementTag } from "#common/ElementTag.js";
8
9
  import { SchemaImplementationError } from "#common/errors.js";
9
- import { FeatureSet } from "#common/FeatureSet.js";
10
10
  import { ImplementationError } from "#general";
11
+ import { ModelIndex, MutableModelIndex } from "./ModelIndex.js";
11
12
  import { ModelTraversal } from "./ModelTraversal.js";
12
13
 
13
14
  // These must be types to avoid circular references
14
15
  import type { ClusterModel, Model, ScopeModel, ValueModel } from "#models/index.js";
15
- import { ModelIndex, MutableModelIndex } from "./ModelIndex.js";
16
16
 
17
17
  const DEFAULT_TAGS = new Set([ElementTag.Field, ElementTag.Attribute]);
18
18
  const GLOBAL_IDS = new Set([0xfffd, 0xfffc, 0xfffb, 0xfffa, 0xfff9, 0xfff8]);
@@ -37,7 +37,7 @@ const cache = new WeakMap<Model, Scope>();
37
37
  *
38
38
  * TODO - currently we only consider shadows at scope root but shadows of nested children is possible with this approach
39
39
  */
40
- export interface Scope {
40
+ export interface Scope extends Conformance.FeatureContext {
41
41
  /**
42
42
  * The model analyzed.
43
43
  */
@@ -63,6 +63,14 @@ export interface Scope {
63
63
  * Identify members (child properties) of the designated model in this scope.
64
64
  */
65
65
  membersOf<T extends Model>(parent: T, options?: Scope.MemberOptions): ModelIndex<Model.ChildOf<T>>;
66
+
67
+ /**
68
+ * Test whether an element is supported in this scope.
69
+ *
70
+ * We define "supported" as an element that is mandatory given active features or has
71
+ * {@link Model#operationalIsSupported} set.
72
+ */
73
+ hasOperationalSupport(model: Model): boolean;
66
74
  }
67
75
 
68
76
  /**
@@ -91,13 +99,10 @@ export function Scope(subject: Model, options: Scope.ScopeOptions = {}) {
91
99
  let deconflictedMemberCache: Map<Model, Map<ElementTag, Set<Model>>> | undefined;
92
100
  let conformantMemberCache: Map<Model, Map<ElementTag, Set<Model>>> | undefined;
93
101
 
94
- let { featureNames, supportedFeatures } = owner as ClusterModel;
95
- if (!featureNames) {
96
- featureNames = new FeatureSet();
97
- }
98
- if (!supportedFeatures) {
99
- supportedFeatures = new FeatureSet();
100
- }
102
+ const features: Conformance.FeatureContext = {
103
+ definedFeatures: (owner as ClusterModel).definedFeatures ?? new Set(),
104
+ supportedFeatures: (owner as ClusterModel).supportedFeatures ?? new Set(),
105
+ };
101
106
 
102
107
  if (useCache && !options.disableCache) {
103
108
  const cached = cache.get(owner);
@@ -135,8 +140,9 @@ export function Scope(subject: Model, options: Scope.ScopeOptions = {}) {
135
140
  }
136
141
  });
137
142
 
138
- const result: Scope = {
143
+ const scope: Scope = {
139
144
  owner,
145
+ ...features,
140
146
  isShadow: shadows ? model => shadows!.has(model as ValueModel) : () => false,
141
147
  extensionOf: shadows
142
148
  ? <T extends Model>(model?: T) => shadows!.get(model as unknown as ValueModel)?.[0] as T | undefined
@@ -146,6 +152,7 @@ export function Scope(subject: Model, options: Scope.ScopeOptions = {}) {
146
152
  (shadows!.get(model as unknown as ValueModel)?.[0] as T | undefined) ?? model
147
153
  : <T extends Model>(model: T) => model,
148
154
  membersOf,
155
+ hasOperationalSupport,
149
156
  };
150
157
 
151
158
  function membersOf<T extends Model>(parent: T, options: Scope.MemberOptions = {}) {
@@ -154,7 +161,7 @@ export function Scope(subject: Model, options: Scope.ScopeOptions = {}) {
154
161
  if (Array.isArray(tags)) {
155
162
  tags = new Set(tags);
156
163
  }
157
- const allMembers = findAllMembers(parent, tags, result);
164
+ const allMembers = findAllMembers(parent, tags, scope);
158
165
 
159
166
  if (parent.tag === ElementTag.Cluster && tags.has(ElementTag.Attribute)) {
160
167
  injectGlobalAttributes(
@@ -177,18 +184,30 @@ export function Scope(subject: Model, options: Scope.ScopeOptions = {}) {
177
184
  parent,
178
185
  tags,
179
186
  allMembers,
180
- featureNames,
181
- supportedFeatures,
187
+ features,
182
188
  conformantOnly,
183
189
  conformantOnly ? deconflictedMemberCache : conformantMemberCache,
184
190
  );
185
191
  }
186
192
 
193
+ function hasOperationalSupport(model: Model) {
194
+ model = scope.modelFor(model);
195
+
196
+ const operational = model.effectiveIsSupported;
197
+ if (operational !== undefined) {
198
+ return operational;
199
+ }
200
+
201
+ const conformance = (model as { effectiveConformance?: Conformance }).effectiveConformance;
202
+
203
+ return conformance?.applicabilityFor(scope) === Conformance.Applicability.Mandatory;
204
+ }
205
+
187
206
  if (useCache) {
188
- cache.set(owner, result);
207
+ cache.set(owner, scope);
189
208
  }
190
209
 
191
- return result;
210
+ return scope;
192
211
  }
193
212
 
194
213
  export namespace Scope {
@@ -350,8 +369,7 @@ function filterWithConformance<T extends Model>(
350
369
  parent: T,
351
370
  tags: Set<ElementTag>,
352
371
  members: Model[],
353
- features: FeatureSet,
354
- supportedFeatures: FeatureSet,
372
+ features: Conformance.FeatureContext,
355
373
  conformantOnly: boolean,
356
374
  cache?: Map<Model, Map<ElementTag, Set<Model>>>,
357
375
  ) {
@@ -388,13 +406,13 @@ function filterWithConformance<T extends Model>(
388
406
  );
389
407
  }
390
408
 
391
- if (conformantOnly && !conformance.applicabilityOf(features, supportedFeatures)) {
409
+ if (conformantOnly && !conformance.applicabilityFor(features)) {
392
410
  continue;
393
411
  }
394
412
 
395
413
  const other = selectedMembers[tag][member.name];
396
414
  if (other !== undefined) {
397
- if (!conformantOnly && !conformance.applicabilityOf(features, supportedFeatures)) {
415
+ if (!conformantOnly && !conformance.applicabilityFor(features)) {
398
416
  continue;
399
417
  }
400
418
 
@@ -405,7 +423,7 @@ function filterWithConformance<T extends Model>(
405
423
  );
406
424
  }
407
425
 
408
- if (otherConformance.applicabilityOf(features, supportedFeatures)) {
426
+ if (otherConformance.applicabilityFor(features)) {
409
427
  throw new SchemaImplementationError(
410
428
  parent,
411
429
  `There are multiple definitions of "${member.name}" that cannot be differentiated by conformance`,
@@ -25,10 +25,15 @@ ModelValidator.validators[RequirementElement.Tag] = class RequirementValidator e
25
25
  switch (this.model.element) {
26
26
  case RequirementElement.ElementType.ClientCluster:
27
27
  case RequirementElement.ElementType.ServerCluster:
28
- if (parentTag !== ElementTag.DeviceType) {
28
+ if (
29
+ parentTag !== ElementTag.DeviceType &&
30
+ (parentTag !== ElementTag.Requirement ||
31
+ (this.model.parent as RequirementModel).element !==
32
+ RequirementElement.ElementType.DeviceType)
33
+ ) {
29
34
  this.error(
30
35
  "ILLEGAL_REQUIREMENT_PARENT",
31
- `Requirement type ${this.model.type} must be parented by device type`,
36
+ `Requirement type ${this.model.type} must be parented by device type or device requirement`,
32
37
  );
33
38
  }
34
39
  break;
@@ -43,7 +43,7 @@ export class ValueValidator<T extends ValueModel> extends ModelValidator<T> {
43
43
  }
44
44
  }
45
45
  });
46
- this.model.conformance.validateComputation(this, this.model.owner(ClusterModel)?.featureNames);
46
+ this.model.conformance.validateComputation(this, this.model.owner(ClusterModel)?.definedFeatures);
47
47
 
48
48
  this.#validateAspect("constraint");
49
49
  this.#validateAspect("access");
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import type { Conformance } from "#aspects/Conformance.js";
7
8
  import { camelize, describeList } from "#general";
8
9
  import { ModelIndex } from "#logic/ModelIndex.js";
9
10
  import { ModelTraversal } from "#logic/ModelTraversal.js";
@@ -21,7 +22,10 @@ import type { FieldModel } from "./FieldModel.js";
21
22
  import { Model } from "./Model.js";
22
23
  import { ScopeModel } from "./ScopeModel.js";
23
24
 
24
- export class ClusterModel extends ScopeModel<ClusterElement, ClusterModel.Child> implements ClusterElement {
25
+ export class ClusterModel
26
+ extends ScopeModel<ClusterElement, ClusterModel.Child>
27
+ implements ClusterElement, Conformance.FeatureContext
28
+ {
25
29
  override tag: ClusterElement.Tag = ClusterElement.Tag;
26
30
 
27
31
  #quality: Quality;
@@ -106,7 +110,7 @@ export class ClusterModel extends ScopeModel<ClusterElement, ClusterModel.Child>
106
110
  return (this.member(FeatureMap.id, [ElementTag.Attribute]) as AttributeModel) ?? new AttributeModel(FeatureMap);
107
111
  }
108
112
 
109
- get featureNames(): FeatureSet {
113
+ get definedFeatures(): FeatureSet {
110
114
  return new FeatureSet(this.features.map(feature => feature.name));
111
115
  }
112
116
 
@@ -54,7 +54,7 @@ export abstract class Model<E extends BaseElement = BaseElement, C extends Model
54
54
  *
55
55
  * This is an operational implementation hint and does not override conformance.
56
56
  */
57
- isSupported?: boolean;
57
+ operationalIsSupported?: boolean;
58
58
 
59
59
  #id: E["id"];
60
60
  #name: string;
@@ -329,6 +329,17 @@ export abstract class Model<E extends BaseElement = BaseElement, C extends Model
329
329
  return [this.tag];
330
330
  }
331
331
 
332
+ /**
333
+ * Obtain the "is supported" flag from inheritance.
334
+ */
335
+ get effectiveIsSupported(): boolean | undefined {
336
+ if (this.operationalIsSupported !== undefined) {
337
+ return this.operationalIsSupported;
338
+ }
339
+
340
+ return this.base?.effectiveIsSupported;
341
+ }
342
+
332
343
  /**
333
344
  * Update a subset of fields.
334
345
  *
@@ -532,16 +543,15 @@ export abstract class Model<E extends BaseElement = BaseElement, C extends Model
532
543
  */
533
544
  extend<This extends Model>(
534
545
  this: This,
535
- properties?: Partial<BaseElement.Properties<E>>,
546
+ properties?: Partial<Model.Definition<This>>,
536
547
  ...children: Model.ChildDefinition<Model>[]
537
548
  ): This {
538
549
  const constructor = this.constructor as new (properties: unknown) => This;
539
-
540
550
  const definition = {
541
551
  id: this.id,
542
552
  name: this.name,
543
553
 
544
- ...properties,
554
+ ...properties!, // This assertion may be a lie, but necessary due to apparent TS bug
545
555
 
546
556
  tag: this.tag,
547
557
  operationalBase: this,
@@ -573,7 +583,7 @@ export abstract class Model<E extends BaseElement = BaseElement, C extends Model
573
583
  this.isSeed = definition.isSeed;
574
584
  this.operationalBase = definition.operationalBase;
575
585
  this.operationalShadow = definition.operationalShadow;
576
- this.isSupported = definition.isSupported;
586
+ this.operationalIsSupported = definition.operationalIsSupported;
577
587
 
578
588
  if (isClone) {
579
589
  if (definition.hasLocalResource) {
@@ -762,7 +772,7 @@ export namespace Model {
762
772
  parent?: Model;
763
773
  operationalBase?: Model;
764
774
  operationalShadow?: Model;
765
- isSupported?: boolean;
775
+ operationalIsSupported?: boolean;
766
776
  })
767
777
  | T;
768
778
 
@@ -54,10 +54,20 @@ export function Schema(source: Model.Source) {
54
54
  throw new ImplementationError(`Model ${model.name} tag ${model.tag} is not legal for schema`);
55
55
  }
56
56
 
57
- return model as Schema;
57
+ return model as Schema.Struct;
58
58
  }
59
59
 
60
60
  export namespace Schema {
61
+ /**
62
+ * Schema that defines an object with named properties.
63
+ */
64
+ export type Struct = ClusterModel | DatatypeModel;
65
+
66
+ /**
67
+ * Schema that defines a cluster.
68
+ */
69
+ export type Cluster = ClusterModel;
70
+
61
71
  /**
62
72
  * Obtain {@link Schema} that is required for operation.
63
73
  */
@@ -74,4 +84,6 @@ export namespace Schema {
74
84
  export type Source = Schema | NewableFunction;
75
85
 
76
86
  export const empty = new DatatypeModel({ name: "Empty", type: "struct" });
87
+
88
+ empty.finalize();
77
89
  }
@@ -20,7 +20,11 @@ export const AirPurifierDt = DeviceType(
20
20
  Requirement({ name: "OnOff", id: 0x6, conformance: "O", element: "serverCluster" }),
21
21
  Requirement({ name: "FanControl", id: 0x202, conformance: "M", element: "serverCluster" }),
22
22
  Requirement({ name: "HepaFilterMonitoring", id: 0x71, conformance: "O", element: "serverCluster" }),
23
- Requirement({ name: "ActivatedCarbonFilterMonitoring", id: 0x72, conformance: "O", element: "serverCluster" })
23
+ Requirement({ name: "ActivatedCarbonFilterMonitoring", id: 0x72, conformance: "O", element: "serverCluster" }),
24
+ Requirement({ name: "Thermostat", id: 0x301, conformance: "O", element: "deviceType" }),
25
+ Requirement({ name: "TemperatureSensor", id: 0x302, conformance: "O", element: "deviceType" }),
26
+ Requirement({ name: "HumiditySensor", id: 0x307, conformance: "O", element: "deviceType" }),
27
+ Requirement({ name: "AirQualitySensor", id: 0x2c, conformance: "O", element: "deviceType" })
24
28
  );
25
29
 
26
30
  MatterDefinition.children.push(AirPurifierDt);
@@ -15,7 +15,64 @@ export const BatteryStorageDt = DeviceType(
15
15
  { name: "Descriptor", id: 0x1d, element: "serverCluster" },
16
16
  Requirement({ name: "DeviceTypeList", default: [ { deviceType: 24, revision: 1 } ], element: "attribute" })
17
17
  ),
18
- Requirement({ name: "Identify", id: 0x3, conformance: "O", element: "serverCluster" })
18
+ Requirement({ name: "Identify", id: 0x3, conformance: "O", element: "serverCluster" }),
19
+
20
+ Requirement(
21
+ { name: "PowerSource", id: 0x11, conformance: "M", element: "deviceType" },
22
+
23
+ Requirement(
24
+ { name: "PowerSource", id: 0x2f, element: "serverCluster" },
25
+ Requirement({ name: "Wired", conformance: "M", element: "feature" }),
26
+ Requirement({ name: "Battery", conformance: "M", element: "feature" }),
27
+ Requirement({ name: "BatVoltage", conformance: "M", element: "attribute" }),
28
+ Requirement({ name: "BatPercentRemaining", conformance: "M", element: "attribute" }),
29
+ Requirement({ name: "BatTimeRemaining", conformance: "M", element: "attribute" }),
30
+ Requirement({ name: "ActiveBatFaults", conformance: "M", element: "attribute" }),
31
+ Requirement({ name: "BatCapacity", conformance: "M", element: "attribute" }),
32
+ Requirement({ name: "BatTimeToFullCharge", conformance: "M", element: "attribute" }),
33
+ Requirement({ name: "BatChargingCurrent", conformance: "M", element: "attribute" }),
34
+ Requirement({ name: "ActiveBatChargeFaults", conformance: "M", element: "attribute" })
35
+ ),
36
+
37
+ Requirement(
38
+ { name: "Descriptor", id: 0x1d, element: "serverCluster" },
39
+ Requirement({ name: "TagList", conformance: "M", element: "feature" })
40
+ )
41
+ ),
42
+
43
+ Requirement(
44
+ { name: "ElectricalSensor", id: 0x510, conformance: "M", element: "deviceType" },
45
+
46
+ Requirement(
47
+ { name: "ElectricalPowerMeasurement", id: 0x90, element: "serverCluster" },
48
+ Requirement({ name: "AlternatingCurrent", conformance: "M", element: "feature" }),
49
+ Requirement({ name: "Voltage", conformance: "M", element: "attribute" }),
50
+ Requirement({ name: "ActiveCurrent", conformance: "M", element: "attribute" })
51
+ ),
52
+
53
+ Requirement(
54
+ { name: "ElectricalEnergyMeasurement", id: 0x91, element: "serverCluster" },
55
+ Requirement({ name: "ExportedEnergy", conformance: "M", element: "feature" })
56
+ )
57
+ ),
58
+
59
+ Requirement(
60
+ { name: "DeviceEnergyManagement", id: 0x50d, conformance: "M", element: "deviceType" },
61
+ Requirement(
62
+ { name: "DeviceEnergyManagement", id: 0x98, element: "serverCluster" },
63
+ Requirement({ name: "PowerAdjustment", conformance: "M", element: "feature" })
64
+ )
65
+ ),
66
+
67
+ Requirement(
68
+ { name: "TemperatureSensor", id: 0x302, conformance: "O", element: "deviceType" },
69
+ Requirement(
70
+ { name: "Descriptor", id: 0x1d, element: "serverCluster" },
71
+ Requirement({ name: "TagList", conformance: "M", element: "feature" })
72
+ )
73
+ ),
74
+
75
+ Requirement({ name: "SolarPower", id: 0x17, conformance: "O", element: "deviceType" })
19
76
  );
20
77
 
21
78
  MatterDefinition.children.push(BatteryStorageDt);
@@ -26,6 +26,7 @@ export const BridgedNodeDt = DeviceType(
26
26
  { name: "EcosystemInformation", id: 0x750, conformance: "FabricSynchronizedNode, O", element: "serverCluster" }
27
27
  ),
28
28
  Requirement({ name: "AdministratorCommissioning", id: 0x3c, conformance: "FabricSynchronizedNode", element: "serverCluster" }),
29
+ Requirement({ name: "PowerSource", id: 0x11, conformance: "O", element: "deviceType" }),
29
30
  Field({ name: "conditions", type: "enum8" }, Field({ name: "FabricSynchronizedNode" }))
30
31
  );
31
32
 
@@ -19,7 +19,8 @@ export const CooktopDt = DeviceType(
19
19
  Requirement(
20
20
  { name: "OnOff", id: 0x6, conformance: "M", element: "serverCluster" },
21
21
  Requirement({ name: "OFFONLY", conformance: "M", element: "feature" })
22
- )
22
+ ),
23
+ Requirement({ name: "CookSurface", id: 0x77, conformance: "O", element: "deviceType" })
23
24
  );
24
25
 
25
26
  MatterDefinition.children.push(CooktopDt);
@@ -18,7 +18,10 @@ export const EnergyEvseDt = DeviceType(
18
18
  Requirement({ name: "Identify", id: 0x3, conformance: "O", element: "serverCluster" }),
19
19
  Requirement({ name: "EnergyEvse", id: 0x99, conformance: "M", element: "serverCluster" }),
20
20
  Requirement({ name: "EnergyEvseMode", id: 0x9d, conformance: "M", element: "serverCluster" }),
21
- Requirement({ name: "TemperatureMeasurement", id: 0x402, conformance: "O", element: "serverCluster" })
21
+ Requirement({ name: "TemperatureMeasurement", id: 0x402, conformance: "O", element: "serverCluster" }),
22
+ Requirement({ name: "PowerSource", id: 0x11, conformance: "M", element: "deviceType" }),
23
+ Requirement({ name: "ElectricalSensor", id: 0x510, conformance: "M", element: "deviceType" }),
24
+ Requirement({ name: "DeviceEnergyManagement", id: 0x50d, conformance: "M", element: "deviceType" })
22
25
  );
23
26
 
24
27
  MatterDefinition.children.push(EnergyEvseDt);
@@ -24,7 +24,9 @@ export const ExtractorHoodDt = DeviceType(
24
24
  Requirement({ name: "ROCKING", conformance: "X", element: "feature" }),
25
25
  Requirement({ name: "WIND", conformance: "X", element: "feature" }),
26
26
  Requirement({ name: "AIRFLOWDIRECTION", conformance: "X", element: "feature" })
27
- )
27
+ ),
28
+
29
+ Requirement({ name: "OnOffLight", id: 0x100, conformance: "O", element: "deviceType" })
28
30
  );
29
31
 
30
32
  MatterDefinition.children.push(ExtractorHoodDt);
@@ -21,7 +21,8 @@ export const FanDt = DeviceType(
21
21
  Requirement(
22
22
  { name: "FanControl", id: 0x202, conformance: "M", element: "serverCluster" },
23
23
  Requirement({ name: "FanModeSequence", access: "R V", conformance: "Matter", element: "attribute" })
24
- )
24
+ ),
25
+ Requirement({ name: "Thermostat", id: 0x301, conformance: "O", element: "deviceType" })
25
26
  );
26
27
 
27
28
  MatterDefinition.children.push(FanDt);