@matter/model 0.16.0-alpha.0-20251004-92135c7df → 0.16.0-alpha.0-20251011-d8942d7d5

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 (82) hide show
  1. package/dist/cjs/aspects/Constraint.d.ts +9 -2
  2. package/dist/cjs/aspects/Constraint.d.ts.map +1 -1
  3. package/dist/cjs/aspects/Constraint.js +93 -18
  4. package/dist/cjs/aspects/Constraint.js.map +2 -2
  5. package/dist/cjs/common/FieldValue.d.ts +3 -9
  6. package/dist/cjs/common/FieldValue.d.ts.map +1 -1
  7. package/dist/cjs/elements/DatatypeElement.d.ts +6 -9
  8. package/dist/cjs/elements/DatatypeElement.d.ts.map +1 -1
  9. package/dist/cjs/elements/DatatypeElement.js.map +1 -1
  10. package/dist/cjs/logic/ModelIndex.d.ts +39 -0
  11. package/dist/cjs/logic/ModelIndex.d.ts.map +1 -0
  12. package/dist/cjs/logic/ModelIndex.js +100 -0
  13. package/dist/cjs/logic/ModelIndex.js.map +6 -0
  14. package/dist/cjs/logic/Scope.d.ts +2 -1
  15. package/dist/cjs/logic/Scope.d.ts.map +1 -1
  16. package/dist/cjs/logic/Scope.js +7 -3
  17. package/dist/cjs/logic/Scope.js.map +1 -1
  18. package/dist/cjs/logic/definition-validation/ValueValidator.d.ts.map +1 -1
  19. package/dist/cjs/logic/definition-validation/ValueValidator.js +2 -0
  20. package/dist/cjs/logic/definition-validation/ValueValidator.js.map +1 -1
  21. package/dist/cjs/logic/index.d.ts +1 -0
  22. package/dist/cjs/logic/index.d.ts.map +1 -1
  23. package/dist/cjs/logic/index.js +1 -0
  24. package/dist/cjs/logic/index.js.map +1 -1
  25. package/dist/cjs/models/ClusterModel.d.ts +43 -5
  26. package/dist/cjs/models/ClusterModel.d.ts.map +1 -1
  27. package/dist/cjs/models/ClusterModel.js +69 -1
  28. package/dist/cjs/models/ClusterModel.js.map +2 -2
  29. package/dist/cjs/models/ValueModel.d.ts +18 -2
  30. package/dist/cjs/models/ValueModel.d.ts.map +1 -1
  31. package/dist/cjs/models/ValueModel.js +27 -0
  32. package/dist/cjs/models/ValueModel.js.map +2 -2
  33. package/dist/cjs/parser/Lexer.js +1 -1
  34. package/dist/cjs/parser/TokenStream.js +2 -2
  35. package/dist/cjs/parser/TokenStream.js.map +1 -1
  36. package/dist/esm/aspects/Constraint.d.ts +9 -2
  37. package/dist/esm/aspects/Constraint.d.ts.map +1 -1
  38. package/dist/esm/aspects/Constraint.js +94 -19
  39. package/dist/esm/aspects/Constraint.js.map +2 -2
  40. package/dist/esm/common/FieldValue.d.ts +3 -9
  41. package/dist/esm/common/FieldValue.d.ts.map +1 -1
  42. package/dist/esm/elements/DatatypeElement.d.ts +6 -9
  43. package/dist/esm/elements/DatatypeElement.d.ts.map +1 -1
  44. package/dist/esm/elements/DatatypeElement.js.map +1 -1
  45. package/dist/esm/logic/ModelIndex.d.ts +39 -0
  46. package/dist/esm/logic/ModelIndex.d.ts.map +1 -0
  47. package/dist/esm/logic/ModelIndex.js +80 -0
  48. package/dist/esm/logic/ModelIndex.js.map +6 -0
  49. package/dist/esm/logic/Scope.d.ts +2 -1
  50. package/dist/esm/logic/Scope.d.ts.map +1 -1
  51. package/dist/esm/logic/Scope.js +7 -3
  52. package/dist/esm/logic/Scope.js.map +1 -1
  53. package/dist/esm/logic/definition-validation/ValueValidator.d.ts.map +1 -1
  54. package/dist/esm/logic/definition-validation/ValueValidator.js +2 -0
  55. package/dist/esm/logic/definition-validation/ValueValidator.js.map +1 -1
  56. package/dist/esm/logic/index.d.ts +1 -0
  57. package/dist/esm/logic/index.d.ts.map +1 -1
  58. package/dist/esm/logic/index.js +1 -0
  59. package/dist/esm/logic/index.js.map +1 -1
  60. package/dist/esm/models/ClusterModel.d.ts +43 -5
  61. package/dist/esm/models/ClusterModel.d.ts.map +1 -1
  62. package/dist/esm/models/ClusterModel.js +69 -1
  63. package/dist/esm/models/ClusterModel.js.map +2 -2
  64. package/dist/esm/models/ValueModel.d.ts +18 -2
  65. package/dist/esm/models/ValueModel.d.ts.map +1 -1
  66. package/dist/esm/models/ValueModel.js +27 -0
  67. package/dist/esm/models/ValueModel.js.map +2 -2
  68. package/dist/esm/parser/Lexer.js +1 -1
  69. package/dist/esm/parser/TokenStream.js +2 -2
  70. package/dist/esm/parser/TokenStream.js.map +1 -1
  71. package/package.json +4 -4
  72. package/src/aspects/Constraint.ts +121 -22
  73. package/src/common/FieldValue.ts +1 -1
  74. package/src/elements/DatatypeElement.ts +6 -9
  75. package/src/logic/ModelIndex.ts +125 -0
  76. package/src/logic/Scope.ts +16 -12
  77. package/src/logic/definition-validation/ValueValidator.ts +2 -0
  78. package/src/logic/index.ts +1 -0
  79. package/src/models/ClusterModel.ts +82 -9
  80. package/src/models/ValueModel.ts +35 -3
  81. package/src/parser/Lexer.ts +1 -1
  82. package/src/parser/TokenStream.ts +2 -2
