@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.
- package/dist/cjs/logic/cluster-variance/IllegalFeatureCombinations.js +51 -15
- package/dist/cjs/logic/cluster-variance/IllegalFeatureCombinations.js.map +1 -1
- package/dist/esm/logic/cluster-variance/IllegalFeatureCombinations.js +51 -15
- package/dist/esm/logic/cluster-variance/IllegalFeatureCombinations.js.map +1 -1
- package/package.json +4 -4
- package/src/logic/cluster-variance/IllegalFeatureCombinations.ts +71 -16
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
75
|
+
add({ [feature.name]: true });
|
|
76
76
|
break;
|
|
77
77
|
case import_aspects.Conformance.Special.Group:
|
|
78
|
-
node.param
|
|
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
|
-
|
|
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
|
-
|
|
142
|
+
add(flags);
|
|
107
143
|
break;
|
|
108
144
|
}
|
|
109
145
|
case import_aspects.Conformance.Operator.NOT: {
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAA2C;AAC3C,qBAA4B;AAE5B,2BAA8B;AAT9B;AAAA;AAAA;AAAA;AAAA;AA6BO,SAAS,2BAA2B,SAAuB;AAC9D,QAAM,UAAU,CAAC;AACjB,QAAM,UAAU,CAAC;AAEjB,
|
|
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,
|
|
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
|
-
|
|
48
|
+
add({ [feature.name]: false });
|
|
49
49
|
break;
|
|
50
50
|
case Conformance.Flag.Deprecated:
|
|
51
51
|
case Conformance.Flag.Disallowed:
|
|
52
|
-
|
|
52
|
+
add({ [feature.name]: true });
|
|
53
53
|
break;
|
|
54
54
|
case Conformance.Special.Group:
|
|
55
|
-
node.param
|
|
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
|
-
|
|
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
|
-
|
|
119
|
+
add(flags);
|
|
84
120
|
break;
|
|
85
121
|
}
|
|
86
122
|
case Conformance.Operator.NOT: {
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,eAAe,mBAAmB;AAC3C,SAAS,mBAAmB;AAE5B,SAAS,qBAAqB;AAoBvB,SAAS,2BAA2B,SAAuB;AAC9D,QAAM,UAAU,CAAC;AACjB,QAAM,UAAU,CAAC;AAEjB,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,eAAe,mBAAmB;AAC3C,SAAS,mBAAmB;AAE5B,SAAS,qBAAqB;AAoBvB,SAAS,2BAA2B,SAAuB;AAC9D,QAAM,UAAU,CAAC;AACjB,QAAM,UAAU,CAAC;AAEjB,WAAS,IAAI,OAAsB;AAC/B,QAAI,CAAC,QAAQ,KAAK,OAAK,YAAY,GAAG,KAAK,CAAC,GAAG;AAC3C,cAAQ,KAAK,KAAK;AAAA,IACtB;AAAA,EACJ;AAEA,aAAW,KAAK,QAAQ,UAAU;AAC9B,mBAAe,GAAG,EAAE,YAAY,KAAK,KAAK,OAAO;AAAA,EACrD;AAEA,MAAI,mBAAmB;AAEvB,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAEzC,QAAI,OAAO,WAAW;AAClB,iBAAW,MAAM,OAAO,UAAU;AAC9B,mBAAW,MAAM,OAAO,UAAU;AAC9B,cAAI,OAAO,IAAI;AACX,gBAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC;AAAA,UAClC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,QAAQ,cAAc;AAC5B,eAAW,KAAK,OAAO,UAAU;AAC7B,YAAM,CAAC,IAAI;AAAA,IACf;AACA,QAAI,KAAK;AACT,uBAAmB;AAAA,EACvB;AAEA,SAAO,EAAE,SAAS,iBAAiB;AACvC;AAEA,SAAS,eACL,SACA,MACA,KACA,SACF;AACE,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,YAAY,KAAK;AAAA,IACtB,KAAK,YAAY,KAAK;AAClB;AAAA,IAEJ,KAAK,YAAY,KAAK;AAClB,UAAI,EAAE,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC;AAC7B;AAAA,IAEJ,KAAK,YAAY,KAAK;AAAA,IACtB,KAAK,YAAY,KAAK;AAClB,UAAI,EAAE,CAAC,QAAQ,IAAI,GAAG,KAAK,CAAC;AAC5B;AAAA,IAEJ,KAAK,YAAY,QAAQ;AACrB,YAAM,QAAQ,KAAK;AAGnB,YAAM,kBAAkB,MAAkC;AAG1D,UAAI;AAIJ,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAI,MAAM,CAAC,EAAE,SAAS,YAAY,QAAQ,YAAY;AAClD,cAAI,oBAAoB,QAAW;AAE/B,wBAAY;AAAA,UAChB;AACA,4BAAkB;AAAA,QACtB;AAEA,cAAM,sBAAkD,CAAC;AACzD,wBAAgB,KAAK,mBAAmB;AACxC,uBAAe,SAAS,MAAM,CAAC,GAAG,WAAS,oBAAoB,KAAK,KAAK,GAAG,OAAO;AAAA,MACvF;AAIA,UAAI,oBAAoB,QAAW;AAC/B,cAAM,YAA2B,CAAC;AAElC,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,cAAI,MAAM,iBAAiB;AACvB;AAAA,UACJ;AAEA,qBAAW,SAAS,gBAAgB,CAAC,GAAG;AACpC,uBAAW,QAAQ,OAAO;AACtB,kBAAI,UAAU,IAAI,MAAM,QAAW;AAE/B,4BAAY;AAAA,cAChB;AACA,wBAAU,IAAI,IAAI,CAAC,MAAM,IAAI;AAAA,YACjC;AAAA,UACJ;AAAA,QACJ;AAEA,wBAAgB,eAAe,IAAI,gBAAgB,eAAe,EAAE,IAAI,iBAAe;AAAA,UACnF,GAAG;AAAA,UACH,GAAG;AAAA,QACP,EAAE;AAAA,MACN;AAGA,iBAAW,MAAM,iBAAiB;AAC9B,WAAG,QAAQ,GAAG;AAAA,MAClB;AAEA;AAAA,IAEJ,KAAK,YAAY,QAAQ;AACrB,UAAI,KAAK,MAAM,MAAM,GAAG;AACpB,oBAAY;AAAA,MAChB;AACA,YAAM,SAAS,QAAQ,KAAK,MAAM,IAAI;AACtC,UAAI,QAAQ;AACR,eAAO,SAAS,KAAK,QAAQ,IAAI;AAAA,MACrC,OAAO;AACH,gBAAQ,KAAK,MAAM,IAAI,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,UAClD,WAAW,CAAC,KAAK,MAAM;AAAA,UACvB,UAAU,CAAC,QAAQ,IAAI;AAAA,QAC3B;AAAA,MACJ;AACA;AAAA,IAEJ,KAAK,YAAY,QAAQ;AACrB,UAAI,EAAE,CAAC,KAAK,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC;AACjD;AAAA,IAEJ,KAAK,YAAY,QAAQ;AACrB,cAAQ,KAAK,MAAM,MAAM;AAAA,QACrB,KAAK,YAAY;AAAA,QACjB,KAAK,YAAY,QAAQ;AACrB,mCAAyB,QAAQ,MAAM,KAAK,KAAK;AACjD;AAAA,QAEJ,KAAK,YAAY,IAAI;AACjB,gBAAM,QAAQ,cAAc,EAAE,CAAC,QAAQ,IAAI,GAAG,KAAK,CAAC;AACpD,oCAA0B,OAAO,KAAK,KAAK;AAC3C,cAAI,KAAK;AACT;AAAA,QACJ;AAAA,QAEA,KAAK,YAAY,SAAS,KAAK;AAC3B,cAAI,EAAE,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC,YAAY,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC;AACnE;AAAA,QACJ;AAAA,QAEA;AACI,sBAAY;AAAA,MACpB;AACA;AAAA,IAEJ,KAAK,YAAY,SAAS,KAAK;AAE3B,YAAM,cAAc,wBAAwB,KAAK,MAAM,GAAG;AAC1D,YAAM,aAAa,mBAAmB,KAAK,MAAM,GAAG;AAEpD,iBAAW,cAAc,aAAa;AAClC,YAAI;AAAA,UACA,SAAS;AAAA,UACT,CAAC,UAAU,GAAG,YAAY,UAAU;AAAA,UACpC,GAAG;AAAA,QACP,CAAC;AAAA,MACL;AACA;AAAA,IACJ;AAAA,IAEA,KAAK,YAAY,SAAS,IAAI;AAC1B,YAAM,WAAW,wBAAwB,IAAI;AAC7C,UAAI,OAAO,YAAY,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE;AAAA,IACJ;AAAA,IAEA;AACI,kBAAY;AAAA,EACpB;AAEA,WAAS,cAAqB;AAC1B,UAAM,IAAI,cAAc,gCAAgC,QAAQ,IAAI,iBAAiB,QAAQ,WAAW,GAAG;AAAA,EAC/G;AAKA,WAAS,YAAYA,OAA+B;AAChD,QAAIA,MAAK,SAAS,YAAY,QAAQ,MAAM;AACxC,aAAOA,MAAK;AAAA,IAChB;AACA,gBAAY;AAAA,EAChB;AAKA,WAAS,mBAAmBA,OAAuB;AAC/C,YAAQA,MAAK,MAAM;AAAA,MACf,KAAK,YAAY,QAAQ;AACrB,eAAO,EAAE,CAACA,MAAK,KAAK,GAAG,KAAK;AAAA,MAEhC,KAAK,YAAY,SAAS;AACtB,eAAO,EAAE,CAAC,YAAYA,MAAK,KAAK,CAAC,GAAG,MAAM;AAAA,MAE9C;AACI,oBAAY;AAAA,IACpB;AAAA,EACJ;AAKA,WAAS,0BAA0B,OAAsBA,OAAuB;AAC5E,YAAQA,MAAK,MAAM;AAAA,MACf,KAAK,YAAY;AACb,kCAA0B,OAAOA,MAAK,MAAM,GAAG;AAC/C,kCAA0B,OAAOA,MAAK,MAAM,GAAG;AAC/C;AAAA,MAEJ;AACI,eAAO,OAAO,OAAO,mBAAmBA,KAAI,CAAC;AAC7C;AAAA,IACR;AAAA,EACJ;AAKA,WAAS,yBAAyBC,UAAiBD,OAAuB;AACtE,YAAQA,MAAK,MAAM;AAAA,MACf,KAAK,YAAY,QAAQ;AACrB,YAAI,EAAE,CAACC,QAAO,GAAG,MAAM,CAACD,MAAK,KAAK,GAAG,MAAM,CAAC;AAC5C;AAAA,MAEJ,KAAK,YAAY;AACb,iCAAyBC,UAASD,MAAK,MAAM,GAAG;AAChD,iCAAyBC,UAASD,MAAK,MAAM,GAAG;AAChD;AAAA,MAEJ,KAAK,YAAY;AACb,YACIA,MAAK,MAAM,IAAI,SAAS,YAAY,QAAQ,QAC5CA,MAAK,MAAM,IAAI,SAAS,YAAY,QAAQ,MAC9C;AACE,cAAI,EAAE,CAACC,QAAO,GAAG,MAAM,CAACD,MAAK,MAAM,IAAI,KAAK,GAAG,OAAO,CAACA,MAAK,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC;AAAA,QACzF;AACA;AAAA,MAEJ,KAAK,YAAY,SAAS;AACtB,YAAIA,MAAK,MAAM,SAAS,YAAY,QAAQ,MAAM;AAC9C,cAAI,EAAE,CAACC,QAAO,GAAG,MAAM,CAACD,MAAK,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,QACrD;AACA;AAAA,MAEJ;AACI,oBAAY;AAAA,IACpB;AAAA,EACJ;AAKA,WAAS,wBAAwBA,OAAuB;AACpD,UAAM,SAAS,CAAC;AAEhB,aAAS,QAAQA,OAAuB,SAAS,OAAO;AACpD,cAAQA,MAAK,MAAM;AAAA,QACf,KAAK,YAAY,QAAQ;AACrB,iBAAOA,MAAK,KAAK,IAAI,CAAC;AACtB;AAAA,QAEJ,KAAK,YAAY,SAAS;AACtB,kBAAQA,MAAK,MAAM,KAAK,MAAM;AAC9B,kBAAQA,MAAK,MAAM,KAAK,MAAM;AAC9B;AAAA,QAEJ,KAAK,YAAY,SAAS;AACtB,kBAAQA,MAAK,OAAO,CAAC,MAAM;AAC3B;AAAA,QAEJ;AACI,sBAAY;AAAA,MACpB;AAAA,IACJ;AAEA,YAAQA,KAAI;AAEZ,WAAO;AAAA,EACX;AACJ;",
|
|
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-
|
|
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-
|
|
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-
|
|
41
|
-
"@matter/tools": "0.13.0-alpha.0-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
+
add({ [feature.name]: false });
|
|
85
85
|
break;
|
|
86
86
|
|
|
87
87
|
case Conformance.Flag.Deprecated:
|
|
88
88
|
case Conformance.Flag.Disallowed:
|
|
89
|
-
|
|
89
|
+
add({ [feature.name]: true });
|
|
90
90
|
break;
|
|
91
91
|
|
|
92
92
|
case Conformance.Special.Group:
|
|
93
|
-
node.param
|
|
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
|
-
|
|
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
|
-
|
|
180
|
+
add(flags);
|
|
126
181
|
break;
|
|
127
182
|
}
|
|
128
183
|
|
|
129
184
|
case Conformance.Operator.NOT: {
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
290
|
+
add({ [feature]: true, [node.param.param]: true });
|
|
236
291
|
}
|
|
237
292
|
break;
|
|
238
293
|
|