@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.
- package/LICENSE +191 -0
- package/README.md +119 -0
- package/README.npm.md +119 -0
- package/dist/coverwise.js +2 -0
- package/dist/coverwise.wasm +0 -0
- package/dist/js/constraint.d.ts +78 -0
- package/dist/js/constraint.d.ts.map +1 -0
- package/dist/js/constraint.js +213 -0
- package/dist/js/constraint.js.map +1 -0
- package/dist/js/index.d.ts +94 -0
- package/dist/js/index.d.ts.map +1 -0
- package/dist/js/index.js +164 -0
- package/dist/js/index.js.map +1 -0
- package/dist/js/pure/adapter.d.ts +40 -0
- package/dist/js/pure/adapter.d.ts.map +1 -0
- package/dist/js/pure/adapter.js +207 -0
- package/dist/js/pure/adapter.js.map +1 -0
- package/dist/js/pure/index.d.ts +83 -0
- package/dist/js/pure/index.d.ts.map +1 -0
- package/dist/js/pure/index.js +132 -0
- package/dist/js/pure/index.js.map +1 -0
- package/dist/js/types.d.ts +132 -0
- package/dist/js/types.d.ts.map +1 -0
- package/dist/js/types.js +3 -0
- package/dist/js/types.js.map +1 -0
- package/dist/src/ts/algo/greedy.d.ts +9 -0
- package/dist/src/ts/algo/greedy.d.ts.map +1 -0
- package/dist/src/ts/algo/greedy.js +137 -0
- package/dist/src/ts/algo/greedy.js.map +1 -0
- package/dist/src/ts/algo/index.d.ts +2 -0
- package/dist/src/ts/algo/index.d.ts.map +1 -0
- package/dist/src/ts/algo/index.js +2 -0
- package/dist/src/ts/algo/index.js.map +1 -0
- package/dist/src/ts/core/coverage-engine.d.ts +40 -0
- package/dist/src/ts/core/coverage-engine.d.ts.map +1 -0
- package/dist/src/ts/core/coverage-engine.js +366 -0
- package/dist/src/ts/core/coverage-engine.js.map +1 -0
- package/dist/src/ts/core/generator.d.ts +6 -0
- package/dist/src/ts/core/generator.d.ts.map +1 -0
- package/dist/src/ts/core/generator.js +394 -0
- package/dist/src/ts/core/generator.js.map +1 -0
- package/dist/src/ts/core/index.d.ts +3 -0
- package/dist/src/ts/core/index.d.ts.map +1 -0
- package/dist/src/ts/core/index.js +3 -0
- package/dist/src/ts/core/index.js.map +1 -0
- package/dist/src/ts/model/boundary.d.ts +29 -0
- package/dist/src/ts/model/boundary.d.ts.map +1 -0
- package/dist/src/ts/model/boundary.js +102 -0
- package/dist/src/ts/model/boundary.js.map +1 -0
- package/dist/src/ts/model/constraint-ast.d.ts +152 -0
- package/dist/src/ts/model/constraint-ast.d.ts.map +1 -0
- package/dist/src/ts/model/constraint-ast.js +384 -0
- package/dist/src/ts/model/constraint-ast.js.map +1 -0
- package/dist/src/ts/model/constraint-parser.d.ts +49 -0
- package/dist/src/ts/model/constraint-parser.d.ts.map +1 -0
- package/dist/src/ts/model/constraint-parser.js +831 -0
- package/dist/src/ts/model/constraint-parser.js.map +1 -0
- package/dist/src/ts/model/error.d.ts +19 -0
- package/dist/src/ts/model/error.d.ts.map +1 -0
- package/dist/src/ts/model/error.js +19 -0
- package/dist/src/ts/model/error.js.map +1 -0
- package/dist/src/ts/model/generate-options.d.ts +82 -0
- package/dist/src/ts/model/generate-options.d.ts.map +1 -0
- package/dist/src/ts/model/generate-options.js +52 -0
- package/dist/src/ts/model/generate-options.js.map +1 -0
- package/dist/src/ts/model/index.d.ts +6 -0
- package/dist/src/ts/model/index.d.ts.map +1 -0
- package/dist/src/ts/model/index.js +6 -0
- package/dist/src/ts/model/index.js.map +1 -0
- package/dist/src/ts/model/parameter.d.ts +65 -0
- package/dist/src/ts/model/parameter.d.ts.map +1 -0
- package/dist/src/ts/model/parameter.js +157 -0
- package/dist/src/ts/model/parameter.js.map +1 -0
- package/dist/src/ts/model/test-case.d.ts +67 -0
- package/dist/src/ts/model/test-case.d.ts.map +1 -0
- package/dist/src/ts/model/test-case.js +28 -0
- package/dist/src/ts/model/test-case.js.map +1 -0
- package/dist/src/ts/util/bitset.d.ts +14 -0
- package/dist/src/ts/util/bitset.d.ts.map +1 -0
- package/dist/src/ts/util/bitset.js +66 -0
- package/dist/src/ts/util/bitset.js.map +1 -0
- package/dist/src/ts/util/combinatorics.d.ts +4 -0
- package/dist/src/ts/util/combinatorics.d.ts.map +1 -0
- package/dist/src/ts/util/combinatorics.js +60 -0
- package/dist/src/ts/util/combinatorics.js.map +1 -0
- package/dist/src/ts/util/index.d.ts +5 -0
- package/dist/src/ts/util/index.d.ts.map +1 -0
- package/dist/src/ts/util/index.js +7 -0
- package/dist/src/ts/util/index.js.map +1 -0
- package/dist/src/ts/util/rng.d.ts +13 -0
- package/dist/src/ts/util/rng.d.ts.map +1 -0
- package/dist/src/ts/util/rng.js +112 -0
- package/dist/src/ts/util/rng.js.map +1 -0
- package/dist/src/ts/util/string_util.d.ts +3 -0
- package/dist/src/ts/util/string_util.d.ts.map +1 -0
- package/dist/src/ts/util/string_util.js +25 -0
- package/dist/src/ts/util/string_util.js.map +1 -0
- package/dist/src/ts/validator/constraint-validator.d.ts +34 -0
- package/dist/src/ts/validator/constraint-validator.d.ts.map +1 -0
- package/dist/src/ts/validator/constraint-validator.js +51 -0
- package/dist/src/ts/validator/constraint-validator.js.map +1 -0
- package/dist/src/ts/validator/coverage-validator.d.ts +42 -0
- package/dist/src/ts/validator/coverage-validator.d.ts.map +1 -0
- package/dist/src/ts/validator/coverage-validator.js +230 -0
- package/dist/src/ts/validator/coverage-validator.js.map +1 -0
- package/dist/src/ts/validator/index.d.ts +3 -0
- package/dist/src/ts/validator/index.d.ts.map +1 -0
- package/dist/src/ts/validator/index.js +3 -0
- package/dist/src/ts/validator/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/// Independent coverage validation (does NOT depend on generator/core).
|
|
2
|
+
/**
|
|
3
|
+
* Generate all C(n, k) combinations of indices [0, n).
|
|
4
|
+
* @returns Array of sorted index arrays. Empty if k == 0 or k > n.
|
|
5
|
+
*/
|
|
6
|
+
function generateCombinations(n, k) {
|
|
7
|
+
if (k === 0 || k > n) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const result = [];
|
|
11
|
+
const combo = new Array(k);
|
|
12
|
+
function recurse(start, depth) {
|
|
13
|
+
if (depth === k) {
|
|
14
|
+
result.push(combo.slice());
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
for (let i = start; i < n; ++i) {
|
|
18
|
+
combo[depth] = i;
|
|
19
|
+
recurse(i + 1, depth + 1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
recurse(0, 0);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a test case covers a specific value tuple for given parameter indices.
|
|
27
|
+
*/
|
|
28
|
+
function testCovers(test, paramIndices, valueIndices) {
|
|
29
|
+
for (let i = 0; i < paramIndices.length; ++i) {
|
|
30
|
+
const pi = paramIndices[i];
|
|
31
|
+
if (pi >= test.values.length || test.values[pi] !== valueIndices[i]) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Independently validate t-wise coverage of a test suite.
|
|
39
|
+
*
|
|
40
|
+
* This validator enumerates all t-tuples from scratch (not using any
|
|
41
|
+
* generator internals) and checks each against the test suite.
|
|
42
|
+
*/
|
|
43
|
+
export function validateCoverage(params, tests, strength) {
|
|
44
|
+
const report = {
|
|
45
|
+
totalTuples: 0,
|
|
46
|
+
coveredTuples: 0,
|
|
47
|
+
coverageRatio: 0,
|
|
48
|
+
uncovered: [],
|
|
49
|
+
};
|
|
50
|
+
const n = params.length;
|
|
51
|
+
// Edge case: strength is 0 or exceeds parameter count.
|
|
52
|
+
// Vacuous coverage: nothing to cover means everything is covered.
|
|
53
|
+
if (strength === 0 || strength > n) {
|
|
54
|
+
report.coverageRatio = 1.0;
|
|
55
|
+
return report;
|
|
56
|
+
}
|
|
57
|
+
// Step 1: Generate all C(n, strength) combinations of parameter indices.
|
|
58
|
+
const combinations = generateCombinations(n, strength);
|
|
59
|
+
for (const combo of combinations) {
|
|
60
|
+
// Step 2: Enumerate all value tuples (cartesian product) for this combination.
|
|
61
|
+
let numTuples = 1;
|
|
62
|
+
for (const pi of combo) {
|
|
63
|
+
numTuples *= params[pi].size;
|
|
64
|
+
}
|
|
65
|
+
// Iterate over all value tuples using a flat index.
|
|
66
|
+
for (let flat = 0; flat < numTuples; ++flat) {
|
|
67
|
+
// Decode flat index into value indices (mixed-radix decomposition).
|
|
68
|
+
const valueIndices = new Array(strength);
|
|
69
|
+
let remainder = flat;
|
|
70
|
+
for (let i = strength - 1; i >= 0; --i) {
|
|
71
|
+
const radix = params[combo[i]].size;
|
|
72
|
+
valueIndices[i] = remainder % radix;
|
|
73
|
+
remainder = Math.trunc(remainder / radix);
|
|
74
|
+
}
|
|
75
|
+
++report.totalTuples;
|
|
76
|
+
// Step 3: Check if any test case covers this value tuple.
|
|
77
|
+
let covered = false;
|
|
78
|
+
for (const test of tests) {
|
|
79
|
+
if (testCovers(test, combo, valueIndices)) {
|
|
80
|
+
covered = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (covered) {
|
|
85
|
+
++report.coveredTuples;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Build the UncoveredTuple with human-readable strings.
|
|
89
|
+
const tuple = [];
|
|
90
|
+
const paramNames = [];
|
|
91
|
+
for (let i = 0; i < strength; ++i) {
|
|
92
|
+
const pi = combo[i];
|
|
93
|
+
const vi = valueIndices[i];
|
|
94
|
+
paramNames.push(params[pi].name);
|
|
95
|
+
tuple.push(`${params[pi].name}=${params[pi].values[vi]}`);
|
|
96
|
+
}
|
|
97
|
+
report.uncovered.push({
|
|
98
|
+
tuple,
|
|
99
|
+
params: paramNames,
|
|
100
|
+
reason: 'never covered',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Compute coverage ratio. When there are no tuples, coverage is vacuously 1.0.
|
|
106
|
+
if (report.totalTuples === 0) {
|
|
107
|
+
report.coverageRatio = 1.0;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
report.coverageRatio = report.coveredTuples / report.totalTuples;
|
|
111
|
+
}
|
|
112
|
+
return report;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Compute equivalence class coverage for a test suite.
|
|
116
|
+
*
|
|
117
|
+
* Maps each value to its equivalence class and enumerates all t-wise class
|
|
118
|
+
* tuples, counting how many are covered by the test suite.
|
|
119
|
+
* Only considers parameters that have equivalence classes defined.
|
|
120
|
+
* @returns Class coverage report. If no parameters have classes, returns all zeros.
|
|
121
|
+
*/
|
|
122
|
+
export function computeClassCoverage(params, tests, strength) {
|
|
123
|
+
const report = {
|
|
124
|
+
totalClassTuples: 0,
|
|
125
|
+
coveredClassTuples: 0,
|
|
126
|
+
coverageRatio: 0,
|
|
127
|
+
};
|
|
128
|
+
const n = params.length;
|
|
129
|
+
if (strength === 0 || strength > n) {
|
|
130
|
+
return report;
|
|
131
|
+
}
|
|
132
|
+
// Identify parameters that have equivalence classes.
|
|
133
|
+
const classParams = [];
|
|
134
|
+
for (let i = 0; i < n; ++i) {
|
|
135
|
+
if (params[i].hasEquivalenceClasses) {
|
|
136
|
+
classParams.push(i);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (classParams.length === 0) {
|
|
140
|
+
return report;
|
|
141
|
+
}
|
|
142
|
+
// For class coverage we consider combinations of parameters that have classes.
|
|
143
|
+
// If fewer parameters have classes than the strength, use the available count.
|
|
144
|
+
const classN = classParams.length;
|
|
145
|
+
const effectiveStrength = Math.min(strength, classN);
|
|
146
|
+
// Generate all C(classN, effectiveStrength) combinations of class-enabled parameters.
|
|
147
|
+
const combinations = generateCombinations(classN, effectiveStrength);
|
|
148
|
+
// For each combination, enumerate all class tuples (cartesian product of unique classes).
|
|
149
|
+
for (const combo of combinations) {
|
|
150
|
+
// Get the unique classes for each parameter in this combination.
|
|
151
|
+
const classesPerParam = [];
|
|
152
|
+
for (const idx of combo) {
|
|
153
|
+
classesPerParam.push(params[classParams[idx]].uniqueClasses());
|
|
154
|
+
}
|
|
155
|
+
// Compute the number of class tuples for this combination.
|
|
156
|
+
let numTuples = 1;
|
|
157
|
+
for (const cls of classesPerParam) {
|
|
158
|
+
numTuples *= cls.length;
|
|
159
|
+
}
|
|
160
|
+
// Enumerate all class tuples and check coverage.
|
|
161
|
+
for (let flat = 0; flat < numTuples; ++flat) {
|
|
162
|
+
// Decode flat index into class indices.
|
|
163
|
+
const classIndices = new Array(effectiveStrength);
|
|
164
|
+
let remainder = flat;
|
|
165
|
+
for (let i = effectiveStrength - 1; i >= 0; --i) {
|
|
166
|
+
const radix = classesPerParam[i].length;
|
|
167
|
+
classIndices[i] = remainder % radix;
|
|
168
|
+
remainder = Math.trunc(remainder / radix);
|
|
169
|
+
}
|
|
170
|
+
++report.totalClassTuples;
|
|
171
|
+
// Check if any test case covers this class tuple.
|
|
172
|
+
let covered = false;
|
|
173
|
+
for (const test of tests) {
|
|
174
|
+
let matches = true;
|
|
175
|
+
for (let k = 0; k < effectiveStrength; ++k) {
|
|
176
|
+
const pi = classParams[combo[k]];
|
|
177
|
+
if (pi >= test.values.length) {
|
|
178
|
+
matches = false;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
const vi = test.values[pi];
|
|
182
|
+
const testClass = params[pi].equivalenceClass(vi);
|
|
183
|
+
if (testClass !== classesPerParam[k][classIndices[k]]) {
|
|
184
|
+
matches = false;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (matches) {
|
|
189
|
+
covered = true;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (covered) {
|
|
194
|
+
++report.coveredClassTuples;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (report.totalClassTuples > 0) {
|
|
199
|
+
report.coverageRatio = report.coveredClassTuples / report.totalClassTuples;
|
|
200
|
+
}
|
|
201
|
+
return report;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Annotate a GenerateResult with equivalence class coverage if applicable.
|
|
205
|
+
*
|
|
206
|
+
* Checks whether any parameter has equivalence classes defined. If so,
|
|
207
|
+
* computes class coverage and sets the classCoverage field on the result.
|
|
208
|
+
* @param result The generate result to annotate (modified in place).
|
|
209
|
+
* @param params The parameter definitions (with equivalence classes).
|
|
210
|
+
* @param strength The coverage strength used for generation.
|
|
211
|
+
*/
|
|
212
|
+
export function annotateClassCoverage(result, params, strength) {
|
|
213
|
+
let hasEqClasses = false;
|
|
214
|
+
for (const p of params) {
|
|
215
|
+
if (p.hasEquivalenceClasses) {
|
|
216
|
+
hasEqClasses = true;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (!hasEqClasses) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const classReport = computeClassCoverage(params, result.tests, strength);
|
|
224
|
+
result.classCoverage = {
|
|
225
|
+
totalClassTuples: classReport.totalClassTuples,
|
|
226
|
+
coveredClassTuples: classReport.coveredClassTuples,
|
|
227
|
+
classCoverageRatio: classReport.coverageRatio,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=coverage-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-validator.js","sourceRoot":"","sources":["../../../../src/ts/validator/coverage-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type ConstraintReport, type ConstraintViolation, validateConstraintReport, validateConstraints, } from './constraint-validator.js';
|
|
2
|
+
export { annotateClassCoverage, type ClassCoverageReport, type CoverageReport, computeClassCoverage, validateCoverage, } from './coverage-validator.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ts/validator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ts/validator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,qBAAqB,EAGrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@libraz/coverwise",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"packageManager": "yarn@4.12.0",
|
|
6
|
+
"description": "Combinatorial test coverage engine — analyze, generate, and extend t-wise test suites via WASM",
|
|
7
|
+
"main": "dist/js/index.js",
|
|
8
|
+
"types": "dist/js/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/js/index.d.ts",
|
|
12
|
+
"import": "./dist/js/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./pure": {
|
|
15
|
+
"types": "./dist/js/pure/index.d.ts",
|
|
16
|
+
"import": "./dist/js/pure/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./wasm": "./dist/coverwise.wasm",
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"scripts": {
|
|
26
|
+
"prepare": "test -z \"$npm_config_production\" && simple-git-hooks || true",
|
|
27
|
+
"build": "yarn build:wasm && yarn build:js",
|
|
28
|
+
"build:wasm": "emcmake cmake -B build-wasm -DBUILD_WASM=ON -DCMAKE_BUILD_TYPE=Release && cmake --build build-wasm -j",
|
|
29
|
+
"build:js": "tsc",
|
|
30
|
+
"clean": "rm -rf dist build-wasm",
|
|
31
|
+
"lint": "biome check js/ tests/wasm/ src/ts/",
|
|
32
|
+
"lint:fix": "biome check --write js/ tests/wasm/",
|
|
33
|
+
"format": "biome format --write js/ tests/wasm/",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"prepack": "cp README.md /tmp/coverwise-readme-bak && cp README.npm.md README.md",
|
|
37
|
+
"postpack": "mv /tmp/coverwise-readme-bak README.md",
|
|
38
|
+
"prepublishOnly": "yarn clean && yarn build && yarn lint && yarn test"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"combinatorial",
|
|
42
|
+
"pairwise",
|
|
43
|
+
"testing",
|
|
44
|
+
"t-wise",
|
|
45
|
+
"covering-array",
|
|
46
|
+
"test-generation",
|
|
47
|
+
"wasm",
|
|
48
|
+
"webassembly"
|
|
49
|
+
],
|
|
50
|
+
"author": "libraz <libraz@libraz.net>",
|
|
51
|
+
"license": "Apache-2.0",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://github.com/libraz/coverwise.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/libraz/coverwise/issues"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/libraz/coverwise#readme",
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@biomejs/biome": "^2.3.10",
|
|
65
|
+
"lint-staged": "^16.2.7",
|
|
66
|
+
"simple-git-hooks": "^2.13.1",
|
|
67
|
+
"typescript": "^5.0.0",
|
|
68
|
+
"vitest": "^4.0.16"
|
|
69
|
+
},
|
|
70
|
+
"volta": {
|
|
71
|
+
"node": "22.21.1",
|
|
72
|
+
"yarn": "4.12.0"
|
|
73
|
+
},
|
|
74
|
+
"simple-git-hooks": {
|
|
75
|
+
"pre-commit": "yarn lint-staged"
|
|
76
|
+
},
|
|
77
|
+
"lint-staged": {
|
|
78
|
+
"{js,tests/wasm}/**/*.{ts,js}": [
|
|
79
|
+
"biome check --write"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|