@@ -41,6 +41,9 @@ class ClusterModel extends ScopeModel {
41
41
  get datatypes() {
42
42
  return this.scope.membersOf(this, { tags: [ElementTag.Datatype] });
43
43
  }
44
+ get conformant() {
45
+ return new ClusterModel.Conformant(this);
46
+ }
44
47
  get classification() {
45
48
  return this.resource?.classification;
46
49
  }
@@ -61,7 +64,9 @@ class ClusterModel extends ScopeModel {
61
64
  * Get attributes, commands and events whether inherited or defined directly in this model.
62
65
  */
63
66
  get allAces() {
64
- return this.scope.membersOf(this, { tags: [ElementTag.Attribute, ElementTag.Command, ElementTag.Event] });
67
+ return this.scope.membersOf(this, {
68
+ tags: [ElementTag.Attribute, ElementTag.Command, ElementTag.Event]
69
+ });
65
70
  }
66
71
  get revision() {
67
72
  let revision = 1;
@@ -140,6 +145,69 @@ class ClusterModel extends ScopeModel {
140
145
  static Tag = ClusterElement.Tag;
141
146
  }
142
147
  ClusterModel.register();
148
+ ((ClusterModel2) => {
149
+ class Conformant {
150
+ #model;
151
+ constructor(model) {
152
+ this.#model = model;
153
+ }
154
+ /**
155
+ * The cluster's conformant attributes.
156
+ */
157
+ get attributes() {
158
+ return this.#model.scope.membersOf(this.#model, {
159
+ tags: [ElementTag.Attribute],
160
+ conformance: "conformant"
161
+ });
162
+ }
163
+ /**
164
+ * The cluster's conformant properties (includes fields and attributes).
165
+ *
166
+ * This offers compatibility with the equivalent field for ValueModel. It is useful when treating a cluster as
167
+ * a struct.
168
+ */
169
+ get properties() {
170
+ return this.#model.scope.membersOf(this.#model, {
171
+ tags: [ElementTag.Attribute, ElementTag.Field],
172
+ conformance: "conformant"
173
+ });
174
+ }
175
+ /**
176
+ * The cluster's conformant fields.
177
+ *
178
+ * Fields are not formally allowed on clusters but we allow for extensions that should not be served via the
179
+ * Matter protocol.
180
+ *
181
+ * This is primarily here to allow simplified access to fields in contexts where a variable is typed as a
182
+ * ClusterModel or ValueModel.
183
+ */
184
+ get fields() {
185
+ return this.#model.scope.membersOf(this.#model, {
186
+ tags: [ElementTag.Field],
187
+ conformance: "conformant"
188
+ });
189
+ }
190
+ /**
191
+ * The cluster's conformant commands.
192
+ */
193
+ get commands() {
194
+ return this.#model.scope.membersOf(this.#model, {
195
+ tags: [ElementTag.Command],
196
+ conformance: "conformant"
197
+ });
198
+ }
199
+ /**
200
+ * The cluster's conformant events.
201
+ */
202
+ get events() {
203
+ return this.#model.scope.membersOf(this.#model, {
204
+ tags: [ElementTag.Event],
205
+ conformance: "conformant"
206
+ });
207
+ }
208
+ }
209
+ ClusterModel2.Conformant = Conformant;
210
+ })(ClusterModel || (ClusterModel = {}));
143
211
  export {
144
212
  ClusterModel
145
213
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/models/ClusterModel.ts"],
4
- "mappings": "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",
5
- "names": []
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,UAAU,oBAAoB;AAEvC,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,iCAAiC;AAC1C,SAAS,YAAY,YAAY,gBAAgB;AACjD,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB,kBAAkB;AAC5C,SAAS,sBAAsB;AAK/B,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAEpB,MAAM,qBAAqB,WAAyE;AAAA,EAC9F,MAA0B,eAAe;AAAA,EAElD;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK,iBAAiB;AAAA,EACjC;AAAA,EAEA,IAAI,UAAmB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQ,YAA0C;AAClD,SAAK,WAAW,QAAQ,OAAO,UAAU;AAAA,EAC7C;AAAA,EACA,IAAI,mBAA4B;AAC5B,WAAO,IAAI,eAAe,EAAE,WAAW,MAAM,WAAW,OAAO,KAAK,KAAK;AAAA,EAC7E;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,KAAK,MAAM,UAAU,MAAM,EAAE,MAAM,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,EACtE;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,KAAK,MAAM,UAAU,MAAM,EAAE,MAAM,CAAC,WAAW,OAAO,EAAE,CAAC;AAAA,EACpE;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK,MAAM,UAAU,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,EAAE,CAAC;AAAA,EAClE;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,KAAK,MAAM,UAAU,MAAM,EAAE,MAAM,CAAC,WAAW,QAAQ,EAAE,CAAC;AAAA,EACrE;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,IAAI,aAAa,WAAW,IAAI;AAAA,EAC3C;AAAA,EAEA,IAAI,iBAA4D;AAC5D,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAEA,IAAI,eAAe,gBAAgE;AAC/E,QAAI,kBAAkB,KAAK,kBAAkB;AACzC,WAAK,cAAc,iBAAiB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,mBAAmB,KAAK,cAAc,OAAO;AAAA,EAC7D;AAAA,EAEA,IAAI,KAAK,MAA0B;AAC/B,QAAI,QAAQ,KAAK,kBAAkB;AAC/B,WAAK,cAAc,OAAO;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACV,WAAO,KAAK,MAAM,UAAU,MAAM;AAAA,MAC9B,MAAM,CAAC,WAAW,WAAW,WAAW,SAAS,WAAW,KAAK;AAAA,IACrE,CAAC;AAAA,EACL;AAAA,EAEA,IAAI,WAAW;AACX,QAAI,WAAW;AACf,UAAM,eAAe,KAAK,IAAI,gBAAgB,gBAAgB,EAAE;AAChE,QAAI,OAAO,cAAc,YAAY,UAAU;AAC3C,iBAAW,aAAa;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,KAAK,WAAW,YAAY,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,aAAa;AACb,WAAQ,KAAK,OAAO,WAAW,IAAI,CAAC,WAAW,SAAS,CAAC,KAAwB,IAAI,eAAe,UAAU;AAAA,EAClH;AAAA,EAEA,IAAI,eAA2B;AAC3B,WAAO,IAAI,WAAW,KAAK,SAAS,IAAI,aAAW,QAAQ,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,IAAI,oBAAgC;AAChC,UAAM,YAAY,CAAC;AACnB,eAAW,WAAW,KAAK,UAAU;AACjC,UAAI,QAAQ,SAAS;AACjB,kBAAU,QAAQ,IAAI,IAAI;AAAA,MAC9B;AAAA,IACJ;AACA,WAAO,IAAI,WAAW,SAAS;AAAA,EACnC;AAAA,EAEA,IAAI,kBAAkB,UAA6C;AAC/D,UAAM,aAAa,IAAI,WAAW,QAAQ;AAE1C,QAAI,aAAa,KAAK;AAEtB,QAAI,WAAW,WAAW,MAAM;AAC5B,mBAAa,WAAW,MAAM;AAC9B,WAAK,SAAS,KAAK,UAAU;AAAA,IACjC;AAEA,eAAW,WAAW,WAAW,UAAU;AACvC,YAAM,OAAO,QAAQ,SAAS,SAAS,QAAQ,KAAK;AACpD,UAAI,SAAS,UAAa,WAAW,IAAI,IAAI,GAAG;AAC5C,gBAAQ,UAAU;AAClB,mBAAW,OAAO,IAAI;AACtB;AAAA,MACJ;AAEA,UAAI,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC9B,mBAAW,OAAO,QAAQ,IAAI;AAC9B,gBAAQ,UAAU;AAClB;AAAA,MACJ;AAEA,cAAQ,UAAU;AAAA,IACtB;AAEA,QAAI,WAAW,MAAM;AACjB,YAAM,IAAI;AAAA,QACN;AAAA,QACA,6BAA6B,WAAW,OAAO,IAAI,MAAM,EAAE,IAAI,aAAa,OAAO,GAAG,UAAU,CAAC;AAAA,MACrG;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,IAAI,oBAAoB;AACpB,WAAO,SAAS;AAAA,EACpB;AAAA,EAEA,IAAI,kBAAkB;AAClB,WAAO,OAAO;AAAA,EAClB;AAAA,EAEA,YAAY,eAAwC,UAAiD;AACjG,UAAM,YAAY,GAAG,QAAQ;AAE7B,SAAK,WAAW,QAAQ,OAAO,WAAW,OAAO;AACjD,QAAI,EAAE,sBAAsB,QAAQ;AAChC,WAAK,OAAO,WAAW;AACvB,WAAK,iBAAiB,WAAW;AAAA,IACrC;AAAA,EACJ;AAAA,EAES,UAAU,gBAAgB,OAAO,OAAiC;AACvE,WAAO,MAAM,UAAU,eAAe;AAAA,MAClC,SAAS,KAAK,QAAQ,QAAQ;AAAA,MAC9B,GAAG;AAAA,IACP,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,MAAM,eAAe;AAChC;AAEA,aAAa,SAAS;AAAA,CAEf,CAAUA,kBAAV;AAAA,EAeI,MAAM,WAAW;AAAA,IACpB;AAAA,IAEA,YAAY,OAAqB;AAC7B,WAAK,SAAS;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,aAAa;AACb,aAAO,KAAK,OAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,QAC5C,MAAM,CAAC,WAAW,SAAS;AAAA,QAC3B,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,IAAI,aAAa;AACb,aAAO,KAAK,OAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,QAC5C,MAAM,CAAC,WAAW,WAAW,WAAW,KAAK;AAAA,QAC7C,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,IAAI,SAAS;AACT,aAAO,KAAK,OAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,QAC5C,MAAM,CAAC,WAAW,KAAK;AAAA,QACvB,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,WAAW;AACX,aAAO,KAAK,OAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,QAC5C,MAAM,CAAC,WAAW,OAAO;AAAA,QACzB,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,SAAS;AACT,aAAO,KAAK,OAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,QAC5C,MAAM,CAAC,WAAW,KAAK;AAAA,QACvB,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAAA,EACJ;AAjEO,EAAAA,cAAM;AAAA,GAfA;",
5
+ "names": ["ClusterModel"]
6
6
  }
