@featurevisor/core 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintcache +1 -1
- package/CHANGELOG.md +11 -0
- package/coverage/clover.xml +2 -2
- package/coverage/lcov-report/index.html +1 -1
- package/coverage/lcov-report/lib/builder/allocator.js.html +1 -1
- package/coverage/lcov-report/lib/builder/index.html +1 -1
- package/coverage/lcov-report/lib/builder/traffic.js.html +1 -1
- package/coverage/lcov-report/lib/tester/checkIfObjectsAreEqual.js.html +1 -1
- package/coverage/lcov-report/lib/tester/index.html +1 -1
- package/coverage/lcov-report/lib/tester/matrix.js.html +1 -1
- package/coverage/lcov-report/src/builder/allocator.ts.html +1 -1
- package/coverage/lcov-report/src/builder/index.html +1 -1
- package/coverage/lcov-report/src/builder/traffic.ts.html +1 -1
- package/coverage/lcov-report/src/tester/checkIfObjectsAreEqual.ts.html +1 -1
- package/coverage/lcov-report/src/tester/index.html +1 -1
- package/coverage/lcov-report/src/tester/matrix.ts.html +1 -1
- package/lib/linter/attributeSchema.d.ts +17 -2
- package/lib/linter/attributeSchema.js +13 -11
- package/lib/linter/attributeSchema.js.map +1 -1
- package/lib/linter/checkPercentageExceedingSlot.d.ts +3 -0
- package/lib/linter/checkPercentageExceedingSlot.js +86 -0
- package/lib/linter/checkPercentageExceedingSlot.js.map +1 -0
- package/lib/linter/conditionSchema.d.ts +2 -2
- package/lib/linter/conditionSchema.js +112 -57
- package/lib/linter/conditionSchema.js.map +1 -1
- package/lib/linter/featureSchema.d.ts +229 -2
- package/lib/linter/featureSchema.js +195 -139
- package/lib/linter/featureSchema.js.map +1 -1
- package/lib/linter/groupSchema.d.ts +32 -2
- package/lib/linter/groupSchema.js +28 -97
- package/lib/linter/groupSchema.js.map +1 -1
- package/lib/linter/lintProject.js +169 -118
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/printError.d.ts +2 -0
- package/lib/linter/printError.js +20 -0
- package/lib/linter/printError.js.map +1 -0
- package/lib/linter/segmentSchema.d.ts +14 -2
- package/lib/linter/segmentSchema.js +12 -10
- package/lib/linter/segmentSchema.js.map +1 -1
- package/lib/linter/testSchema.d.ts +90 -2
- package/lib/linter/testSchema.js +49 -38
- package/lib/linter/testSchema.js.map +1 -1
- package/lib/tester/cliFormat.d.ts +1 -0
- package/lib/tester/cliFormat.js +2 -1
- package/lib/tester/cliFormat.js.map +1 -1
- package/package.json +4 -4
- package/src/linter/attributeSchema.ts +11 -9
- package/src/linter/checkPercentageExceedingSlot.ts +41 -0
- package/src/linter/conditionSchema.ts +120 -97
- package/src/linter/featureSchema.ts +241 -177
- package/src/linter/groupSchema.ts +38 -54
- package/src/linter/lintProject.ts +144 -62
- package/src/linter/printError.ts +21 -0
- package/src/linter/segmentSchema.ts +10 -8
- package/src/linter/testSchema.ts +67 -50
- package/src/tester/cliFormat.ts +1 -0
- package/lib/linter/printJoiError.d.ts +0 -2
- package/lib/linter/printJoiError.js +0 -14
- package/lib/linter/printJoiError.js.map +0 -1
- package/src/linter/printJoiError.ts +0 -11
|
@@ -1,150 +1,206 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
-
if (ar || !(i in from)) {
|
|
5
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
-
ar[i] = from[i];
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
13
|
-
var
|
|
3
|
+
exports.getFeatureZodSchema = void 0;
|
|
4
|
+
var zod_1 = require("zod");
|
|
14
5
|
var tagRegex = /^[a-z0-9-]+$/;
|
|
15
|
-
function
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var plainGroupSegment =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
6
|
+
function getFeatureZodSchema(projectConfig, conditionsZodSchema, availableAttributeKeys, availableSegmentKeys, availableFeatureKeys) {
|
|
7
|
+
var variationValueZodSchema = zod_1.z.string().min(1);
|
|
8
|
+
var variableValueZodSchema = zod_1.z.union([
|
|
9
|
+
zod_1.z.string(),
|
|
10
|
+
zod_1.z.number(),
|
|
11
|
+
zod_1.z.boolean(),
|
|
12
|
+
zod_1.z.array(zod_1.z.string()),
|
|
13
|
+
zod_1.z.record(zod_1.z.unknown()).refine(function (value) {
|
|
14
|
+
var isFlat = true;
|
|
15
|
+
Object.keys(value).forEach(function (key) {
|
|
16
|
+
if (typeof value[key] === "object") {
|
|
17
|
+
isFlat = false;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return isFlat;
|
|
21
|
+
}, {
|
|
22
|
+
message: "object is not flat",
|
|
23
|
+
}),
|
|
24
|
+
]);
|
|
25
|
+
var plainGroupSegment = zod_1.z.string().refine(function (value) { return value === "*" || availableSegmentKeys.includes(value); }, function (value) { return ({
|
|
26
|
+
message: "Unknown segment key \"".concat(value, "\""),
|
|
27
|
+
}); });
|
|
28
|
+
var andOrNotGroupSegment = zod_1.z.union([
|
|
29
|
+
zod_1.z
|
|
30
|
+
.object({
|
|
31
|
+
and: zod_1.z.array(zod_1.z.lazy(function () { return groupSegmentZodSchema; })),
|
|
32
|
+
})
|
|
33
|
+
.strict(),
|
|
34
|
+
zod_1.z
|
|
35
|
+
.object({
|
|
36
|
+
or: zod_1.z.array(zod_1.z.lazy(function () { return groupSegmentZodSchema; })),
|
|
37
|
+
})
|
|
38
|
+
.strict(),
|
|
39
|
+
zod_1.z
|
|
40
|
+
.object({
|
|
41
|
+
not: zod_1.z.array(zod_1.z.lazy(function () { return groupSegmentZodSchema; })),
|
|
42
|
+
})
|
|
43
|
+
.strict(),
|
|
44
|
+
]);
|
|
45
|
+
var groupSegmentZodSchema = zod_1.z.union([andOrNotGroupSegment, plainGroupSegment]);
|
|
46
|
+
var groupSegmentsZodSchema = zod_1.z.union([zod_1.z.array(groupSegmentZodSchema), groupSegmentZodSchema]);
|
|
47
|
+
var environmentZodSchema = zod_1.z
|
|
48
|
+
.object({
|
|
49
|
+
expose: zod_1.z
|
|
50
|
+
.union([
|
|
51
|
+
zod_1.z.boolean(),
|
|
52
|
+
zod_1.z.array(zod_1.z.string().refine(function (value) { return projectConfig.tags.includes(value); })),
|
|
53
|
+
])
|
|
54
|
+
.optional(),
|
|
55
|
+
rules: zod_1.z
|
|
56
|
+
.array(zod_1.z
|
|
57
|
+
.object({
|
|
58
|
+
key: zod_1.z.string(),
|
|
59
|
+
description: zod_1.z.string().optional(),
|
|
60
|
+
segments: groupSegmentsZodSchema,
|
|
61
|
+
percentage: zod_1.z.number().min(0).max(100),
|
|
62
|
+
enabled: zod_1.z.boolean().optional(),
|
|
63
|
+
variation: variationValueZodSchema.optional(),
|
|
64
|
+
variables: zod_1.z.record(variableValueZodSchema).optional(),
|
|
65
|
+
})
|
|
66
|
+
.strict())
|
|
67
|
+
.refine(function (value) {
|
|
68
|
+
var keys = value.map(function (v) { return v.key; });
|
|
69
|
+
return keys.length === new Set(keys).size;
|
|
70
|
+
}, function (value) { return ({
|
|
71
|
+
message: "Duplicate rule keys found: " + value.map(function (v) { return v.key; }).join(", "),
|
|
72
|
+
}); }),
|
|
73
|
+
force: zod_1.z
|
|
74
|
+
.array(zod_1.z.union([
|
|
75
|
+
zod_1.z
|
|
76
|
+
.object({
|
|
77
|
+
segments: groupSegmentsZodSchema,
|
|
78
|
+
enabled: zod_1.z.boolean().optional(),
|
|
79
|
+
variation: variationValueZodSchema.optional(),
|
|
80
|
+
variables: zod_1.z.record(variableValueZodSchema).optional(),
|
|
81
|
+
})
|
|
82
|
+
.strict(),
|
|
83
|
+
zod_1.z
|
|
84
|
+
.object({
|
|
85
|
+
conditions: conditionsZodSchema,
|
|
86
|
+
enabled: zod_1.z.boolean().optional(),
|
|
87
|
+
variation: variationValueZodSchema.optional(),
|
|
88
|
+
variables: zod_1.z.record(variableValueZodSchema).optional(),
|
|
89
|
+
})
|
|
90
|
+
.strict(),
|
|
91
|
+
]))
|
|
92
|
+
.optional(),
|
|
93
|
+
})
|
|
94
|
+
.strict();
|
|
70
95
|
var allEnvironmentsSchema = {};
|
|
71
96
|
projectConfig.environments.forEach(function (environmentKey) {
|
|
72
|
-
allEnvironmentsSchema[environmentKey] =
|
|
97
|
+
allEnvironmentsSchema[environmentKey] = environmentZodSchema;
|
|
73
98
|
});
|
|
74
|
-
var
|
|
75
|
-
var
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
.
|
|
89
|
-
|
|
90
|
-
.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
var allEnvironmentsZodSchema = zod_1.z.object(allEnvironmentsSchema).strict();
|
|
100
|
+
var attributeKeyZodSchema = zod_1.z.string().refine(function (value) { return value === "*" || availableAttributeKeys.includes(value); }, function (value) { return ({
|
|
101
|
+
message: "Unknown attribute \"".concat(value, "\""),
|
|
102
|
+
}); });
|
|
103
|
+
var featureKeyZodSchema = zod_1.z.string().refine(function (value) { return availableFeatureKeys.includes(value); }, function (value) { return ({
|
|
104
|
+
message: "Unknown feature \"".concat(value, "\""),
|
|
105
|
+
}); });
|
|
106
|
+
var featureZodSchema = zod_1.z
|
|
107
|
+
.object({
|
|
108
|
+
archived: zod_1.z.boolean().optional(),
|
|
109
|
+
deprecated: zod_1.z.boolean().optional(),
|
|
110
|
+
description: zod_1.z.string(),
|
|
111
|
+
tags: zod_1.z
|
|
112
|
+
.array(zod_1.z.string().refine(function (value) { return tagRegex.test(value); }, function (value) { return ({
|
|
113
|
+
message: "Tag \"".concat(value, "\" must be lower cased and alphanumeric, and may contain hyphens."),
|
|
114
|
+
}); }))
|
|
115
|
+
.refine(function (value) {
|
|
116
|
+
return value.length === new Set(value).size;
|
|
117
|
+
}, function (value) { return ({
|
|
118
|
+
message: "Duplicate tags found: " + value.join(", "),
|
|
119
|
+
}); }),
|
|
120
|
+
required: zod_1.z
|
|
121
|
+
.array(zod_1.z.union([
|
|
122
|
+
featureKeyZodSchema,
|
|
123
|
+
zod_1.z
|
|
124
|
+
.object({
|
|
125
|
+
key: featureKeyZodSchema,
|
|
126
|
+
variation: zod_1.z.string().optional(),
|
|
127
|
+
})
|
|
128
|
+
.strict(),
|
|
129
|
+
]))
|
|
96
130
|
.optional(),
|
|
97
|
-
bucketBy:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
|
|
109
|
-
.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
variations: Joi.array()
|
|
119
|
-
.items(Joi.object({
|
|
120
|
-
description: Joi.string(),
|
|
121
|
-
value: variationValueJoiSchema.required(),
|
|
122
|
-
weight: Joi.number().precision(3).min(0).max(100).required(),
|
|
123
|
-
variables: Joi.array()
|
|
124
|
-
.items(Joi.object({
|
|
125
|
-
key: Joi.string(),
|
|
126
|
-
value: variableValueJoiSchema,
|
|
127
|
-
overrides: Joi.array().items(Joi.object({
|
|
128
|
-
// @TODO: either segments or conditions prsent at a time
|
|
129
|
-
segments: groupSegmentsJoiSchema,
|
|
130
|
-
conditions: conditionsJoiSchema,
|
|
131
|
-
// @TODO: make it stricter based on `type`
|
|
132
|
-
value: variableValueJoiSchema,
|
|
133
|
-
})),
|
|
134
|
-
}))
|
|
135
|
-
.unique("key"),
|
|
136
|
-
}))
|
|
137
|
-
.custom(function (value) {
|
|
138
|
-
var total = value.reduce(function (acc, v) { return acc + v.weight; }, 0);
|
|
139
|
-
if (total !== 100) {
|
|
140
|
-
throw new Error("Sum of all variation weights must be 100, got ".concat(total));
|
|
141
|
-
}
|
|
142
|
-
return value;
|
|
131
|
+
bucketBy: zod_1.z.union([
|
|
132
|
+
attributeKeyZodSchema,
|
|
133
|
+
zod_1.z.array(attributeKeyZodSchema),
|
|
134
|
+
zod_1.z
|
|
135
|
+
.object({
|
|
136
|
+
or: zod_1.z.array(attributeKeyZodSchema),
|
|
137
|
+
})
|
|
138
|
+
.strict(),
|
|
139
|
+
]),
|
|
140
|
+
variablesSchema: zod_1.z
|
|
141
|
+
.array(zod_1.z
|
|
142
|
+
.object({
|
|
143
|
+
key: zod_1.z
|
|
144
|
+
.string()
|
|
145
|
+
.min(1)
|
|
146
|
+
.refine(function (value) { return value !== "variation"; }, {
|
|
147
|
+
message: "variable key cannot be \"variation\"",
|
|
148
|
+
}),
|
|
149
|
+
type: zod_1.z.enum(["string", "integer", "boolean", "double", "array", "object", "json"]),
|
|
150
|
+
description: zod_1.z.string().optional(),
|
|
151
|
+
defaultValue: variableValueZodSchema,
|
|
143
152
|
})
|
|
153
|
+
.strict())
|
|
154
|
+
.refine(function (value) {
|
|
155
|
+
var keys = value.map(function (v) { return v.key; });
|
|
156
|
+
return keys.length === new Set(keys).size;
|
|
157
|
+
}, function (value) { return ({
|
|
158
|
+
message: "Duplicate variable keys found: " + value.map(function (v) { return v.key; }).join(", "),
|
|
159
|
+
}); })
|
|
144
160
|
.optional(),
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
161
|
+
variations: zod_1.z
|
|
162
|
+
.array(zod_1.z
|
|
163
|
+
.object({
|
|
164
|
+
description: zod_1.z.string().optional(),
|
|
165
|
+
value: variationValueZodSchema,
|
|
166
|
+
weight: zod_1.z.number().min(0).max(100),
|
|
167
|
+
variables: zod_1.z
|
|
168
|
+
.array(zod_1.z
|
|
169
|
+
.object({
|
|
170
|
+
key: zod_1.z.string().min(1),
|
|
171
|
+
value: variableValueZodSchema,
|
|
172
|
+
overrides: zod_1.z
|
|
173
|
+
.array(zod_1.z.union([
|
|
174
|
+
zod_1.z
|
|
175
|
+
.object({
|
|
176
|
+
conditions: conditionsZodSchema,
|
|
177
|
+
value: variableValueZodSchema,
|
|
178
|
+
})
|
|
179
|
+
.strict(),
|
|
180
|
+
zod_1.z
|
|
181
|
+
.object({
|
|
182
|
+
segments: groupSegmentsZodSchema,
|
|
183
|
+
value: variableValueZodSchema,
|
|
184
|
+
})
|
|
185
|
+
.strict(),
|
|
186
|
+
]))
|
|
187
|
+
.optional(),
|
|
188
|
+
})
|
|
189
|
+
.strict())
|
|
190
|
+
.optional(),
|
|
191
|
+
})
|
|
192
|
+
.strict())
|
|
193
|
+
.refine(function (value) {
|
|
194
|
+
var variationValues = value.map(function (v) { return v.value; });
|
|
195
|
+
return variationValues.length === new Set(variationValues).size;
|
|
196
|
+
}, function (value) { return ({
|
|
197
|
+
message: "Duplicate variation values found: " + value.map(function (v) { return v.value; }).join(", "),
|
|
198
|
+
}); })
|
|
199
|
+
.optional(),
|
|
200
|
+
environments: allEnvironmentsZodSchema,
|
|
201
|
+
})
|
|
202
|
+
.strict();
|
|
203
|
+
return featureZodSchema;
|
|
148
204
|
}
|
|
149
|
-
exports.
|
|
205
|
+
exports.getFeatureZodSchema = getFeatureZodSchema;
|
|
150
206
|
//# sourceMappingURL=featureSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureSchema.js","sourceRoot":"","sources":["../../src/linter/featureSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"featureSchema.js","sourceRoot":"","sources":["../../src/linter/featureSchema.ts"],"names":[],"mappings":";;;AAAA,2BAAwB;AAIxB,IAAM,QAAQ,GAAG,cAAc,CAAC;AAEhC,SAAgB,mBAAmB,CACjC,aAA4B,EAC5B,mBAAmB,EACnB,sBAA6C,EAC7C,oBAA2C,EAC3C,oBAA2C;IAE3C,IAAM,uBAAuB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,IAAM,sBAAsB,GAAG,OAAC,CAAC,KAAK,CAAC;QACrC,OAAC,CAAC,MAAM,EAAE;QACV,OAAC,CAAC,MAAM,EAAE;QACV,OAAC,CAAC,OAAO,EAAE;QACX,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;QACnB,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAC1B,UAAC,KAAK;YACJ,IAAI,MAAM,GAAG,IAAI,CAAC;YAElB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;gBAC7B,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;oBAClC,MAAM,GAAG,KAAK,CAAC;iBAChB;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC,EACD;YACE,OAAO,EAAE,oBAAoB;SAC9B,CACF;KACF,CAAC,CAAC;IAEH,IAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CACzC,UAAC,KAAK,IAAK,OAAA,KAAK,KAAK,GAAG,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAArD,CAAqD,EAChE,UAAC,KAAK,IAAK,OAAA,CAAC;QACV,OAAO,EAAE,gCAAwB,KAAK,OAAG;KAC1C,CAAC,EAFS,CAET,CACH,CAAC;IAEF,IAAM,oBAAoB,GAAG,OAAC,CAAC,KAAK,CAAC;QACnC,OAAC;aACE,MAAM,CAAC;YACN,GAAG,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,IAAI,CAAC,cAAM,OAAA,qBAAqB,EAArB,CAAqB,CAAC,CAAC;SAClD,CAAC;aACD,MAAM,EAAE;QACX,OAAC;aACE,MAAM,CAAC;YACN,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,IAAI,CAAC,cAAM,OAAA,qBAAqB,EAArB,CAAqB,CAAC,CAAC;SACjD,CAAC;aACD,MAAM,EAAE;QACX,OAAC;aACE,MAAM,CAAC;YACN,GAAG,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,IAAI,CAAC,cAAM,OAAA,qBAAqB,EAArB,CAAqB,CAAC,CAAC;SAClD,CAAC;aACD,MAAM,EAAE;KACZ,CAAC,CAAC;IAEH,IAAM,qBAAqB,GAAG,OAAC,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEjF,IAAM,sBAAsB,GAAG,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEhG,IAAM,oBAAoB,GAAG,OAAC;SAC3B,MAAM,CAAC;QACN,MAAM,EAAE,OAAC;aACN,KAAK,CAAC;YACL,OAAC,CAAC,OAAO,EAAE;YACX,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAC,KAAK,IAAK,OAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAlC,CAAkC,CAAC,CAAC;SAC1E,CAAC;aACD,QAAQ,EAAE;QACb,KAAK,EAAE,OAAC;aACL,KAAK,CACJ,OAAC;aACE,MAAM,CAAC;YACN,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;YACf,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,QAAQ,EAAE,sBAAsB;YAChC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAEtC,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC/B,SAAS,EAAE,uBAAuB,CAAC,QAAQ,EAAE;YAC7C,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;SACvD,CAAC;aACD,MAAM,EAAE,CACZ;aACA,MAAM,CACL,UAAC,KAAK;YACJ,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,EACD,UAAC,KAAK,IAAK,OAAA,CAAC;YACV,OAAO,EAAE,6BAA6B,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5E,CAAC,EAFS,CAET,CACH;QACH,KAAK,EAAE,OAAC;aACL,KAAK,CACJ,OAAC,CAAC,KAAK,CAAC;YACN,OAAC;iBACE,MAAM,CAAC;gBACN,QAAQ,EAAE,sBAAsB;gBAChC,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC/B,SAAS,EAAE,uBAAuB,CAAC,QAAQ,EAAE;gBAC7C,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;aACvD,CAAC;iBACD,MAAM,EAAE;YACX,OAAC;iBACE,MAAM,CAAC;gBACN,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC/B,SAAS,EAAE,uBAAuB,CAAC,QAAQ,EAAE;gBAC7C,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;aACvD,CAAC;iBACD,MAAM,EAAE;SACZ,CAAC,CACH;aACA,QAAQ,EAAE;KACd,CAAC;SACD,MAAM,EAAE,CAAC;IAEZ,IAAM,qBAAqB,GAAG,EAAE,CAAC;IACjC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,cAAc;QAChD,qBAAqB,CAAC,cAAc,CAAC,GAAG,oBAAoB,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,IAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC;IAE1E,IAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAC7C,UAAC,KAAK,IAAK,OAAA,KAAK,KAAK,GAAG,IAAI,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAvD,CAAuD,EAClE,UAAC,KAAK,IAAK,OAAA,CAAC;QACV,OAAO,EAAE,8BAAsB,KAAK,OAAG;KACxC,CAAC,EAFS,CAET,CACH,CAAC;IAEF,IAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAC3C,UAAC,KAAK,IAAK,OAAA,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAApC,CAAoC,EAC/C,UAAC,KAAK,IAAK,OAAA,CAAC;QACV,OAAO,EAAE,4BAAoB,KAAK,OAAG;KACtC,CAAC,EAFS,CAET,CACH,CAAC;IAEF,IAAM,gBAAgB,GAAG,OAAC;SACvB,MAAM,CAAC;QACN,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAChC,UAAU,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,OAAC;aACJ,KAAK,CACJ,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CACf,UAAC,KAAK,IAAK,OAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAApB,CAAoB,EAC/B,UAAC,KAAK,IAAK,OAAA,CAAC;YACV,OAAO,EAAE,gBAAQ,KAAK,sEAAkE;SACzF,CAAC,EAFS,CAET,CACH,CACF;aACA,MAAM,CACL,UAAC,KAAK;YACJ,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC,EACD,UAAC,KAAK,IAAK,OAAA,CAAC;YACV,OAAO,EAAE,wBAAwB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;SACrD,CAAC,EAFS,CAET,CACH;QACH,QAAQ,EAAE,OAAC;aACR,KAAK,CACJ,OAAC,CAAC,KAAK,CAAC;YACN,mBAAmB;YACnB,OAAC;iBACE,MAAM,CAAC;gBACN,GAAG,EAAE,mBAAmB;gBACxB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aACjC,CAAC;iBACD,MAAM,EAAE;SACZ,CAAC,CACH;aACA,QAAQ,EAAE;QACb,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC;YAChB,qBAAqB;YACrB,OAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;YAC9B,OAAC;iBACE,MAAM,CAAC;gBACN,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;aACnC,CAAC;iBACD,MAAM,EAAE;SACZ,CAAC;QACF,eAAe,EAAE,OAAC;aACf,KAAK,CACJ,OAAC;aACE,MAAM,CAAC;YACN,GAAG,EAAE,OAAC;iBACH,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,MAAM,CAAC,UAAC,KAAK,IAAK,OAAA,KAAK,KAAK,WAAW,EAArB,CAAqB,EAAE;gBACxC,OAAO,EAAE,sCAAoC;aAC9C,CAAC;YACJ,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnF,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,YAAY,EAAE,sBAAsB;SACrC,CAAC;aACD,MAAM,EAAE,CACZ;aACA,MAAM,CACL,UAAC,KAAK;YACJ,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,EACD,UAAC,KAAK,IAAK,OAAA,CAAC;YACV,OAAO,EAAE,iCAAiC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAChF,CAAC,EAFS,CAET,CACH;aACA,QAAQ,EAAE;QACb,UAAU,EAAE,OAAC;aACV,KAAK,CACJ,OAAC;aACE,MAAM,CAAC;YACN,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,KAAK,EAAE,uBAAuB;YAC9B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,SAAS,EAAE,OAAC;iBACT,KAAK,CACJ,OAAC;iBACE,MAAM,CAAC;gBACN,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtB,KAAK,EAAE,sBAAsB;gBAC7B,SAAS,EAAE,OAAC;qBACT,KAAK,CACJ,OAAC,CAAC,KAAK,CAAC;oBACN,OAAC;yBACE,MAAM,CAAC;wBACN,UAAU,EAAE,mBAAmB;wBAC/B,KAAK,EAAE,sBAAsB;qBAC9B,CAAC;yBACD,MAAM,EAAE;oBACX,OAAC;yBACE,MAAM,CAAC;wBACN,QAAQ,EAAE,sBAAsB;wBAChC,KAAK,EAAE,sBAAsB;qBAC9B,CAAC;yBACD,MAAM,EAAE;iBACZ,CAAC,CACH;qBACA,QAAQ,EAAE;aACd,CAAC;iBACD,MAAM,EAAE,CACZ;iBACA,QAAQ,EAAE;SACd,CAAC;aACD,MAAM,EAAE,CACZ;aACA,MAAM,CACL,UAAC,KAAK;YACJ,IAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAAC,CAAC;YAClD,OAAO,eAAe,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC,EACD,UAAC,KAAK,IAAK,OAAA,CAAC;YACV,OAAO,EAAE,oCAAoC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACrF,CAAC,EAFS,CAET,CACH;aACA,QAAQ,EAAE;QACb,YAAY,EAAE,wBAAwB;KACvC,CAAC;SACD,MAAM,EAAE,CAAC;IAEZ,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AApQD,kDAoQC"}
|
|
@@ -1,4 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
import { ProjectConfig } from "../config";
|
|
3
3
|
import { Datasource } from "../datasource";
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function getGroupZodSchema(projectConfig: ProjectConfig, datasource: Datasource, availableFeatureKeys: string[]): z.ZodObject<{
|
|
5
|
+
description: z.ZodString;
|
|
6
|
+
slots: z.ZodEffects<z.ZodArray<z.ZodObject<{
|
|
7
|
+
feature: z.ZodEffects<z.ZodOptional<z.ZodString>, string, string>;
|
|
8
|
+
percentage: z.ZodNumber;
|
|
9
|
+
}, "strict", z.ZodTypeAny, {
|
|
10
|
+
feature?: string;
|
|
11
|
+
percentage?: number;
|
|
12
|
+
}, {
|
|
13
|
+
feature?: string;
|
|
14
|
+
percentage?: number;
|
|
15
|
+
}>, "many">, {
|
|
16
|
+
feature?: string;
|
|
17
|
+
percentage?: number;
|
|
18
|
+
}[], {
|
|
19
|
+
feature?: string;
|
|
20
|
+
percentage?: number;
|
|
21
|
+
}[]>;
|
|
22
|
+
}, "strict", z.ZodTypeAny, {
|
|
23
|
+
description?: string;
|
|
24
|
+
slots?: {
|
|
25
|
+
feature?: string;
|
|
26
|
+
percentage?: number;
|
|
27
|
+
}[];
|
|
28
|
+
}, {
|
|
29
|
+
description?: string;
|
|
30
|
+
slots?: {
|
|
31
|
+
feature?: string;
|
|
32
|
+
percentage?: number;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
@@ -1,102 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
var
|
|
41
|
-
function
|
|
42
|
-
var
|
|
43
|
-
|
|
44
|
-
description:
|
|
45
|
-
slots:
|
|
46
|
-
.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
throw new Error("total percentage is not 100");
|
|
59
|
-
}
|
|
60
|
-
_i = 0, value_1 = value;
|
|
61
|
-
_c.label = 1;
|
|
62
|
-
case 1:
|
|
63
|
-
if (!(_i < value_1.length)) return [3 /*break*/, 4];
|
|
64
|
-
slot = value_1[_i];
|
|
65
|
-
maxPercentageForRule = slot.percentage;
|
|
66
|
-
if (!slot.feature) return [3 /*break*/, 3];
|
|
67
|
-
featureKey = slot.feature;
|
|
68
|
-
featureExists = availableFeatureKeys.indexOf(featureKey) > -1;
|
|
69
|
-
if (!featureExists) {
|
|
70
|
-
throw new Error("feature ".concat(featureKey, " not found"));
|
|
71
|
-
}
|
|
72
|
-
return [4 /*yield*/, datasource.readFeature(featureKey)];
|
|
73
|
-
case 2:
|
|
74
|
-
parsedFeature = _c.sent();
|
|
75
|
-
environmentKeys = Object.keys(parsedFeature.environments);
|
|
76
|
-
for (_a = 0, environmentKeys_1 = environmentKeys; _a < environmentKeys_1.length; _a++) {
|
|
77
|
-
environmentKey = environmentKeys_1[_a];
|
|
78
|
-
environment = parsedFeature.environments[environmentKey];
|
|
79
|
-
rules = environment.rules;
|
|
80
|
-
for (_b = 0, rules_1 = rules; _b < rules_1.length; _b++) {
|
|
81
|
-
rule = rules_1[_b];
|
|
82
|
-
if (rule.percentage > maxPercentageForRule) {
|
|
83
|
-
// @TODO: this does not help with same feature belonging to multiple slots. fix that.
|
|
84
|
-
throw new Error("Feature ".concat(featureKey, "'s rule ").concat(rule.key, " in ").concat(environmentKey, " has a percentage of ").concat(rule.percentage, " which is greater than the maximum percentage of ").concat(maxPercentageForRule, " for the slot"));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
_c.label = 3;
|
|
89
|
-
case 3:
|
|
90
|
-
_i++;
|
|
91
|
-
return [3 /*break*/, 1];
|
|
92
|
-
case 4: return [2 /*return*/, value];
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
});
|
|
3
|
+
exports.getGroupZodSchema = void 0;
|
|
4
|
+
var zod_1 = require("zod");
|
|
5
|
+
function getGroupZodSchema(projectConfig, datasource, availableFeatureKeys) {
|
|
6
|
+
var groupZodSchema = zod_1.z
|
|
7
|
+
.object({
|
|
8
|
+
description: zod_1.z.string(),
|
|
9
|
+
slots: zod_1.z
|
|
10
|
+
.array(zod_1.z
|
|
11
|
+
.object({
|
|
12
|
+
feature: zod_1.z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.refine(function (value) {
|
|
16
|
+
if (value && availableFeatureKeys.indexOf(value) === -1) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}, function (value) { return ({ message: "Unknown feature \"".concat(value, "\"") }); }),
|
|
21
|
+
percentage: zod_1.z.number().min(0).max(100),
|
|
96
22
|
})
|
|
97
|
-
.
|
|
98
|
-
|
|
99
|
-
|
|
23
|
+
.strict())
|
|
24
|
+
.refine(function (value) {
|
|
25
|
+
var totalPercentage = value.reduce(function (acc, slot) { return acc + slot.percentage; }, 0);
|
|
26
|
+
return totalPercentage === 100;
|
|
27
|
+
}, { message: "Total percentage of all slots is not 100" }),
|
|
28
|
+
})
|
|
29
|
+
.strict();
|
|
30
|
+
return groupZodSchema;
|
|
100
31
|
}
|
|
101
|
-
exports.
|
|
32
|
+
exports.getGroupZodSchema = getGroupZodSchema;
|
|
102
33
|
//# sourceMappingURL=groupSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groupSchema.js","sourceRoot":"","sources":["../../src/linter/groupSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"groupSchema.js","sourceRoot":"","sources":["../../src/linter/groupSchema.ts"],"names":[],"mappings":";;;AAAA,2BAAwB;AAKxB,SAAgB,iBAAiB,CAC/B,aAA4B,EAC5B,UAAsB,EACtB,oBAA8B;IAE9B,IAAM,cAAc,GAAG,OAAC;SACrB,MAAM,CAAC;QACN,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,OAAC;aACL,KAAK,CACJ,OAAC;aACE,MAAM,CAAC;YACN,OAAO,EAAE,OAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,MAAM,CACL,UAAC,KAAK;gBACJ,IAAI,KAAK,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;oBACvD,OAAO,KAAK,CAAC;iBACd;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,EACD,UAAC,KAAK,IAAK,OAAA,CAAC,EAAE,OAAO,EAAE,4BAAoB,KAAK,OAAG,EAAE,CAAC,EAA3C,CAA2C,CACvD;YACH,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;SACvC,CAAC;aACD,MAAM,EAAE,CACZ;aACA,MAAM,CACL,UAAC,KAAK;YACJ,IAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,IAAI,IAAK,OAAA,GAAG,GAAG,IAAI,CAAC,UAAU,EAArB,CAAqB,EAAE,CAAC,CAAC,CAAC;YAE9E,OAAO,eAAe,KAAK,GAAG,CAAC;QACjC,CAAC,EACD,EAAE,OAAO,EAAE,0CAA0C,EAAE,CACxD;KACJ,CAAC;SACD,MAAM,EAAE,CAAC;IAEZ,OAAO,cAAc,CAAC;AACxB,CAAC;AAzCD,8CAyCC"}
|