@libraz/coverwise 1.0.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.
Files changed (110) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +119 -0
  3. package/README.npm.md +119 -0
  4. package/dist/coverwise.js +2 -0
  5. package/dist/coverwise.wasm +0 -0
  6. package/dist/js/constraint.d.ts +78 -0
  7. package/dist/js/constraint.d.ts.map +1 -0
  8. package/dist/js/constraint.js +213 -0
  9. package/dist/js/constraint.js.map +1 -0
  10. package/dist/js/index.d.ts +94 -0
  11. package/dist/js/index.d.ts.map +1 -0
  12. package/dist/js/index.js +164 -0
  13. package/dist/js/index.js.map +1 -0
  14. package/dist/js/pure/adapter.d.ts +40 -0
  15. package/dist/js/pure/adapter.d.ts.map +1 -0
  16. package/dist/js/pure/adapter.js +207 -0
  17. package/dist/js/pure/adapter.js.map +1 -0
  18. package/dist/js/pure/index.d.ts +83 -0
  19. package/dist/js/pure/index.d.ts.map +1 -0
  20. package/dist/js/pure/index.js +132 -0
  21. package/dist/js/pure/index.js.map +1 -0
  22. package/dist/js/types.d.ts +132 -0
  23. package/dist/js/types.d.ts.map +1 -0
  24. package/dist/js/types.js +3 -0
  25. package/dist/js/types.js.map +1 -0
  26. package/dist/src/ts/algo/greedy.d.ts +9 -0
  27. package/dist/src/ts/algo/greedy.d.ts.map +1 -0
  28. package/dist/src/ts/algo/greedy.js +137 -0
  29. package/dist/src/ts/algo/greedy.js.map +1 -0
  30. package/dist/src/ts/algo/index.d.ts +2 -0
  31. package/dist/src/ts/algo/index.d.ts.map +1 -0
  32. package/dist/src/ts/algo/index.js +2 -0
  33. package/dist/src/ts/algo/index.js.map +1 -0
  34. package/dist/src/ts/core/coverage-engine.d.ts +40 -0
  35. package/dist/src/ts/core/coverage-engine.d.ts.map +1 -0
  36. package/dist/src/ts/core/coverage-engine.js +366 -0
  37. package/dist/src/ts/core/coverage-engine.js.map +1 -0
  38. package/dist/src/ts/core/generator.d.ts +6 -0
  39. package/dist/src/ts/core/generator.d.ts.map +1 -0
  40. package/dist/src/ts/core/generator.js +394 -0
  41. package/dist/src/ts/core/generator.js.map +1 -0
  42. package/dist/src/ts/core/index.d.ts +3 -0
  43. package/dist/src/ts/core/index.d.ts.map +1 -0
  44. package/dist/src/ts/core/index.js +3 -0
  45. package/dist/src/ts/core/index.js.map +1 -0
  46. package/dist/src/ts/model/boundary.d.ts +29 -0
  47. package/dist/src/ts/model/boundary.d.ts.map +1 -0
  48. package/dist/src/ts/model/boundary.js +102 -0
  49. package/dist/src/ts/model/boundary.js.map +1 -0
  50. package/dist/src/ts/model/constraint-ast.d.ts +152 -0
  51. package/dist/src/ts/model/constraint-ast.d.ts.map +1 -0
  52. package/dist/src/ts/model/constraint-ast.js +384 -0
  53. package/dist/src/ts/model/constraint-ast.js.map +1 -0
  54. package/dist/src/ts/model/constraint-parser.d.ts +49 -0
  55. package/dist/src/ts/model/constraint-parser.d.ts.map +1 -0
  56. package/dist/src/ts/model/constraint-parser.js +831 -0
  57. package/dist/src/ts/model/constraint-parser.js.map +1 -0
  58. package/dist/src/ts/model/error.d.ts +19 -0
  59. package/dist/src/ts/model/error.d.ts.map +1 -0
  60. package/dist/src/ts/model/error.js +19 -0
  61. package/dist/src/ts/model/error.js.map +1 -0
  62. package/dist/src/ts/model/generate-options.d.ts +82 -0
  63. package/dist/src/ts/model/generate-options.d.ts.map +1 -0
  64. package/dist/src/ts/model/generate-options.js +52 -0
  65. package/dist/src/ts/model/generate-options.js.map +1 -0
  66. package/dist/src/ts/model/index.d.ts +6 -0
  67. package/dist/src/ts/model/index.d.ts.map +1 -0
  68. package/dist/src/ts/model/index.js +6 -0
  69. package/dist/src/ts/model/index.js.map +1 -0
  70. package/dist/src/ts/model/parameter.d.ts +65 -0
  71. package/dist/src/ts/model/parameter.d.ts.map +1 -0
  72. package/dist/src/ts/model/parameter.js +157 -0
  73. package/dist/src/ts/model/parameter.js.map +1 -0
  74. package/dist/src/ts/model/test-case.d.ts +67 -0
  75. package/dist/src/ts/model/test-case.d.ts.map +1 -0
  76. package/dist/src/ts/model/test-case.js +28 -0
  77. package/dist/src/ts/model/test-case.js.map +1 -0
  78. package/dist/src/ts/util/bitset.d.ts +14 -0
  79. package/dist/src/ts/util/bitset.d.ts.map +1 -0
  80. package/dist/src/ts/util/bitset.js +66 -0
  81. package/dist/src/ts/util/bitset.js.map +1 -0
  82. package/dist/src/ts/util/combinatorics.d.ts +4 -0
  83. package/dist/src/ts/util/combinatorics.d.ts.map +1 -0
  84. package/dist/src/ts/util/combinatorics.js +60 -0
  85. package/dist/src/ts/util/combinatorics.js.map +1 -0
  86. package/dist/src/ts/util/index.d.ts +5 -0
  87. package/dist/src/ts/util/index.d.ts.map +1 -0
  88. package/dist/src/ts/util/index.js +7 -0
  89. package/dist/src/ts/util/index.js.map +1 -0
  90. package/dist/src/ts/util/rng.d.ts +13 -0
  91. package/dist/src/ts/util/rng.d.ts.map +1 -0
  92. package/dist/src/ts/util/rng.js +112 -0
  93. package/dist/src/ts/util/rng.js.map +1 -0
  94. package/dist/src/ts/util/string_util.d.ts +3 -0
  95. package/dist/src/ts/util/string_util.d.ts.map +1 -0
  96. package/dist/src/ts/util/string_util.js +25 -0
  97. package/dist/src/ts/util/string_util.js.map +1 -0
  98. package/dist/src/ts/validator/constraint-validator.d.ts +34 -0
  99. package/dist/src/ts/validator/constraint-validator.d.ts.map +1 -0
  100. package/dist/src/ts/validator/constraint-validator.js +51 -0
  101. package/dist/src/ts/validator/constraint-validator.js.map +1 -0
  102. package/dist/src/ts/validator/coverage-validator.d.ts +42 -0
  103. package/dist/src/ts/validator/coverage-validator.d.ts.map +1 -0
  104. package/dist/src/ts/validator/coverage-validator.js +230 -0
  105. package/dist/src/ts/validator/coverage-validator.js.map +1 -0
  106. package/dist/src/ts/validator/index.d.ts +3 -0
  107. package/dist/src/ts/validator/index.d.ts.map +1 -0
  108. package/dist/src/ts/validator/index.js +3 -0
  109. package/dist/src/ts/validator/index.js.map +1 -0
  110. package/package.json +82 -0