@@ -8,6 +8,7 @@ import { ElementTag, FieldValue, Metatype } from "../common/index.js";
8
8
  import { ValueElement } from "../elements/index.js";
9
9
  import { Model } from "./Model.js";
10
10
  import type { PropertyModel } from "./PropertyModel.js";
11
+ import { ModelIndex } from "#logic/ModelIndex.js";
11
12
  import type { FieldModel } from "./FieldModel.js";
12
13
  /**
13
14
  * Each {@link ValueElement} type has a corresponding implementation that derives from this class.
@@ -30,7 +31,8 @@ export declare abstract class ValueModel<T extends ValueElement = ValueElement>
30
31
  get quality(): Quality;
31
32
  set quality(definition: Quality | Quality.Definition);
32
33
  get effectiveQuality(): Quality;
33
- get fields(): FieldModel[];
34
+ get fields(): ModelIndex<FieldModel>;
35
+ get conformant(): ValueModel.Conformant;
34
36
  /**
35
37
  * Metatype is only present on global types with specific semantic meaning. This model is significant because it
36
38
  * gives us information about how to manipulate the data. This accessor retrieves this model.
@@ -68,7 +70,7 @@ export declare abstract class ValueModel<T extends ValueElement = ValueElement>
68
70
  /**
69
71
  * All {@link FieldModel} children in the context of the model's containing scope.
70
72
  */
