@matter/model 0.13.0-alpha.0-20250403-1e0d4620e → 0.13.0-alpha.0-20250405-5f5f0caa

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.
@@ -32,14 +32,14 @@ var import_FeatureBitmap = require("./FeatureBitmap.js");
32
32
  function IllegalFeatureCombinations(cluster) {
33
33
  const illegal = [];
34
34
  const choices = {};
35
- for (const f of cluster.features) {
36
- addFeatureNode(f, f.conformance.ast, illegal, choices);
37
- }
38
35
  function add(flags) {
39
36
  if (!illegal.some((e) => (0, import_general.isDeepEqual)(e, flags))) {
40
37
  illegal.push(flags);
41
38
  }
42
39
  }
40
+ for (const f of cluster.features) {
41
+ addFeatureNode(f, f.conformance.ast, add, choices);
42
+ }
43
43
  let requiresFeatures = false;
44
44
  for (const choice of Object.values(choices)) {
45
45
  if (choice.exclusive) {
@@ -60,7 +60,7 @@ function IllegalFeatureCombinations(cluster) {
60
60
  }
61
61
  return { illegal, requiresFeatures };
62
62
  }
63
- function addFeatureNode(feature, node, illegal, choices) {
63
+ function addFeatureNode(feature, node, add, choices) {
64
64
  switch (node.type) {
65
65
  case import_aspects.Conformance.Special.Desc:
66
66
  case import_aspects.Conformance.Special.Empty:
@@ -68,14 +68,50 @@ function addFeatureNode(feature, node, illegal, choices) {
68
68
  case import_aspects.Conformance.Flag.Provisional:
69
69
  break;
70
70
  case import_aspects.Conformance.Flag.Mandatory:
71
- illegal.push({ [feature.name]: false });
71
+ add({ [feature.name]: false });
72
72
  break;
73
73
  case import_aspects.Conformance.Flag.Deprecated:
74
74
  case import_aspects.Conformance.Flag.Disallowed:
75
- illegal.push({ [feature.name]: true });
75
+ add({ [feature.name]: true });
76
76
  break;
77
77
  case import_aspects.Conformance.Special.Group:
78
- node.param.forEach((ast) => addFeatureNode(feature, ast, illegal, choices));
78
+ const rules = node.param;
79
+ const entryExclusions = Array();
80
+ let optionalIfIndex;
81
+ for (let i = 0; i < rules.length; i++) {
82
+ if (rules[i].type === import_aspects.Conformance.Special.OptionalIf) {
83
+ if (optionalIfIndex !== void 0) {
84
+ unsupported();
85
+ }
86
+ optionalIfIndex = i;
87
+ }
88
+ const thisEntryExclusions = [];
89
+ entryExclusions.push(thisEntryExclusions);
90
+ addFeatureNode(feature, rules[i], (flags) => thisEntryExclusions.push(flags), choices);
91
+ }
92
+ if (optionalIfIndex !== void 0) {
93
+ const negations = {};
94
+ for (let i = 0; i < rules.length; i++) {
95
+ if (i === optionalIfIndex) {
96
+ continue;
97
+ }
98
+ for (const entry of entryExclusions[i]) {
99
+ for (const name in entry) {
100
+ if (negations[name] !== void 0) {
101
+ unsupported();
102
+ }
103
+ negations[name] = !entry[name];
104
+ }
105
+ }
106
+ }
107
+ entryExclusions[optionalIfIndex] = entryExclusions[optionalIfIndex].map((exclusions) => ({
108
+ ...negations,
109
+ ...exclusions
110
+ }));
111
+ }
112
+ for (const ee of entryExclusions) {
113
+ ee.forEach(add);
114
+ }
79
115
  break;
80
116
  case import_aspects.Conformance.Special.Choice:
81
117
  if (node.param.num > 1) {
@@ -92,7 +128,7 @@ function addFeatureNode(feature, node, illegal, choices) {
92
128
  }
93
129
  break;
94
130
  case import_aspects.Conformance.Special.Name:
95
- illegal.push({ [node.param]: true, [feature.name]: false });
131
+ add({ [node.param]: true, [feature.name]: false });
96
132
  break;
97
133
  case import_aspects.Conformance.Special.OptionalIf:
98
134
  switch (node.param.type) {
@@ -103,11 +139,11 @@ function addFeatureNode(feature, node, illegal, choices) {
103
139
  case import_aspects.Conformance.OR: {
104
140
  const flags = (0, import_FeatureBitmap.FeatureBitmap)({ [feature.name]: true });
105
141
  addExclusivityRequirement(flags, node.param);
106
- illegal.push(flags);
142
+ add(flags);
107
143
  break;
108
144
  }
109
145
  case import_aspects.Conformance.Operator.NOT: {
110
- illegal.push({ [feature.name]: true, [extractName(node.param.param)]: true });
146
+ add({ [feature.name]: true, [extractName(node.param.param)]: true });
111
147
  break;
112
148
  }
113
149
  default:
@@ -118,7 +154,7 @@ function addFeatureNode(feature, node, illegal, choices) {
118
154
  const lhsFeatures = extractDisjunctFeatures(node.param.lhs);
119
155
  const rhsFeature = extractFeatureFlag(node.param.rhs);
120
156
  for (const lhsFeature in lhsFeatures) {
121
- illegal.push({
157
+ add({
122
158
  feature: false,
123
159
  [lhsFeature]: lhsFeatures[lhsFeature],
124
160
  ...rhsFeature
@@ -128,7 +164,7 @@ function addFeatureNode(feature, node, illegal, choices) {
128
164
  }
129
165
  case import_aspects.Conformance.Operator.OR: {
130
166
  const features = extractDisjunctFeatures(node);
131
- illegal.push(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
167
+ add(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
132
168
  break;
133
169
  }
134
170
  default:
@@ -167,7 +203,7 @@ function addFeatureNode(feature, node, illegal, choices) {
167
203
  function addDependencyRequirement(feature2, node2) {
168
204
  switch (node2.type) {
169
205
  case import_aspects.Conformance.Special.Name:
170
- illegal.push({ [feature2]: true, [node2.param]: false });
206
+ add({ [feature2]: true, [node2.param]: false });
171
207
  break;
172
208
  case import_aspects.Conformance.AND:
173
209
  addDependencyRequirement(feature2, node2.param.lhs);
@@ -175,12 +211,12 @@ function addFeatureNode(feature, node, illegal, choices) {
175
211
  break;
176
212
  case import_aspects.Conformance.OR:
177
213
  if (node2.param.lhs.type === import_aspects.Conformance.Special.Name && node2.param.rhs.type === import_aspects.Conformance.Special.Name) {
178
- illegal.push({ [feature2]: true, [node2.param.lhs.param]: false, [node2.param.rhs.param]: false });
214
+ add({ [feature2]: true, [node2.param.lhs.param]: false, [node2.param.rhs.param]: false });
179
215
  }
180
216
  break;
181
217
  case import_aspects.Conformance.Operator.NOT:
182
218
  if (node2.param.type === import_aspects.Conformance.Special.Name) {
183
- illegal.push({ [feature2]: true, [node2.param.param]: true });
219
+ add({ [feature2]: true, [node2.param.param]: true });
184
220
  }
185
221
  break;
186
222
  default:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/logic/cluster-variance/IllegalFeatureCombinations.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["node", "feature"]
6
6
  }
@@ -9,14 +9,14 @@ import { FeatureBitmap } from "./FeatureBitmap.js";
9
9
  function IllegalFeatureCombinations(cluster) {
10
10
  const illegal = [];
11
11
  const choices = {};
12
- for (const f of cluster.features) {
13
- addFeatureNode(f, f.conformance.ast, illegal, choices);
14
- }
15
12
  function add(flags) {
16
13
  if (!illegal.some((e) => isDeepEqual(e, flags))) {
17
14
  illegal.push(flags);
18
15
  }
19
16
  }
17
+ for (const f of cluster.features) {
18
+ addFeatureNode(f, f.conformance.ast, add, choices);
19
+ }
20
20
  let requiresFeatures = false;
21
21
  for (const choice of Object.values(choices)) {
22
22
  if (choice.exclusive) {
@@ -37,7 +37,7 @@ function IllegalFeatureCombinations(cluster) {
37
37
  }
38
38
  return { illegal, requiresFeatures };
39
39
  }
40
- function addFeatureNode(feature, node, illegal, choices) {
40
+ function addFeatureNode(feature, node, add, choices) {
41
41
  switch (node.type) {
42
42
  case Conformance.Special.Desc:
43
43
  case Conformance.Special.Empty:
@@ -45,14 +45,50 @@ function addFeatureNode(feature, node, illegal, choices) {
45
45
  case Conformance.Flag.Provisional:
46
46
  break;
47
47
  case Conformance.Flag.Mandatory:
48
- illegal.push({ [feature.name]: false });
48
+ add({ [feature.name]: false });
49
49
  break;
50
50
  case Conformance.Flag.Deprecated:
51
51
  case Conformance.Flag.Disallowed:
52
- illegal.push({ [feature.name]: true });
52
+ add({ [feature.name]: true });
53
53
  break;
54
54
  case Conformance.Special.Group:
55
- node.param.forEach((ast) => addFeatureNode(feature, ast, illegal, choices));
55
+ const rules = node.param;
56
+ const entryExclusions = Array();
57
+ let optionalIfIndex;
58
+ for (let i = 0; i < rules.length; i++) {
59
+ if (rules[i].type === Conformance.Special.OptionalIf) {
60
+ if (optionalIfIndex !== void 0) {
61
+ unsupported();
62
+ }
63
+ optionalIfIndex = i;
64
+ }
65
+ const thisEntryExclusions = [];
66
+ entryExclusions.push(thisEntryExclusions);
67
+ addFeatureNode(feature, rules[i], (flags) => thisEntryExclusions.push(flags), choices);
68
+ }
69
+ if (optionalIfIndex !== void 0) {
70
+ const negations = {};
71
+ for (let i = 0; i < rules.length; i++) {
72
+ if (i === optionalIfIndex) {
73
+ continue;
74
+ }
75
+ for (const entry of entryExclusions[i]) {
76
+ for (const name in entry) {
77
+ if (negations[name] !== void 0) {
78
+ unsupported();
79
+ }
80
+ negations[name] = !entry[name];
81
+ }
82
+ }
83
+ }
84
+ entryExclusions[optionalIfIndex] = entryExclusions[optionalIfIndex].map((exclusions) => ({
85
+ ...negations,
86
+ ...exclusions
87
+ }));
88
+ }
89
+ for (const ee of entryExclusions) {
90
+ ee.forEach(add);
91
+ }
56
92
  break;
57
93
  case Conformance.Special.Choice:
58
94
  if (node.param.num > 1) {
@@ -69,7 +105,7 @@ function addFeatureNode(feature, node, illegal, choices) {
69
105
  }
70
106
  break;
71
107
  case Conformance.Special.Name:
72
- illegal.push({ [node.param]: true, [feature.name]: false });
108
+ add({ [node.param]: true, [feature.name]: false });
73
109
  break;
74
110
  case Conformance.Special.OptionalIf:
75
111
  switch (node.param.type) {
@@ -80,11 +116,11 @@ function addFeatureNode(feature, node, illegal, choices) {
80
116
  case Conformance.OR: {
81
117
  const flags = FeatureBitmap({ [feature.name]: true });
82
118
  addExclusivityRequirement(flags, node.param);
83
- illegal.push(flags);
119
+ add(flags);
84
120
  break;
85
121
  }
86
122
  case Conformance.Operator.NOT: {
87
- illegal.push({ [feature.name]: true, [extractName(node.param.param)]: true });
123
+ add({ [feature.name]: true, [extractName(node.param.param)]: true });
88
124
  break;
89
125
  }
90
126
  default:
@@ -95,7 +131,7 @@ function addFeatureNode(feature, node, illegal, choices) {
95
131
  const lhsFeatures = extractDisjunctFeatures(node.param.lhs);
96
132
  const rhsFeature = extractFeatureFlag(node.param.rhs);
97
133
  for (const lhsFeature in lhsFeatures) {
98
- illegal.push({
134
+ add({
99
135
  feature: false,
100
136
  [lhsFeature]: lhsFeatures[lhsFeature],
101
137
  ...rhsFeature
@@ -105,7 +141,7 @@ function addFeatureNode(feature, node, illegal, choices) {
105
141
  }
106
142
  case Conformance.Operator.OR: {
107
143
  const features = extractDisjunctFeatures(node);
108
- illegal.push(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
144
+ add(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
109
145
  break;
110
146
  }
111
147
  default:
@@ -144,7 +180,7 @@ function addFeatureNode(feature, node, illegal, choices) {
144
180
  function addDependencyRequirement(feature2, node2) {
145
181
  switch (node2.type) {
146
182
  case Conformance.Special.Name:
147
- illegal.push({ [feature2]: true, [node2.param]: false });
183
+ add({ [feature2]: true, [node2.param]: false });
148
184
  break;
149
185
  case Conformance.AND:
150
186
  addDependencyRequirement(feature2, node2.param.lhs);
@@ -152,12 +188,12 @@ function addFeatureNode(feature, node, illegal, choices) {
152
188
  break;
153
189
  case Conformance.OR:
154
190
  if (node2.param.lhs.type === Conformance.Special.Name && node2.param.rhs.type === Conformance.Special.Name) {
155
- illegal.push({ [feature2]: true, [node2.param.lhs.param]: false, [node2.param.rhs.param]: false });
191
+ add({ [feature2]: true, [node2.param.lhs.param]: false, [node2.param.rhs.param]: false });
156
192
  }
157
193
  break;
158
194
  case Conformance.Operator.NOT:
159
195
  if (node2.param.type === Conformance.Special.Name) {
160
- illegal.push({ [feature2]: true, [node2.param.param]: true });
196
+ add({ [feature2]: true, [node2.param.param]: true });
161
197
  }
162
198
  break;
163
199
  default:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/logic/cluster-variance/IllegalFeatureCombinations.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["node", "feature"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/model",
3
- "version": "0.13.0-alpha.0-20250403-1e0d4620e",
3
+ "version": "0.13.0-alpha.0-20250405-5f5f0caa",
4
4
  "description": "Matter data model",
5
5
  "keywords": [
6
6
  "iot",
@@ -33,12 +33,12 @@
33
33
  "embed-examples": "embedme **/README.md"
34
34
  },
35
35
  "dependencies": {
36
- "@matter/general": "0.13.0-alpha.0-20250403-1e0d4620e",
36
+ "@matter/general": "0.13.0-alpha.0-20250405-5f5f0caa",
37
37
  "@noble/curves": "^1.8.1"
38
38
  },
39
39
  "devDependencies": {
40
- "@matter/testing": "0.13.0-alpha.0-20250403-1e0d4620e",
41
- "@matter/tools": "0.13.0-alpha.0-20250403-1e0d4620e"
40
+ "@matter/testing": "0.13.0-alpha.0-20250405-5f5f0caa",
41
+ "@matter/tools": "0.13.0-alpha.0-20250405-5f5f0caa"
42
42
  },
43
43
  "files": [
44
44
  "dist/**/*",
@@ -31,16 +31,16 @@ export function IllegalFeatureCombinations(cluster: ClusterModel) {
31
31
  const illegal = [] as IllegalFeatureCombinations;
32
32
  const choices = {} as Choices;
33
33
 
34
- for (const f of cluster.features) {
35
- addFeatureNode(f, f.conformance.ast, illegal, choices);
36
- }
37
-
38
34
  function add(flags: FeatureBitmap) {
39
35
  if (!illegal.some(e => isDeepEqual(e, flags))) {
40
36
  illegal.push(flags);
41
37
  }
42
38
  }
43
39
 
40
+ for (const f of cluster.features) {
41
+ addFeatureNode(f, f.conformance.ast, add, choices);
42
+ }
43
+
44
44
  let requiresFeatures = false;
45
45
 
46
46
  for (const choice of Object.values(choices)) {
@@ -70,7 +70,7 @@ export function IllegalFeatureCombinations(cluster: ClusterModel) {
70
70
  function addFeatureNode(
71
71
  feature: FieldModel,
72
72
  node: Conformance.Ast,
73
- illegal: IllegalFeatureCombinations,
73
+ add: (flags: FeatureBitmap) => void,
74
74
  choices: Choices,
75
75
  ) {
76
76
  switch (node.type) {
@@ -81,16 +81,71 @@ function addFeatureNode(
81
81
  break;
82
82
 
83
83
  case Conformance.Flag.Mandatory:
84
- illegal.push({ [feature.name]: false });
84
+ add({ [feature.name]: false });
85
85
  break;
86
86
 
87
87
  case Conformance.Flag.Deprecated:
88
88
  case Conformance.Flag.Disallowed:
89
- illegal.push({ [feature.name]: true });
89
+ add({ [feature.name]: true });
90
90
  break;
91
91
 
92
92
  case Conformance.Special.Group:
93
- node.param.forEach(ast => addFeatureNode(feature, ast, illegal, choices));
93
+ const rules = node.param;
94
+
95
+ // Temporary storage for exclusions used in algorithm below
96
+ const entryExclusions = Array<IllegalFeatureCombinations>();
97
+
98
+ // Location of an "optional if" segment, which will require special handling
99
+ let optionalIfIndex: number | undefined;
100
+
101
+ // Collect exclusions for each entry. If there is an "optional if" entry, we need to ensure that it only
102
+ // applies if the other entries *don't* apply
103
+ for (let i = 0; i < rules.length; i++) {
104
+ if (rules[i].type === Conformance.Special.OptionalIf) {
105
+ if (optionalIfIndex !== undefined) {
106
+ // Currently we only support one "optional if" which is likely all we'll ever need
107
+ unsupported();
108
+ }
109
+ optionalIfIndex = i;
110
+ }
111
+
112
+ const thisEntryExclusions: IllegalFeatureCombinations = [];
113
+ entryExclusions.push(thisEntryExclusions);
114
+ addFeatureNode(feature, rules[i], flags => thisEntryExclusions.push(flags), choices);
115
+ }
116
+
117
+ // Now if there's an "optional if", add flags that will negate the rule if other rules make the element
118
+ // mandatory
119
+ if (optionalIfIndex !== undefined) {
120
+ const negations: FeatureBitmap = {};
121
+
122
+ for (let i = 0; i < rules.length; i++) {
123
+ if (i === optionalIfIndex) {
124
+ continue;
125
+ }
126
+
127
+ for (const entry of entryExclusions[i]) {
128
+ for (const name in entry) {
129
+ if (negations[name] !== undefined) {
130
+ // Hopefully will never need to support subrules that address the same features
131
+ unsupported();
132
+ }
133
+ negations[name] = !entry[name];
134
+ }
135
+ }
136
+ }
137
+
138
+ entryExclusions[optionalIfIndex] = entryExclusions[optionalIfIndex].map(exclusions => ({
139
+ ...negations,
140
+ ...exclusions,
141
+ }));
142
+ }
143
+
144
+ // Now add the exclusions
145
+ for (const ee of entryExclusions) {
146
+ ee.forEach(add);
147
+ }
148
+
94
149
  break;
95
150
 
96
151
  case Conformance.Special.Choice:
@@ -109,7 +164,7 @@ function addFeatureNode(
109
164
  break;
110
165
 
111
166
  case Conformance.Special.Name:
112
- illegal.push({ [node.param]: true, [feature.name]: false });
167
+ add({ [node.param]: true, [feature.name]: false });
113
168
  break;
114
169
 
115
170
  case Conformance.Special.OptionalIf:
@@ -122,12 +177,12 @@ function addFeatureNode(
122
177
  case Conformance.OR: {
123
178
  const flags = FeatureBitmap({ [feature.name]: true });
124
179
  addExclusivityRequirement(flags, node.param);
125
- illegal.push(flags);
180
+ add(flags);
126
181
  break;
127
182
  }
128
183
 
129
184
  case Conformance.Operator.NOT: {
130
- illegal.push({ [feature.name]: true, [extractName(node.param.param)]: true });
185
+ add({ [feature.name]: true, [extractName(node.param.param)]: true });
131
186
  break;
132
187
  }
133
188
 
@@ -142,7 +197,7 @@ function addFeatureNode(
142
197
  const rhsFeature = extractFeatureFlag(node.param.rhs);
143
198
 
144
199
  for (const lhsFeature in lhsFeatures) {
145
- illegal.push({
200
+ add({
146
201
  feature: false,
147
202
  [lhsFeature]: lhsFeatures[lhsFeature],
148
203
  ...rhsFeature,
@@ -153,7 +208,7 @@ function addFeatureNode(
153
208
 
154
209
  case Conformance.Operator.OR: {
155
210
  const features = extractDisjunctFeatures(node);
156
- illegal.push(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
211
+ add(Object.fromEntries(Object.entries(features).map((k, v) => [k, !v])));
157
212
  break;
158
213
  }
159
214
 
@@ -213,7 +268,7 @@ function addFeatureNode(
213
268
  function addDependencyRequirement(feature: string, node: Conformance.Ast) {
214
269
  switch (node.type) {
215
270
  case Conformance.Special.Name:
216
- illegal.push({ [feature]: true, [node.param]: false });
271
+ add({ [feature]: true, [node.param]: false });
217
272
  break;
218
273
 
219
274
  case Conformance.AND:
@@ -226,13 +281,13 @@ function addFeatureNode(
226
281
  node.param.lhs.type === Conformance.Special.Name &&
227
282
  node.param.rhs.type === Conformance.Special.Name
228
283
  ) {
229
- illegal.push({ [feature]: true, [node.param.lhs.param]: false, [node.param.rhs.param]: false });
284
+ add({ [feature]: true, [node.param.lhs.param]: false, [node.param.rhs.param]: false });
230
285
  }
231
286
  break;
232
287
 
233
288
  case Conformance.Operator.NOT:
234
289
  if (node.param.type === Conformance.Special.Name) {
235
- illegal.push({ [feature]: true, [node.param.param]: true });
290
+ add({ [feature]: true, [node.param.param]: true });
236
291
  }
237
292
  break;
238
293