@@ -0,0 +1,152 @@
1
+ /** Sentinel value indicating an unassigned parameter. */
2
+ export declare const UNASSIGNED = 4294967295;
3
+ /** Result of evaluating a constraint against a partial assignment. */
4
+ export declare enum ConstraintResult {
5
+ True = "true",
6
+ False = "false",
7
+ Unknown = "unknown"
8
+ }
9
+ /** Base interface for constraint AST nodes. */
10
+ export interface ConstraintNode {
11
+ /** Evaluate this constraint against a (possibly partial) assignment. */
12
+ evaluate(assignment: number[]): ConstraintResult;
13
+ }
14
+ /** Equality comparison: param_index == value_index. */
15
+ export declare class EqualsNode implements ConstraintNode {
16
+ readonly paramIndex: number;
17
+ readonly valueIndex: number;
18
+ constructor(paramIndex: number, valueIndex: number);
19
+ evaluate(assignment: number[]): ConstraintResult;
20
+ }
21
+ /** Inequality comparison: param_index != value_index. */
22
+ export declare class NotEqualsNode implements ConstraintNode {
23
+ readonly paramIndex: number;
24
+ readonly valueIndex: number;
25
+ constructor(paramIndex: number, valueIndex: number);
26
+ evaluate(assignment: number[]): ConstraintResult;
27
+ }
28
+ /** Logical AND of two sub-expressions. */
29
+ export declare class AndNode implements ConstraintNode {
30
+ private readonly left;
31
+ private readonly right;
32
+ constructor(left: ConstraintNode, right: ConstraintNode);
33
+ evaluate(assignment: number[]): ConstraintResult;
34
+ }
35
+ /** Logical OR of two sub-expressions. */
36
+ export declare class OrNode implements ConstraintNode {
37
+ private readonly left;
38
+ private readonly right;
39
+ constructor(left: ConstraintNode, right: ConstraintNode);
40
+ evaluate(assignment: number[]): ConstraintResult;
41
+ }
42
+ /** Logical NOT of a sub-expression. */
43
+ export declare class NotNode implements ConstraintNode {
44
+ private readonly child;
45
+ constructor(child: ConstraintNode);
46
+ evaluate(assignment: number[]): ConstraintResult;
47
+ }
48
+ /** Logical implication: antecedent IMPLIES consequent (= NOT antecedent OR consequent). */
49
+ export declare class ImpliesNode implements ConstraintNode {
50
+ private readonly antecedent;
51
+ private readonly consequent;
52
+ constructor(antecedent: ConstraintNode, consequent: ConstraintNode);
53
+ evaluate(assignment: number[]): ConstraintResult;
54
+ }
55
+ /**
56
+ * IF/THEN/ELSE ternary constraint.
57
+ *
58
+ * Three-valued evaluation:
59
+ * - condition=True -> evaluate then_branch
60
+ * - condition=False -> evaluate else_branch
61
+ * - condition=Unknown -> if both branches agree, use that; else Unknown
62
+ */
63
+ export declare class IfThenElseNode implements ConstraintNode {
64
+ private readonly condition;
65
+ private readonly thenBranch;
66
+ private readonly elseBranch;
67
+ constructor(condition: ConstraintNode, thenBranch: ConstraintNode, elseBranch: ConstraintNode);
68
+ evaluate(assignment: number[]): ConstraintResult;
69
+ }
70
+ /** Relational comparison operators. */
71
+ export declare enum RelOp {
72
+ Less = "<",
73
+ LessEqual = "<=",
74
+ Greater = ">",
75
+ GreaterEqual = ">="
76
+ }
77
+ /**
78
+ * Relational comparison of a parameter's numeric value against a literal or another parameter.
79
+ *
80
+ * Compares parameter values as numbers. If a value cannot be parsed as numeric,
81
+ * the result is False.
82
+ */
83
+ export declare class RelationalNode implements ConstraintNode {
84
+ private readonly leftParam;
85
+ private readonly op;
86
+ private readonly isParamComparison;
87
+ private readonly literal;
88
+ private readonly rightParam;
89
+ private readonly leftValues;
90
+ private readonly rightValues;
91
+ /** Compare a parameter value against a literal numeric value. */
92
+ static fromLiteral(paramIndex: number, op: RelOp, literal: number, paramValues: string[]): RelationalNode;
93
+ /** Compare two parameter values against each other. */
94
+ static fromParams(leftParam: number, op: RelOp, rightParam: number, leftValues: string[], rightValues: string[]): RelationalNode;
95
+ private constructor();
96
+ evaluate(assignment: number[]): ConstraintResult;
97
+ private compareValues;
98
+ }
99
+ /**
100
+ * IN-set membership test: param IN {val1, val2, ...}.
101
+ *
102
+ * Three-valued: unassigned -> Unknown, value in set -> True, else False.
103
+ */
104
+ export declare class InNode implements ConstraintNode {
105
+ private readonly paramIndex;
106
+ private readonly valueIndices;
107
+ constructor(paramIndex: number, valueIndices: number[]);
108
+ evaluate(assignment: number[]): ConstraintResult;
109
+ }
110
+ /**
111
+ * LIKE pattern matching: param LIKE pattern.
112
+ *
113
+ * Supports `*` (any string) and `?` (single character) wildcards.
114
+ * Matching results are precomputed at construction time for efficiency.
115
+ */
116
+ export declare class LikeNode implements ConstraintNode {
117
+ private readonly paramIndex;
118
+ private readonly matches;
119
+ constructor(paramIndex: number, pattern: string, paramValues: string[]);
120
+ evaluate(assignment: number[]): ConstraintResult;
121
+ }
122
+ /** Test whether a string matches a glob pattern (* and ?). */
123
+ export declare function globMatch(pattern: string, text: string): boolean;
124
+ /**
125
+ * Parameter-to-parameter equality comparison.
126
+ *
127
+ * Compares the string values of two parameters. Equal if the string
128
+ * representations are identical.
129
+ */
130
+ export declare class ParamEqualsNode implements ConstraintNode {
131
+ private readonly leftParam;
132
+ private readonly rightParam;
133
+ private readonly leftValues;
134
+ private readonly rightValues;
135
+ constructor(leftParam: number, rightParam: number, leftValues: string[], rightValues: string[]);
136
+ evaluate(assignment: number[]): ConstraintResult;
137
+ }
138
+ /**
139
+ * Parameter-to-parameter inequality comparison.
140
+ *
141
+ * Compares the string values of two parameters. Not equal if the string
142
+ * representations differ.
143
+ */
144
+ export declare class ParamNotEqualsNode implements ConstraintNode {
145
+ private readonly leftParam;
146
+ private readonly rightParam;
147
+ private readonly leftValues;
148
+ private readonly rightValues;
149
+ constructor(leftParam: number, rightParam: number, leftValues: string[], rightValues: string[]);
150
+ evaluate(assignment: number[]): ConstraintResult;
151
+ }
152
+ //# sourceMappingURL=constraint-ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-ast.d.ts","sourceRoot":"","sources":["../../../../src/ts/model/constraint-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,384 @@
1
+ /// AST-based constraint representation for combinatorial test generation.
2
+ /** Sentinel value indicating an unassigned parameter. */
3
+ export const UNASSIGNED = 0xffffffff;
4
+ /** Result of evaluating a constraint against a partial assignment. */
5
+ export var ConstraintResult;
6
+ (function (ConstraintResult) {
7
+ ConstraintResult["True"] = "true";
8
+ ConstraintResult["False"] = "false";
9
+ ConstraintResult["Unknown"] = "unknown";
10
+ })(ConstraintResult || (ConstraintResult = {}));
11
+ /** Check if a string can be parsed as a finite number. */
12
+ function isNumeric(s) {
13
+ if (s.length === 0) {
14
+ return false;
15
+ }
16
+ const n = Number(s);
17
+ return !Number.isNaN(n) && Number.isFinite(n);
18
+ }
19
+ /** Parse a string as a number. */
20
+ function toDouble(s) {
21
+ return Number(s);
22
+ }
23
+ /** Equality comparison: param_index == value_index. */
24
+ export class EqualsNode {
25
+ constructor(paramIndex, valueIndex) {
26
+ this.paramIndex = paramIndex;
27
+ this.valueIndex = valueIndex;
28
+ }
29
+ evaluate(assignment) {
30
+ if (this.paramIndex >= assignment.length) {
31
+ return ConstraintResult.Unknown;
32
+ }
33
+ const val = assignment[this.paramIndex];
34
+ if (val === UNASSIGNED) {
35
+ return ConstraintResult.Unknown;
36
+ }
37
+ return val === this.valueIndex ? ConstraintResult.True : ConstraintResult.False;
38
+ }
39
+ }
40
+ /** Inequality comparison: param_index != value_index. */
41
+ export class NotEqualsNode {
42
+ constructor(paramIndex, valueIndex) {
43
+ this.paramIndex = paramIndex;
44
+ this.valueIndex = valueIndex;
45
+ }
46
+ evaluate(assignment) {
47
+ if (this.paramIndex >= assignment.length) {
48
+ return ConstraintResult.Unknown;
49
+ }
50
+ const val = assignment[this.paramIndex];
51
+ if (val === UNASSIGNED) {
52
+ return ConstraintResult.Unknown;
53
+ }
54
+ return val !== this.valueIndex ? ConstraintResult.True : ConstraintResult.False;
55
+ }
56
+ }
57
+ /** Logical AND of two sub-expressions. */
58
+ export class AndNode {
59
+ constructor(left, right) {
60
+ this.left = left;
61
+ this.right = right;
62
+ }
63
+ evaluate(assignment) {
64
+ const l = this.left.evaluate(assignment);
65
+ if (l === ConstraintResult.False) {
66
+ return ConstraintResult.False;
67
+ }
68
+ const r = this.right.evaluate(assignment);
69
+ if (r === ConstraintResult.False) {
70
+ return ConstraintResult.False;
71
+ }
72
+ if (l === ConstraintResult.True && r === ConstraintResult.True) {
73
+ return ConstraintResult.True;
74
+ }
75
+ return ConstraintResult.Unknown;
76
+ }
77
+ }
78
+ /** Logical OR of two sub-expressions. */
79
+ export class OrNode {
80
+ constructor(left, right) {
81
+ this.left = left;
82
+ this.right = right;
83
+ }
84
+ evaluate(assignment) {
85
+ const l = this.left.evaluate(assignment);
86
+ if (l === ConstraintResult.True) {
87
+ return ConstraintResult.True;
88
+ }
89
+ const r = this.right.evaluate(assignment);
90
+ if (r === ConstraintResult.True) {
91
+ return ConstraintResult.True;
92
+ }
93
+ if (l === ConstraintResult.False && r === ConstraintResult.False) {
94
+ return ConstraintResult.False;
95
+ }
96
+ return ConstraintResult.Unknown;
97
+ }
98
+ }
99
+ /** Logical NOT of a sub-expression. */
100
+ export class NotNode {
101
+ constructor(child) {
102
+ this.child = child;
103
+ }
104
+ evaluate(assignment) {
105
+ const c = this.child.evaluate(assignment);
106
+ if (c === ConstraintResult.True) {
107
+ return ConstraintResult.False;
108
+ }
109
+ if (c === ConstraintResult.False) {
110
+ return ConstraintResult.True;
111
+ }
112
+ return ConstraintResult.Unknown;
113
+ }
114
+ }
115
+ /** Logical implication: antecedent IMPLIES consequent (= NOT antecedent OR consequent). */
116
+ export class ImpliesNode {
117
+ constructor(antecedent, consequent) {
118
+ this.antecedent = antecedent;
119
+ this.consequent = consequent;
120
+ }
121
+ evaluate(assignment) {
122
+ const ante = this.antecedent.evaluate(assignment);
123
+ if (ante === ConstraintResult.False) {
124
+ return ConstraintResult.True;
125
+ }
126
+ const cons = this.consequent.evaluate(assignment);
127
+ if (ante === ConstraintResult.True) {
128
+ return cons;
129
+ }
130
+ // ante is Unknown
131
+ if (cons === ConstraintResult.True) {
132
+ return ConstraintResult.True;
133
+ }
134
+ return ConstraintResult.Unknown;
135
+ }
136
+ }
137
+ /**
138
+ * IF/THEN/ELSE ternary constraint.
139
+ *
140
+ * Three-valued evaluation:
141
+ * - condition=True -> evaluate then_branch
142
+ * - condition=False -> evaluate else_branch
143
+ * - condition=Unknown -> if both branches agree, use that; else Unknown
144
+ */
145
+ export class IfThenElseNode {
146
+ constructor(condition, thenBranch, elseBranch) {
147
+ this.condition = condition;
148
+ this.thenBranch = thenBranch;
149
+ this.elseBranch = elseBranch;
150
+ }
151
+ evaluate(assignment) {
152
+ const cond = this.condition.evaluate(assignment);
153
+ if (cond === ConstraintResult.True) {
154
+ return this.thenBranch.evaluate(assignment);
155
+ }
156
+ if (cond === ConstraintResult.False) {
157
+ return this.elseBranch.evaluate(assignment);
158
+ }
159
+ // condition is Unknown: evaluate both branches
160
+ const thenResult = this.thenBranch.evaluate(assignment);
161
+ const elseResult = this.elseBranch.evaluate(assignment);
162
+ if (thenResult === elseResult) {
163
+ return thenResult;
164
+ }
165
+ return ConstraintResult.Unknown;
166
+ }
167
+ }
168
+ /** Relational comparison operators. */
169
+ export var RelOp;
170
+ (function (RelOp) {
171
+ RelOp["Less"] = "<";
172
+ RelOp["LessEqual"] = "<=";
173
+ RelOp["Greater"] = ">";
174
+ RelOp["GreaterEqual"] = ">=";
175
+ })(RelOp || (RelOp = {}));
176
+ /**
177
+ * Relational comparison of a parameter's numeric value against a literal or another parameter.
178
+ *
179
+ * Compares parameter values as numbers. If a value cannot be parsed as numeric,
180
+ * the result is False.
181
+ */
182
+ export class RelationalNode {
183
+ /** Compare a parameter value against a literal numeric value. */
184
+ static fromLiteral(paramIndex, op, literal, paramValues) {
185
+ return new RelationalNode(paramIndex, op, false, literal, 0, paramValues, []);
186
+ }
187
+ /** Compare two parameter values against each other. */
188
+ static fromParams(leftParam, op, rightParam, leftValues, rightValues) {
189
+ return new RelationalNode(leftParam, op, true, 0, rightParam, leftValues, rightValues);
190
+ }
191
+ constructor(leftParam, op, isParamComparison, literal, rightParam, leftValues, rightValues) {
192
+ this.leftParam = leftParam;
193
+ this.op = op;
194
+ this.isParamComparison = isParamComparison;
195
+ this.literal = literal;
196
+ this.rightParam = rightParam;
197
+ this.leftValues = leftValues;
198
+ this.rightValues = rightValues;
199
+ }
200
+ evaluate(assignment) {
201
+ if (this.leftParam >= assignment.length) {
202
+ return ConstraintResult.Unknown;
203
+ }
204
+ const leftVal = assignment[this.leftParam];
205
+ if (leftVal === UNASSIGNED) {
206
+ return ConstraintResult.Unknown;
207
+ }
208
+ if (leftVal >= this.leftValues.length || !isNumeric(this.leftValues[leftVal])) {
209
+ return ConstraintResult.False;
210
+ }
211
+ const leftNum = toDouble(this.leftValues[leftVal]);
212
+ if (this.isParamComparison) {
213
+ if (this.rightParam >= assignment.length) {
214
+ return ConstraintResult.Unknown;
215
+ }
216
+ const rightVal = assignment[this.rightParam];
217
+ if (rightVal === UNASSIGNED) {
218
+ return ConstraintResult.Unknown;
219
+ }
220
+ if (rightVal >= this.rightValues.length || !isNumeric(this.rightValues[rightVal])) {
221
+ return ConstraintResult.False;
222
+ }
223
+ const rightNum = toDouble(this.rightValues[rightVal]);
224
+ return this.compareValues(leftNum, rightNum) ? ConstraintResult.True : ConstraintResult.False;
225
+ }
226
+ return this.compareValues(leftNum, this.literal)
227
+ ? ConstraintResult.True
228
+ : ConstraintResult.False;
229
+ }
230
+ compareValues(left, right) {
231
+ switch (this.op) {
232
+ case RelOp.Less:
233
+ return left < right;
234
+ case RelOp.LessEqual:
235
+ return left <= right;
236
+ case RelOp.Greater:
237
+ return left > right;
238
+ case RelOp.GreaterEqual:
239
+ return left >= right;
240
+ }
241
+ }
242
+ }
243
+ /**
244
+ * IN-set membership test: param IN {val1, val2, ...}.
245
+ *
246
+ * Three-valued: unassigned -> Unknown, value in set -> True, else False.
247
+ */
248
+ export class InNode {
249
+ constructor(paramIndex, valueIndices) {
250
+ this.paramIndex = paramIndex;
251
+ this.valueIndices = valueIndices;
252
+ }
253
+ evaluate(assignment) {
254
+ if (this.paramIndex >= assignment.length) {
255
+ return ConstraintResult.Unknown;
256
+ }
257
+ const val = assignment[this.paramIndex];
258
+ if (val === UNASSIGNED) {
259
+ return ConstraintResult.Unknown;
260
+ }
261
+ for (const vi of this.valueIndices) {
262
+ if (val === vi) {
263
+ return ConstraintResult.True;
264
+ }
265
+ }
266
+ return ConstraintResult.False;
267
+ }
268
+ }
269
+ /**
270
+ * LIKE pattern matching: param LIKE pattern.
271
+ *
272
+ * Supports `*` (any string) and `?` (single character) wildcards.
273
+ * Matching results are precomputed at construction time for efficiency.
274
+ */
275
+ export class LikeNode {
276
+ constructor(paramIndex, pattern, paramValues) {
277
+ this.paramIndex = paramIndex;
278
+ this.matches = paramValues.map((v) => globMatch(pattern, v));
279
+ }
280
+ evaluate(assignment) {
281
+ if (this.paramIndex >= assignment.length) {
282
+ return ConstraintResult.Unknown;
283
+ }
284
+ const val = assignment[this.paramIndex];
285
+ if (val === UNASSIGNED) {
286
+ return ConstraintResult.Unknown;
287
+ }
288
+ if (val >= this.matches.length) {
289
+ return ConstraintResult.False;
290
+ }
291
+ return this.matches[val] ? ConstraintResult.True : ConstraintResult.False;
292
+ }
293
+ }
294
+ /** Test whether a string matches a glob pattern (* and ?). */
295
+ export function globMatch(pattern, text) {
296
+ let pi = 0;
297
+ let ti = 0;
298
+ let starPi = -1;
299
+ let starTi = 0;
300
+ while (ti < text.length) {
301
+ if (pi < pattern.length && (pattern[pi] === '?' || pattern[pi] === text[ti])) {
302
+ pi++;
303
+ ti++;
304
+ }
305
+ else if (pi < pattern.length && pattern[pi] === '*') {
306
+ starPi = pi;
307
+ starTi = ti;
308
+ pi++;
309
+ }
310
+ else if (starPi !== -1) {
311
+ pi = starPi + 1;
312
+ starTi++;
313
+ ti = starTi;
314
+ }
315
+ else {
316
+ return false;
317
+ }
318
+ }
319
+ while (pi < pattern.length && pattern[pi] === '*') {
320
+ pi++;
321
+ }
322
+ return pi === pattern.length;
323
+ }
324
+ /**
325
+ * Parameter-to-parameter equality comparison.
326
+ *
327
+ * Compares the string values of two parameters. Equal if the string
328
+ * representations are identical.
329
+ */
330
+ export class ParamEqualsNode {
331
+ constructor(leftParam, rightParam, leftValues, rightValues) {
332
+ this.leftParam = leftParam;
333
+ this.rightParam = rightParam;
334
+ this.leftValues = leftValues;
335
+ this.rightValues = rightValues;
336
+ }
337
+ evaluate(assignment) {
338
+ if (this.leftParam >= assignment.length || this.rightParam >= assignment.length) {
339
+ return ConstraintResult.Unknown;
340
+ }
341
+ const lv = assignment[this.leftParam];
342
+ const rv = assignment[this.rightParam];
343
+ if (lv === UNASSIGNED || rv === UNASSIGNED) {
344
+ return ConstraintResult.Unknown;
345
+ }
346
+ if (lv >= this.leftValues.length || rv >= this.rightValues.length) {
347
+ return ConstraintResult.False;
348
+ }
349
+ return this.leftValues[lv] === this.rightValues[rv]
350
+ ? ConstraintResult.True
351
+ : ConstraintResult.False;
352
+ }
353
+ }
354
+ /**
355
+ * Parameter-to-parameter inequality comparison.
356
+ *
357
+ * Compares the string values of two parameters. Not equal if the string
358
+ * representations differ.
359
+ */
360
+ export class ParamNotEqualsNode {
361
+ constructor(leftParam, rightParam, leftValues, rightValues) {
362
+ this.leftParam = leftParam;
363
+ this.rightParam = rightParam;
364
+ this.leftValues = leftValues;
365
+ this.rightValues = rightValues;
366
+ }
367
+ evaluate(assignment) {
368
+ if (this.leftParam >= assignment.length || this.rightParam >= assignment.length) {
369
+ return ConstraintResult.Unknown;
370
+ }
371
+ const lv = assignment[this.leftParam];
372
+ const rv = assignment[this.rightParam];
373
+ if (lv === UNASSIGNED || rv === UNASSIGNED) {
374
+ return ConstraintResult.Unknown;
375
+ }
376
+ if (lv >= this.leftValues.length || rv >= this.rightValues.length) {
377
+ return ConstraintResult.False;
378
+ }
379
+ return this.leftValues[lv] !== this.rightValues[rv]
380
+ ? ConstraintResult.True
381
+ : ConstraintResult.False;
382
+ }
383
+ }
384
+ //# sourceMappingURL=constraint-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-ast.js","sourceRoot":"","sources":["../../../../src/ts/model/constraint-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type ConstraintNode } from './constraint-ast.js';
2
+ import { type ErrorInfo } from './error.js';
3
+ /** Minimal parameter interface required by the constraint parser. */
4
+ export interface Parameter {
5
+ name: string;
6
+ values: string[];
7
+ /** Find a value index by name, checking both primary values and aliases. */
8
+ findValueIndex(name: string, caseSensitive: boolean): number;
9
+ }
10
+ /** Result of parsing a constraint expression. */
11
+ export interface ParseResult {
12
+ constraint: ConstraintNode | null;
13
+ error: ErrorInfo;
14
+ }
15
+ /** Options controlling constraint parsing behavior. */
16
+ export interface ParseOptions {
17
+ /**
18
+ * When false (default), parameter and value name resolution
19
+ * is case-insensitive. When true, exact match is required.
20
+ */
21
+ caseSensitive: boolean;
22
+ }
23
+ /**
24
+ * Parse a human-readable constraint expression into an AST.
25
+ *
26
+ * Supported syntax examples:
27
+ * "IF os=mac THEN browser!=ie"
28
+ * "IF os=mac THEN browser!=ie ELSE arch!=arm"
29
+ * "NOT (os=win AND browser=safari)"
30
+ * "os=linux IMPLIES arch!=arm"
31
+ * "os=win OR browser=chrome"
32
+ * "NOT os=linux"
33
+ * "version > 3"
34
+ * "env IN {staging, prod}"
35
+ * "browser LIKE chrome*"
36
+ * "start_date < end_date" (parameter-to-parameter comparison)
37
+ *
38
+ * Keywords (case-insensitive): IF, THEN, ELSE, IMPLIES, AND, OR, NOT, IN, LIKE
39
+ * Operators: = != > >= < <=
40
+ * Parentheses: ( )
41
+ * Set literals: { value1, value2, ... }
42
+ *
43
+ * @param expression The constraint string to parse.
44
+ * @param params The parameter definitions (used to resolve names to indices).
45
+ * @param options Parsing options (e.g., case sensitivity). Defaults to case-insensitive.
46
+ * @returns ParseResult with the AST on success, or an error on failure.
47
+ */
48
+ export declare function parseConstraint(expression: string, params: Parameter[], options?: ParseOptions): ParseResult;
49
+ //# sourceMappingURL=constraint-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-parser.d.ts","sourceRoot":"","sources":["../../../../src/ts/model/constraint-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EAapB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAa,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AAEhE,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4EAA4E;IAC5E,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9D;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAs8BD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,GAAE,YAAuC,GAC/C,WAAW,CAmBb"}