71
- get members(): PropertyModel[];
73
+ get members(): ModelIndex<PropertyModel>;
72
74
  /**
73
75
  * Collect constraints and conformance for this type and all base types.
74
76
  */
@@ -105,4 +107,18 @@ export declare abstract class ValueModel<T extends ValueElement = ValueElement>
105
107
  constructor(definition: Model.Definition<ValueModel<T>>, ...children: Model.ChildDefinition<FieldModel>[]);
106
108
  toElement(omitResources?: boolean, extra?: Record<string, unknown>): T;
107
109
  }
110
+ export declare namespace ValueModel {
111
+ class Conformant {
112
+ #private;
113
+ constructor(model: Model);
114
+ /**
115
+ * The model's conformant fields.
116
+ */
117
+ get fields(): ModelIndex<FieldModel>;
118
+ /**
119
+ * An alias for {@link fields} that offers compatibility with the same field for clusters.
120
+ */
121
+ get properties(): ModelIndex<FieldModel>;
122
+ }
123
+ }
108
124
  //# sourceMappingURL=ValueModel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ValueModel.d.ts","sourceRoot":"","sources":["../../../src/models/ValueModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ValueModel.d.ts","sourceRoot":"","sources":["../../../src/models/ValueModel.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,9 @@ class ValueModel extends Model {
56
56
  get fields() {
57
57
  return Scope(this).membersOf(this, { tags: [ElementTag.Field] });
58
58
  }
59
+ get conformant() {
60
+ return new ValueModel.Conformant(this);
61
+ }
59
62
  /**
60
63
  * Metatype is only present on global types with specific semantic meaning. This model is significant because it
61
64
  * gives us information about how to manipulate the data. This accessor retrieves this model.
@@ -243,6 +246,30 @@ class ValueModel extends Model {
243
246
  });
244
247
  }
245
248
  }
249
+ ((ValueModel2) => {
250
+ class Conformant {
251
+ #model;
252
+ constructor(model) {
253
+ this.#model = model;
254
+ }
255
+ /**
256
+ * The model's conformant fields.
257
+ */
258
+ get fields() {
259
+ return Scope(this.#model).membersOf(this.#model, {
260
+ tags: [ElementTag.Field],
261
+ conformance: "conformant"
262
+ });
263
+ }
264
+ /**
265
+ * An alias for {@link fields} that offers compatibility with the same field for clusters.
266
+ */
267
+ get properties() {
268
+ return this.fields;
269
+ }
270
+ }
271
+ ValueModel2.Conformant = Conformant;
272
+ })(ValueModel || (ValueModel = {}));
246
273
  export {
247
274
  ValueModel
248
275
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/models/ValueModel.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,aAAa;AACtB,SAAS,QAAgB,aAAa,YAAY,eAAe;AACjE,SAAS,YAAwB,gBAAgB;AAEjD,SAAS,sBAAsB;AAC/B,SAAS,aAAa;AAUf,MAAe,mBACV,MAEZ;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACS,SAAU;AAAA,EAEnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,aAAyB;AACzB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,WAAW,YAAgD;AAC3D,SAAK,cAAc,WAAW,OAAO,UAAU;AAAA,EACnD;AAAA,EACA,IAAI,sBAAkC;AAClC,WAAO,IAAI,eAAe,EAAE,eAAe,IAAI,KAAK,KAAK;AAAA,EAC7D;AAAA,EAEA,IAAI,cAA2B;AAC3B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,YAAY,YAAkD;AAC9D,SAAK,eAAe,YAAY,OAAO,UAAU;AAAA,EACrD;AAAA,EACA,IAAI,uBAAoC;AACpC,WAAO,IAAI,eAAe,EAAE,WAAW,MAAM,eAAe,WAAW,KAAK,KAAK;AAAA,EACrF;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,OAAO,YAAwC;AAC/C,SAAK,UAAU,OAAO,OAAO,UAAU;AAAA,EAC3C;AAAA,EACA,IAAI,kBAA0B;AAC1B,WAAO,IAAI,eAAe,EAAE,WAAW,MAAM,UAAU;AAAA,EAC3D;AAAA,EAEA,IAAI,UAAmB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQ,YAA0C;AAClD,SAAK,WAAW,QAAQ,OAAO,UAAU;AAAA,EAC7C;AAAA,EACA,IAAI,mBAA4B;AAC5B,WAAO,IAAI,eAAe,EAAE,WAAW,MAAM,WAAW,OAAO,KAAK,KAAK;AAAA,EAC7E;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,MAAM,IAAI,EAAE,UAAU,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,EAAE,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAmC;AACnC,WAAO,IAAI,eAAe,EAAE,aAAa,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBAAwC;AACxC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,UAAU;AACX;AAAA,IACJ;AAGA,QAAI,SAAS,aAAa,SAAS,MAAM;AACrC,aAAO,SAAS;AAAA,IACpB;AAGA,QAAI,SAAS,aAAa,SAAS,QAAQ;AACvC,YAAM,gBAAgB,SAAS,KAAK,QAAQ,OAAO,MAAM;AACzD,aAAO,SAAS,QAAQ,SAAS,KAAK,OAAK,EAAE,SAAS,aAAa;AAAA,IACvE;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,gBAAoC;AAC7C,UAAM,OAAO,MAAM;AACnB,QAAI,MAAM;AACN,aAAO;AAAA,IACX;AACA,WAAO,IAAI,eAAe,EAAE,YAAY,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAAoB;AACpB,UAAM,WAAW,KAAK;AACtB,QAAI,UAAU;AACV,aAAO,SAAS;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAgB;AAChB,WAAO,IAAI,eAAe,EAAE,kBAAkB,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACZ,WAAO,KAAK,OAAO,SAAS,CAAC,WAAW,KAAK,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,OAAO;AAChB,WAAO,MAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,kBAAkB;AAC3B,QAAI,KAAK,QAAQ,WAAW,OAAO;AAE/B,aAAO,CAAC,WAAW,OAAO,WAAW,UAAU,WAAW,SAAS;AAAA,IACvE;AACA,WAAO,CAAC,KAAK,KAAK,WAAW,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAA2B;AAC3B,WAAO,MAAM,IAAI,EAAE,UAAU,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAAoB;AACpB,UAAM,UAAU,MAAmB;AAEnC,QAAI,eAAe,EAAE,iBAAiB,MAAM,WAAS;AACjD,UAAI,iBAAiB,YAAY;AAC7B,YAAI,CAAC,MAAM,YAAY,WAAW,MAAM,YAAY,SAAS,YAAY,QAAQ,MAAM;AACnF,kBAAQ,KAAK,MAAM,WAAW;AAAA,QAClC;AACA,YAAI,CAAC,MAAM,WAAW,WAAW,CAAC,MAAM,WAAW,MAAM;AACrD,kBAAQ,KAAK,MAAM,UAAU;AAAA,QACjC;AACA,YAAI,MAAM,QAAQ,aAAa,OAAO;AAClC,kBAAQ,KAAK,MAAM,OAAO;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACf,WAAO,KAAK,qBAAqB,SAAS,YAAY,KAAK;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACf,WAAO,KAAK,qBAAqB,SAAS,YAAY,KAAK;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACX,WAAO,CAAC,CAAC,KAAK,iBAAiB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACZ,WAAO,KAAK,qBAAqB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,kBAAkB;AAClB,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,UAAU,EAAE,kBAAkB,aAAa;AAC5C;AAAA,IACJ;AAEA,QAAI,KAAK,QAAQ,KAAK,SAAS,OAAO,MAAM;AACxC,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,YAAY,WAAW,CAAC,KAAK,YAAY,OAAO,OAAO,WAAW,GAAG;AAC3E,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,QAAQ,WAAW,CAAC,KAAK,QAAQ,OAAO,OAAO,OAAO,GAAG;AAC/D,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,WAAW,WAAW,CAAC,KAAK,WAAW,OAAO,OAAO,UAAU,GAAG;AACxE,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,OAAO,WAAW,CAAC,KAAK,OAAO,OAAO,OAAO,MAAM,GAAG;AAC5D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAa;AACvB,WAAO,IAAI,eAAe,EAAE,kBAAkB,MAAM,GAAG;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA4D;AACxD,UAAM,OAAO,KAAK;AAClB,WAAO,IAAI,KAAK,KAAK,cAAmB;AAAA,EAC5C;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,EAAE,MAAM,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,YAAY,eAAgD,UAA+C;AACvG,UAAM,YAAY,GAAG,QAAQ;AAE7B,SAAK,WAAW,WAAW;AAC3B,SAAK,UAAU,WAAW;AAC1B,SAAK,cAAc,WAAW,OAAO,WAAW,UAAU;AAC1D,SAAK,eAAe,YAAY,OAAO,WAAW,WAAW;AAC7D,SAAK,UAAU,OAAO,OAAO,WAAW,MAAM;AAC9C,SAAK,WAAW,QAAQ,OAAO,WAAW,OAAO;AAEjD,UAAM,QAAQ,KAAK,MAAM,MAAM,gBAAgB;AAC/C,QAAI,OAAO;AACP,WAAK,OAAO;AACZ,WAAK,SAAS,KAAK,IAAI,MAAM,MAAM,MAAM,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,EAAE,CAAC,CAAe;AAAA,IAC7F;AAAA,EACJ;AAAA,EAES,UAAU,gBAAgB,OAAO,OAAiC;AACvE,WAAO,MAAM,UAAU,eAAe;AAAA,MAClC,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,YAAY,KAAK,YAAY,QAAQ;AAAA,MACrC,aAAa,KAAK,aAAa,QAAQ;AAAA,MACvC,QAAQ,KAAK,QAAQ,QAAQ;AAAA,MAC7B,SAAS,KAAK,SAAS,QAAQ;AAAA,MAC/B,GAAG;AAAA,IACP,CAAC;AAAA,EACL;AACJ;",
5
- "names": []
4
+ "mappings": "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",
5
+ "names": ["ValueModel"]
6
6
  }
@@ -91,7 +91,7 @@ function* lex(text, error, keywords) {
91
91
  function tokenizeDigits(base, valueOf) {
92
92
  let num = valueOf(current.value);
93
93
  if (num === void 0) {
94
- error("INVALID_NUMBER", `Expected digit following numeric suffix`);
94
+ error("INVALID_NUMBER", `Expected digit following numeric prefix`);
95
95
  return { type: "value", value: 0, startLine, startChar };
96
96
  }
97
97
  while (true) {
@@ -31,8 +31,8 @@ function TokenStream(iterator) {
31
31
  return "end of statement";
32
32
  case "word":
33
33
  return `word "${this.token.value}"`;
34
- case "number":
35
- return `number "${this.token.value}"`;
34
+ case "value":
35
+ return `value "${this.token.value}"`;
36
36
  default:
37
37
  if (this.token?.type.match(/[a-z]/i)) {
38
38
  return `keyword "${this.token?.type}"`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/parser/TokenStream.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,SAAS,YAA6B,UAAuC;AAChF,MAAI,OAAO;AAEX,WAAS,OAAO;AACZ,QAAI,MAAM;AACN,aAAO;AAAA,IACX;AACA,UAAM,IAAI,SAAS,KAAK;AACxB,QAAI,EAAE,MAAM;AACR,aAAO;AAAA,IACX;AACA,WAAO,EAAE;AAAA,EACb;AAEA,SAAO;AAAA,IACH,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IAEb,IAAI,OAAO;AACP,aAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,IAEA,OAAO;AACH,WAAK,QAAQ,KAAK;AAClB,WAAK,SAAS,KAAK;AAAA,IACvB;AAAA,IAEA,IAAI,cAAc;AACd,cAAQ,KAAK,OAAO,MAAM;AAAA,QACtB,KAAK;AACD,iBAAO;AAAA,QAEX,KAAK;AACD,iBAAO,SAAU,KAAK,MAAqC,KAAK;AAAA,QAEpE,KAAK;AACD,iBAAO,WAAY,KAAK,MAAuC,KAAK;AAAA,QAExE;AACI,cAAI,KAAK,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClC,mBAAO,YAAY,KAAK,OAAO,IAAI;AAAA,UACvC;AACA,iBAAO,aAAa,KAAK,OAAO,IAAI;AAAA,MAC5C;AAAA,IACJ;AAAA,EACJ;AACJ;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,SAAS,YAA6B,UAAuC;AAChF,MAAI,OAAO;AAEX,WAAS,OAAO;AACZ,QAAI,MAAM;AACN,aAAO;AAAA,IACX;AACA,UAAM,IAAI,SAAS,KAAK;AACxB,QAAI,EAAE,MAAM;AACR,aAAO;AAAA,IACX;AACA,WAAO,EAAE;AAAA,EACb;AAEA,SAAO;AAAA,IACH,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IAEb,IAAI,OAAO;AACP,aAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,IAEA,OAAO;AACH,WAAK,QAAQ,KAAK;AAClB,WAAK,SAAS,KAAK;AAAA,IACvB;AAAA,IAEA,IAAI,cAAc;AACd,cAAQ,KAAK,OAAO,MAAM;AAAA,QACtB,KAAK;AACD,iBAAO;AAAA,QAEX,KAAK;AACD,iBAAO,SAAU,KAAK,MAAqC,KAAK;AAAA,QAEpE,KAAK;AACD,iBAAO,UAAW,KAAK,MAAuC,KAAK;AAAA,QAEvE;AACI,cAAI,KAAK,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClC,mBAAO,YAAY,KAAK,OAAO,IAAI;AAAA,UACvC;AACA,iBAAO,aAAa,KAAK,OAAO,IAAI;AAAA,MAC5C;AAAA,IACJ;AAAA,EACJ;AACJ;",
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-20251004-92135c7df",
3
+ "version": "0.16.0-alpha.0-20251011-d8942d7d5",
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-20251004-92135c7df"
34
+ "@matter/general": "0.16.0-alpha.0-20251011-d8942d7d5"
35
35
  },
36
36
  "devDependencies": {
37
- "@matter/testing": "0.16.0-alpha.0-20251004-92135c7df",
38
- "@matter/tools": "0.16.0-alpha.0-20251004-92135c7df"
37
+ "@matter/testing": "0.16.0-alpha.0-20251011-d8942d7d5",
38
+ "@matter/tools": "0.16.0-alpha.0-20251011-d8942d7d5"
39
39
  },
40
40
  "files": [
41
41
  "dist/**/*",
@@ -4,13 +4,27 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { camelize } from "#general";
7
+ import { camelize, isObject } from "#general";
8
8
  import { Lexer } from "#parser/Lexer.js";
9
9
  import { BasicToken } from "#parser/Token.js";
10
10
  import { TokenStream } from "#parser/TokenStream.js";
11
11
  import { FieldValue } from "../common/index.js";
12
12
  import { Aspect } from "./Aspect.js";
13
13
 
14
+ namespace Functions {
15
+ export function minOf(args: unknown[]) {
16
+ return Math.min(...args.filter(arg => typeof arg === "number"));
17
+ }
18
+
19
+ export function maxOf(args: unknown[]) {
20
+ return Math.max(...args.filter(arg => typeof arg === "number"));
21
+ }
22
+ }
23
+
24
+ function isFunction(name: string): name is keyof typeof Functions {
25
+ return Object.hasOwn(Functions, name);
26
+ }
27
+
14
28
  /**
15
29
  * An operational view of constraints as defined by the Matter specification.
16
30
  *
@@ -124,30 +138,56 @@ export class Constraint extends Aspect<Constraint.Definition> implements Constra
124
138
  case FieldValue.reference:
125
139
  if (typeof value.name === "string") {
126
140
  value = FieldValue(nameResolver?.(camelize(value.name)));
141
+ if (isObject(value)) {
142
+ value = { type: "properties", properties: value as Record<string, FieldValue> };
143
+ }
127
144
  }
128
145
  break;
129
146
 
130
- case "+":
131
- {
132
- const lhs = valueOf(value.lhs);
133
- const rhs = valueOf(value.rhs);
134
- if (typeof lhs === "number" && typeof rhs === "number") {
135
- return lhs + rhs;
136
- }
147
+ case "+": {
148
+ const lhs = valueOf(value.lhs);
149
+ const rhs = valueOf(value.rhs);
150
+ if (typeof lhs === "number" && typeof rhs === "number") {
151
+ return lhs + rhs;
152
+ }
153
+ return undefined;
154
+ }
155
+
156
+ case "-": {
157
+ const lhs = valueOf(value.lhs);
158
+ const rhs = valueOf(value.rhs);
159
+ if (typeof lhs === "number" && typeof rhs === "number") {
160
+ return lhs - rhs;
161
+ }
162
+ return undefined;
163
+ }
164
+
165
+ case ".": {
166
+ const object = valueOf(value.lhs);
167
+ if (!isObject(object)) {
137
168
  return undefined;
138
169
  }
139
- break;
140
170
 
141
- case "-":
142
- {
143
- const lhs = valueOf(value.lhs);
144
- const rhs = valueOf(value.rhs);
145
- if (typeof lhs === "number" && typeof rhs === "number") {
146
- return lhs - rhs;
147
- }
171
+ // rhs may only legally be a name reference
172
+ const rhs = FieldValue.referenced(valueOf(value.rhs));
173
+ if (rhs === undefined) {
148
174
  return undefined;
149
175
  }
150
- break;
176
+
177
+ // Resolve name in context of object. We aren't using schema here but Object.hasOwn is
178
+ // sufficient
179
+ if (Object.hasOwn(object, rhs)) {
180
+ return (object as Record<string, FieldValue>)[rhs];
181
+ }
182
+
183
+ return undefined;
184
+ }
185
+
186
+ case "maxOf":
187
+ case "minOf": {
188
+ Functions[type](value.args.map(value => valueOf(value)));
189
+ return undefined;
190
+ }
151
191
  }
152
192
  }
153
193
 
@@ -267,17 +307,26 @@ export namespace Constraint {
267
307
  * Parsed binary operator.
268
308
  */
269
309
  export interface BinaryOperator {
270
- type: "+" | "-";
310
+ type: "+" | "-" | ".";
271
311
 
272
312
  lhs: Expression;
273
313
 
274
314
  rhs: Expression;
275
315
  }
276
316
 
317
+ /**
318
+ * Parsed function.
319
+ */
320
+ export interface Function {
321
+ type: "maxOf" | "minOf";
322
+
323
+ args: Expression[];
324
+ }
325
+
277
326
  /**
278
327
  * Parsed expression.
279
328
  */
280
- export type Expression = FieldValue | BinaryOperator;
329
+ export type Expression = FieldValue | BinaryOperator | Function;
281
330
 
282
331
  /**
283
332
  * These are all ways to describe a constraint.
@@ -307,7 +356,9 @@ namespace Serializer {
307
356
  switch (value.type) {
308
357
  case "+":
309
358
  case "-":
310
- const sum = `${serializeValue(value.lhs, true)} ${value.type} ${serializeValue(value.rhs, true)}`;
359
+ case ".":
360
+ const sep = value.type === "." ? "" : " ";
361
+ const sum = `${serializeValue(value.lhs, true)}${sep}${value.type}${sep}${serializeValue(value.rhs, true)}`;
311
362
  if (inExpr) {
312
363
  // Ideally only add parenthesis if precedence requires. But nested expressions are not used
313
364
  // anywhere as yet (and probably won't be) so don't try to be fancy, just correct
@@ -316,7 +367,11 @@ namespace Serializer {
316
367
  return sum;
317
368
 
318
369
  default:
319
- return FieldValue.serialize(value);
370
+ if (isFunction(value.type)) {
371
+ return `${value.type}(${(value as Constraint.Function).args.map(value => serializeValue(value)).join(", ")})`;
372
+ }
373
+
374
+ return FieldValue.serialize(value as FieldValue);
320
375
  }
321
376
  }
322
377
 
@@ -357,11 +412,15 @@ namespace Parser {
357
412
  const result = parseParts();
358
413
 
359
414
  if (tokens.token && tokens.token?.type !== ",") {
360
- constraint.error("UNEXPECTED_CONSTRAINT_TOKEN", `Unexpected ${tokens.description}`);
415
+ unexpected();
361
416
  }
362
417
 
363
418
  return result;
364
419
 
420
+ function unexpected() {
421
+ constraint.error("UNEXPECTED_CONSTRAINT_TOKEN", `Unexpected ${tokens.description}`);
422
+ }
423
+
365
424
  function parseParts(): Constraint.Ast {
366
425
  const parts = Array<Constraint.Ast>();
367
426
 
@@ -522,6 +581,7 @@ namespace Parser {
522
581
  switch (tokens.token?.type) {
523
582
  case "+":
524
583
  case "-":
584
+ case ".":
525
585
  const type = tokens.token.type;
526
586
  tokens.next();
527
587
  const rhs = parseValueExpression();
@@ -535,6 +595,45 @@ namespace Parser {
535
595
  lhs: value,
536
596
  rhs,
537
597
  };
598
+
599
+ case "(":
600
+ const functionName = FieldValue.referenced(value);
601
+ if (functionName === undefined) {
602
+ unexpected();
603
+ return;
604
+ }
605
+
606
+ tokens.next();
607
+ if (!isFunction(functionName)) {
608
+ constraint.error("UNKNOWN_FUNCTION", `Unknown function "${functionName}"`);
609
+ return;
610
+ }
611
+
612
+ const args = Array<Constraint.Expression>();
613
+ while ((tokens.token?.type as BasicToken.Operator) !== ")") {
614
+ const expr = parseValueExpression();
615
+ if (expr === undefined) {
616
+ return;
617
+ }
618
+ args.push(expr);
619
+ switch (tokens.token?.type as BasicToken.Operator) {
620
+ case ",":
621
+ tokens.next();
622
+ break;
623
+
624
+ case ")":
625
+ break;
626
+
627
+ default:
628
+ unexpected();
629
+ return;
630
+ }
631
+ }
632
+ tokens.next();
633
+ return {
634
+ type: functionName,
635
+ args,
636
+ };
538
637
  }
539
638
 
540
639
  return value;
@@ -149,7 +149,7 @@ export namespace FieldValue {
149
149
  */
150
150
  export type Properties = {
151
151
  type: properties;
152
- properties: { [name: string]: FieldValue };
152
+ properties: Record<string, FieldValue>;
153
153
  };
154
154
 
155
155
  /**
@@ -43,9 +43,8 @@ export namespace DatatypeElement {
43
43
  /**
44
44
  * Convert a TypeScript enum to Matter enum values.
45
45
  *
46
- * Matter enums include conformance and other metadata. They may also have
47
- * multiple definitions of the same value selectable by conformance. So
48
- * we can't use a TypeScript enum directly.
46
+ * Matter enums include conformance and other metadata. They may also have multiple definitions of the same value
47
+ * selectable by conformance. So we can't use a TypeScript enum directly.
49
48
  */
50
49
  export function ListValues(values: ValueMap): ListValues {
51
50
  const result = Array<FieldElement>();
@@ -67,16 +66,14 @@ export namespace DatatypeElement {
67
66
  }
68
67
 
69
68
  /**
70
- * We express enum values as IntElements as this gives us conformance
71
- * and other metadata.
69
+ * We express enum values as IntElements as this gives us conformance and other metadata.
72
70
  */
73
71
  export type ListValues = FieldElement[];
74
72
 
75
73
  /**
76
- * Per the Matter specification, enums are named integers. The following
77
- * allows TypeScript enums to be supplied for translation into Matter
78
- * enums. To do so, we must accept both numeric and string values. For
79
- * generating the Matter enum we ignore the string keys.
74
+ * Per the Matter specification, enums are named integers. The following allows TypeScript enums to be supplied for
75
+ * translation into Matter enums. To do so, we must accept both numeric and string values. For generating the
76
+ * Matter enum we ignore the string keys.
80
77
  */
81
78
  export type ValueMap = { [name: string]: number | string };
82
79
  }